Quellcode durchsuchen

Improving script, functioning bot

JoostSijm vor 5 Jahren
Ursprung
Commit
79c9c678cd
2 geänderte Dateien mit 55 neuen und 70 gelöschten Zeilen
  1. 21 16
      app/__main__.py
  2. 34 54
      app/database.py

+ 21 - 16
app/__main__.py

@@ -7,7 +7,6 @@ import time
 # libraries and data
 import matplotlib.pyplot as plt
 import matplotlib.dates as mdates
-import numpy as np
 import pandas as pd
 
 from pandas.plotting import register_matplotlib_converters
@@ -66,19 +65,18 @@ def add_check_resources(state_id, capital_id, resource_id, do_refill, minute):
 
 def job_send_telegram_update(state_id, group_id, resource_type):
     """Send telegram update"""
-    data = get_work_percentage(state_id, resource_type, datetime.utcnow(), 1, 3)
-    print(data)
-    exit()
+    message = get_work_percentage(state_id, resource_type, datetime.utcnow(), 1, 1)
+    print(message)
     TELEGRAM_BOT.sendMessage(
-        chat_id=group_id, 
-        text='*test*',
+        chat_id=group_id,
+        text='```\n{}```'.format(message),
         parse_mode=ParseMode.MARKDOWN
     )
 
 
 def graph():
     """make graph"""
-    date = datetime.now()# - timedelta(1)
+    date = datetime.now() + timedelta(1)
     region_4001 = get_resources(4001, date, 0)
     region_4002 = get_resources(4002, date, 0)
     region_4003 = get_resources(4003, date, 0)
@@ -103,8 +101,8 @@ def graph():
     fig, ax = plt.subplots()
     ax.xaxis.set_major_formatter(major_fmt)
     fig.autofmt_xdate()
-    end_date_time = date.replace(hour=20, minute=0, second=0, microsecond=0)
-    start_date_time = end_date_time - timedelta(hours=26)
+    end_date_time = date.replace(hour=19, minute=0, second=0, microsecond=0)
+    start_date_time = end_date_time - timedelta(hours=24)
     ax.set_xlim([start_date_time, end_date_time])
     ax.set_ylim([0, 2500])
 
@@ -149,17 +147,24 @@ if __name__ == '__main__':
     # job_check_resources(2788, 4002, 0, False) # VN
     # job_check_resources(2620, 4002, 0, False) # Zeelandiae
     # graph()
-    job_send_telegram_update(2788, '@vn_resources', 0)
     # get_resources(4001, datetime.now(), 0)
-    exit()
 
     # VN
-    # add_check_resources(2788, 4008, 0, True, '0,15,30,45')
-    # add_check_resources(2788, 4008, 11, True, '0')
+    add_check_resources(2788, 4008, 0, True, '0,15,30,45')
+    add_check_resources(2788, 4008, 11, True, '0')
     # Zeelandiae
-    # add_check_resources(2620, 0, 0, False, '50')
+    add_check_resources(2620, 0, 0, False, '50')
     # Belgium
-    # add_check_resources(2604, 0, 0, False, '40')
+    add_check_resources(2604, 0, 0, False, '40')
+
+    SCHEDULER.add_job(
+        job_send_telegram_update,
+        'cron',
+        args=[2788, '@vn_resources', 0],
+        id='job_send_telegram_update',
+        replace_existing=True,
+        minute='5'
+    )
 
     try:
         while True:
@@ -167,4 +172,4 @@ if __name__ == '__main__':
     except KeyboardInterrupt:
         LOGGER.info('Exiting application')
         SCHEDULER.shutdown()
-        exit
+        exit()

+ 34 - 54
app/database.py

@@ -2,16 +2,11 @@
 
 from datetime import datetime, timedelta, timezone
 
-from sqlalchemy import or_, and_
 from sqlalchemy.orm import joinedload
 
 from app import SESSION
 from app.models import ResourceTrack, ResourceStat, Region
 
-import pprint
-
-
-print = pprint.PrettyPrinter().pprint
 
 def save_resources(state_id, regions, resource_id):
     """Save resources to database"""
@@ -73,18 +68,6 @@ def get_resources(region_id, date, resource_type):
     return new_resource
 
 
-def get_state_regions(state_id):
-    """Get regions from state"""
-    session = SESSION()
-    state_regions = session.query(StateRegion) \
-        .filter(and_(StateRegion.state_id == state_id, StateRegion.until_date_time == None)) \
-        .all()
-    regions = []
-    for state_region in state_regions:
-        regions.append(state_region.region)
-    session.close()
-    return regions
-
 def _get_state_stat(session, state_id, resource_type, date_time):
     """Get state stats from date"""
     ten_minutes = timedelta(minutes=10)
@@ -104,11 +87,6 @@ def _get_state_stat(session, state_id, resource_type, date_time):
 def get_work_percentage(state_id, resource_type, end_date_time, hours, times):
     """Get work percentage for state in last x hours"""
     end_date_time = end_date_time.replace(minute=0, second=0, microsecond=0)
-    reset_date_time = end_date_time
-    if reset_date_time.hour >= 18:
-        reset_date_time = reset_date_time.replace(hour=18) + timedelta(1)
-    else:
-        reset_date_time = reset_date_time.replace(hour=18)
 
     session = SESSION()
     data = {
@@ -125,44 +103,46 @@ def get_work_percentage(state_id, resource_type, end_date_time, hours, times):
         }
     session.close()
 
-    print(data)
+    regions = {}
+    for region_id, stat in data[0]['stats'].items():
+        regions[region_id] = stat.region.name
 
     for i in range(0, times):
         data[i]['progress'] = {}
-        time_left = reset_date_time - data[i+1]['date']
-        print('{} time left: {} uur'.format(data[i]['date'], time_left.seconds // 3600))
+        reset_date_time = data[i+1]['date']
+        if reset_date_time.hour >= 18:
+            reset_date_time = reset_date_time.replace(hour=18) + timedelta(1)
+        else:
+            reset_date_time = reset_date_time.replace(hour=18)
+        time_left = reset_date_time - data[i]['date']
+        if time_left.seconds != 0:
+            seconds_left = time_left.seconds
+        else:
+            seconds_left = 86400
+        # print('{} time left: {} uur'.format(data[i]['date'], seconds_left // 60))
         for region_id, stat in data[i]['stats'].items():
-            mined = data[i+1]['stats'][stat.region_id].total() - stat.total()
-            required = stat.total() / (time_left.seconds / (hours * 3600))
-            percentage = mined / required * 100 - 100
-            print('{:4} left: {:3} mined: {:3} required: {:6.2f} percentage: {:6.2f}'.format(
-                stat.region_id, stat.total(), mined, required, percentage
-            ))
+            next_stat = data[i+1]['stats'][stat.region_id]
+            if seconds_left != 86400:
+                mined = next_stat.total() - stat.total()
+                required = next_stat.total() / (seconds_left / (hours * 3600))
+            else:
+                mined = 2500 + next_stat.explored - stat.total()
+                required = next_stat.total()
+            if required != 0:
+                percentage = (mined / required - 1) * 0.04 * next_stat.total()
+            else:
+                percentage = 0
+            # print('{:4} left: {:3} mined: {:3} required: {:6.2f} percentage: {:6.2f}'.format(
+            #     stat.region_id, next_stat.total(), mined, required, percentage
+            # ))
             data[i]['progress'][stat.region_id] = percentage
-        print('test')
 
+    message_text = ''
     for date in data.values():
-        # print(date)
-        print(' ')
         if 'progress' in date:
-            for region_id, progress in date['progress'].items():
-                print('{}: {:6.2f}'.format(
-                    region_id,
+            for region_id, progress in sorted(date['progress'].items(), key=lambda x: x[1]):
+                message_text += '{:21}: {:6.2f}\n'.format(
+                    regions[region_id],
                     progress
-                ))
-
-    exit()
-
-    for i, stats in data:
-        data[stat.region_id] = {
-            'name': stat.region.name,
-            'start_resource_left': stat.limit_left + stat.explored
-        }
-    for stat in end_resource_stats:
-        data[stat.region_id]['end_resources_left'] = stat.limit_left + stat.explored
-
-    for region_id, region in data.items():
-        print(region_id)
-        print(region)
-
-    return data
+                )
+    return message_text