Browse Source

Improve telegram resource update

JoostSijm 5 years ago
parent
commit
cfc999d8f6
4 changed files with 55 additions and 26 deletions
  1. 8 0
      app/__init__.py
  2. 14 2
      app/__main__.py
  3. 7 4
      app/app.py
  4. 26 20
      app/database.py

+ 8 - 0
app/__init__.py

@@ -74,3 +74,11 @@ RESOURCE_NAMES = {
     'uranium': 11,
     'diamond': 15,
 }
+
+RESOURCE_MAX = {
+    0: 2500,
+    3: 600,
+    4: 500,
+    11: 60,
+    15: 75,
+}

+ 14 - 2
app/__main__.py

@@ -12,7 +12,8 @@ if __name__ == '__main__':
     # jobs.check_resources(2620, 4002, 0, False) # Zeelandiae
     # app.graph()
     # get_resources(4001, datetime.now(), 0)
-    # jobs.send_telegram_update(2788, '@vn_resources', 0)
+    # jobs.send_telegram_update(2788, '@vn_resources', 'gold')
+    # jobs.send_telegram_update(2788, '@vn_uranium_resources', 'uranium')
     # sys.exit()
 
     JOBS = job_storage.get_jobs()
@@ -37,10 +38,21 @@ if __name__ == '__main__':
             minute=job['minutes']
         )
 
+    # VN gold
     SCHEDULER.add_job(
         jobs.send_telegram_update,
         'cron',
-        args=[2788, '@vn_resources', 0],
+        args=[2788, '@vn_resources', 'gold'],
+        id='send_telegram_update',
+        replace_existing=True,
+        minute='5'
+    )
+
+    # VN uranium
+    SCHEDULER.add_job(
+        jobs.send_telegram_update,
+        'cron',
+        args=[2788, '@vn_uranium_resources', 'uranium'],
         id='send_telegram_update',
         replace_existing=True,
         minute='5'

+ 7 - 4
app/app.py

@@ -11,7 +11,7 @@ from pandas.plotting import register_matplotlib_converters
 
 from telegram import ParseMode
 
-from app import LOGGER, SCHEDULER, TELEGRAM_BOT, jobs, api, database
+from app import LOGGER, SCHEDULER, TELEGRAM_BOT, RESOURCE_NAMES, jobs, api, database
 
 
 register_matplotlib_converters()
@@ -81,9 +81,12 @@ def max_refill_seconds(regions, limit, max_time):
             lowest_percentage = percentage
     return int(max_time / limit * lowest_percentage)
 
-def send_telegram_update(state_id, group_id, resource_type):
-    """Send mine update to telegram"""
-    message = database.get_work_percentage(state_id, resource_type, datetime.now(), 1, 1)
+def send_telegram_update(state_id, group_id, resource_name):
+    """Send resource update to telegram"""
+    date = datetime.now()
+    # date = datetime.today().replace(hour=18, minute=5) - timedelta(1)
+    resource_id = RESOURCE_NAMES[resource_name]
+    message = database.get_work_percentage(state_id, resource_id, date, 1, 1)
     if message:
         print(message)
         TELEGRAM_BOT.sendMessage(

+ 26 - 20
app/database.py

@@ -4,7 +4,7 @@ from datetime import datetime, timedelta, timezone
 
 from sqlalchemy.orm import joinedload
 
-from app import SESSION
+from app import SESSION, RESOURCE_MAX
 from app.models import ResourceTrack, ResourceStat, Region
 
 
@@ -69,17 +69,20 @@ def get_resources(region_id, date, resource_type):
     return new_resource
 
 
-def _get_state_stat(session, state_id, resource_type, date_time):
+def _get_state_stat(session, state_id, resource_type, date_time, deep_exploration):
     """Get state stats from date"""
     ten_minutes = timedelta(minutes=10)
-    stats = session.query(ResourceStat) \
+    query = session.query(ResourceStat) \
         .options(joinedload(ResourceStat.resource_track), joinedload(ResourceStat.region)) \
         .join(ResourceStat.resource_track) \
         .filter(ResourceTrack.state_id == state_id) \
         .filter(ResourceTrack.resource_type == resource_type) \
         .filter(ResourceTrack.date_time >= date_time - ten_minutes) \
         .filter(ResourceTrack.date_time <= date_time + ten_minutes) \
-        .all()
+        .filter(ResourceTrack.date_time <= date_time + ten_minutes)
+    if deep_exploration:
+        query = query.filter(ResourceStat.deep_exploration > 0)
+    stats = query.all()
     stats_dict = {}
     for stat in stats:
         stats_dict[stat.region_id] = stat
@@ -88,19 +91,20 @@ 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)
+    deep = bool(resource_type)
 
     session = SESSION()
     data = {
         0: {
             'date': end_date_time,
-            'stats': _get_state_stat(session, state_id, resource_type, end_date_time)
+            'stats': _get_state_stat(session, state_id, resource_type, end_date_time, deep)
         }
     }
     for i in range(times, 0, -1):
         current_date_time = end_date_time - timedelta(hours=hours*i)
         data[i] = {
             'date': current_date_time,
-            'stats': _get_state_stat(session, state_id, resource_type, current_date_time)
+            'stats': _get_state_stat(session, state_id, resource_type, current_date_time, deep)
         }
     session.close()
 
@@ -112,39 +116,41 @@ def get_work_percentage(state_id, resource_type, end_date_time, hours, times):
         data[i]['progress'] = {}
         reset_date_time = data[i+1]['date']
         if reset_date_time.hour >= 19:
-            reset_date_time = reset_date_time.replace(hour=19) + timedelta(1)
-        else:
-            reset_date_time = reset_date_time.replace(hour=19)
+            reset_date_time = reset_date_time + timedelta(1)
+        reset_date_time = reset_date_time.replace(hour=19)
         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():
+            if i+1 not in data or stat.region_id not in data[i+1]['stats']:
+                continue
             next_stat = data[i+1]['stats'][stat.region_id]
-            if seconds_left != 86400:
-                mined = next_stat.total() - stat.total()
+            if seconds_left == 82800:
+                mined = RESOURCE_MAX[resource_type] + next_stat.explored - stat.total()
                 required = next_stat.total() / (seconds_left / (hours * 3600))
             else:
-                mined = 2500 + next_stat.explored - stat.total()
-                required = next_stat.total()
+                mined = next_stat.total() - stat.total()
+                required = next_stat.total() / (seconds_left / (hours * 3600))
+
             if required != 0:
-                percentage = (mined / required - 1) * 0.04 * next_stat.total()
+                coefficient = 100 / RESOURCE_MAX[resource_type]
+                percentage = (mined / required - 1) * next_stat.total() * coefficient + 100
             else:
-                percentage = 0
+                percentage = 100
+            data[i]['progress'][stat.region_id] = percentage
             # 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
 
     message_text = ''
-    message_text += '{:21}: {:9}\n'.format('region', 'workers')
+    message_text += '{:15}: {:>8}\n'.format('region', 'workers')
     for date in data.values():
         if 'progress' in date:
             for region_id, progress in sorted(date['progress'].items(), key=lambda x: x[1]):
-                message_text += '{:21}: {:7.2f}\n'.format(
-                    regions[region_id],
+                message_text += '{:15}: {:6.2f} %\n'.format(
+                    regions[region_id].replace('Netherlands', 'NL'),
                     progress
                 )
     return message_text