Quellcode durchsuchen

Calculating working percentage

JoostSijm vor 5 Jahren
Ursprung
Commit
e69787150d
7 geänderte Dateien mit 212 neuen und 5 gelöschten Zeilen
  1. 1 0
      Pipfile
  2. 97 1
      Pipfile.lock
  3. 4 0
      app/__init__.py
  4. 20 4
      app/__main__.py
  5. 85 0
      app/database.py
  6. 4 0
      app/models.py
  7. 1 0
      example.env

+ 1 - 0
Pipfile

@@ -12,6 +12,7 @@ sqlalchemy = "*"
 python-dotenv = "*"
 psycopg2-binary = "*"
 apscheduler = "*"
+python-telegram-bot = "*"
 matplotlib = "*"
 pandas = "*"
 

+ 97 - 1
Pipfile.lock

@@ -1,7 +1,7 @@
 {
     "_meta": {
         "hash": {
-            "sha256": "7b00418215b9ee0f04ea3403432a169a77b8b65f99438d47418250e5fc7b94b5"
+            "sha256": "f1736fd02266147bd4504b42fa289bb3bb9c6141e05e0cd0367e7f133d1cd790"
         },
         "pipfile-spec": 6,
         "requires": {
@@ -40,6 +40,44 @@
             ],
             "version": "==2019.9.11"
         },
+        "cffi": {
+            "hashes": [
+                "sha256:0b49274afc941c626b605fb59b59c3485c17dc776dc3cc7cc14aca74cc19cc42",
+                "sha256:0e3ea92942cb1168e38c05c1d56b0527ce31f1a370f6117f1d490b8dcd6b3a04",
+                "sha256:135f69aecbf4517d5b3d6429207b2dff49c876be724ac0c8bf8e1ea99df3d7e5",
+                "sha256:19db0cdd6e516f13329cba4903368bff9bb5a9331d3410b1b448daaadc495e54",
+                "sha256:2781e9ad0e9d47173c0093321bb5435a9dfae0ed6a762aabafa13108f5f7b2ba",
+                "sha256:291f7c42e21d72144bb1c1b2e825ec60f46d0a7468f5346841860454c7aa8f57",
+                "sha256:2c5e309ec482556397cb21ede0350c5e82f0eb2621de04b2633588d118da4396",
+                "sha256:2e9c80a8c3344a92cb04661115898a9129c074f7ab82011ef4b612f645939f12",
+                "sha256:32a262e2b90ffcfdd97c7a5e24a6012a43c61f1f5a57789ad80af1d26c6acd97",
+                "sha256:3c9fff570f13480b201e9ab69453108f6d98244a7f495e91b6c654a47486ba43",
+                "sha256:415bdc7ca8c1c634a6d7163d43fb0ea885a07e9618a64bda407e04b04333b7db",
+                "sha256:42194f54c11abc8583417a7cf4eaff544ce0de8187abaf5d29029c91b1725ad3",
+                "sha256:4424e42199e86b21fc4db83bd76909a6fc2a2aefb352cb5414833c030f6ed71b",
+                "sha256:4a43c91840bda5f55249413037b7a9b79c90b1184ed504883b72c4df70778579",
+                "sha256:599a1e8ff057ac530c9ad1778293c665cb81a791421f46922d80a86473c13346",
+                "sha256:5c4fae4e9cdd18c82ba3a134be256e98dc0596af1e7285a3d2602c97dcfa5159",
+                "sha256:5ecfa867dea6fabe2a58f03ac9186ea64da1386af2159196da51c4904e11d652",
+                "sha256:62f2578358d3a92e4ab2d830cd1c2049c9c0d0e6d3c58322993cc341bdeac22e",
+                "sha256:6471a82d5abea994e38d2c2abc77164b4f7fbaaf80261cb98394d5793f11b12a",
+                "sha256:6d4f18483d040e18546108eb13b1dfa1000a089bcf8529e30346116ea6240506",
+                "sha256:71a608532ab3bd26223c8d841dde43f3516aa5d2bf37b50ac410bb5e99053e8f",
+                "sha256:74a1d8c85fb6ff0b30fbfa8ad0ac23cd601a138f7509dc617ebc65ef305bb98d",
+                "sha256:7b93a885bb13073afb0aa73ad82059a4c41f4b7d8eb8368980448b52d4c7dc2c",
+                "sha256:7d4751da932caaec419d514eaa4215eaf14b612cff66398dd51129ac22680b20",
+                "sha256:7f627141a26b551bdebbc4855c1157feeef18241b4b8366ed22a5c7d672ef858",
+                "sha256:8169cf44dd8f9071b2b9248c35fc35e8677451c52f795daa2bb4643f32a540bc",
+                "sha256:aa00d66c0fab27373ae44ae26a66a9e43ff2a678bf63a9c7c1a9a4d61172827a",
+                "sha256:ccb032fda0873254380aa2bfad2582aedc2959186cce61e3a17abc1a55ff89c3",
+                "sha256:d754f39e0d1603b5b24a7f8484b22d2904fa551fe865fd0d4c3332f078d20d4e",
+                "sha256:d75c461e20e29afc0aee7172a0950157c704ff0dd51613506bd7d82b718e7410",
+                "sha256:dcd65317dd15bc0451f3e01c80da2216a31916bdcffd6221ca1202d96584aa25",
+                "sha256:e570d3ab32e2c2861c4ebe6ffcad6a8abf9347432a37608fe1fbd157b3f0036b",
+                "sha256:fd43a88e045cf992ed09fa724b5315b790525f2676883a6ea64e3263bae6549d"
+            ],
+            "version": "==1.13.2"
+        },
         "chardet": {
             "hashes": [
                 "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae",
@@ -47,6 +85,32 @@
             ],
             "version": "==3.0.4"
         },
+        "cryptography": {
+            "hashes": [
+                "sha256:02079a6addc7b5140ba0825f542c0869ff4df9a69c360e339ecead5baefa843c",
+                "sha256:1df22371fbf2004c6f64e927668734070a8953362cd8370ddd336774d6743595",
+                "sha256:369d2346db5934345787451504853ad9d342d7f721ae82d098083e1f49a582ad",
+                "sha256:3cda1f0ed8747339bbdf71b9f38ca74c7b592f24f65cdb3ab3765e4b02871651",
+                "sha256:44ff04138935882fef7c686878e1c8fd80a723161ad6a98da31e14b7553170c2",
+                "sha256:4b1030728872c59687badcca1e225a9103440e467c17d6d1730ab3d2d64bfeff",
+                "sha256:58363dbd966afb4f89b3b11dfb8ff200058fbc3b947507675c19ceb46104b48d",
+                "sha256:6ec280fb24d27e3d97aa731e16207d58bd8ae94ef6eab97249a2afe4ba643d42",
+                "sha256:7270a6c29199adc1297776937a05b59720e8a782531f1f122f2eb8467f9aab4d",
+                "sha256:73fd30c57fa2d0a1d7a49c561c40c2f79c7d6c374cc7750e9ac7c99176f6428e",
+                "sha256:7f09806ed4fbea8f51585231ba742b58cbcfbfe823ea197d8c89a5e433c7e912",
+                "sha256:90df0cc93e1f8d2fba8365fb59a858f51a11a394d64dbf3ef844f783844cc793",
+                "sha256:971221ed40f058f5662a604bd1ae6e4521d84e6cad0b7b170564cc34169c8f13",
+                "sha256:a518c153a2b5ed6b8cc03f7ae79d5ffad7315ad4569b2d5333a13c38d64bd8d7",
+                "sha256:b0de590a8b0979649ebeef8bb9f54394d3a41f66c5584fff4220901739b6b2f0",
+                "sha256:b43f53f29816ba1db8525f006fa6f49292e9b029554b3eb56a189a70f2a40879",
+                "sha256:d31402aad60ed889c7e57934a03477b572a03af7794fa8fb1780f21ea8f6551f",
+                "sha256:de96157ec73458a7f14e3d26f17f8128c959084931e8997b9e655a39c8fde9f9",
+                "sha256:df6b4dca2e11865e6cfbfb708e800efb18370f5a46fd601d3755bc7f85b3a8a2",
+                "sha256:ecadccc7ba52193963c0475ac9f6fa28ac01e01349a2ca48509667ef41ffd2cf",
+                "sha256:fb81c17e0ebe3358486cd8cc3ad78adbae58af12fc2bf2bc0bb84e8090fa5ce8"
+            ],
+            "version": "==2.8"
+        },
         "cycler": {
             "hashes": [
                 "sha256:1d8a5ae1ff6c5cf9b93e8811e581232ad8920aeec647c37316ceac982b08cb2d",
@@ -54,6 +118,12 @@
             ],
             "version": "==0.10.0"
         },
+        "future": {
+            "hashes": [
+                "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"
+            ],
+            "version": "==0.18.2"
+        },
         "idna": {
             "hashes": [
                 "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407",
@@ -207,6 +277,12 @@
             "index": "pypi",
             "version": "==2.8.4"
         },
+        "pycparser": {
+            "hashes": [
+                "sha256:a988718abfad80b6b157acce7bf130a30876d27603738ac39f140993246b25b3"
+            ],
+            "version": "==2.19"
+        },
         "pyparsing": {
             "hashes": [
                 "sha256:20f995ecd72f2a1f4bf6b072b63b22e2eb457836601e76d6e5dfcd75436acc1f",
@@ -229,6 +305,14 @@
             "index": "pypi",
             "version": "==0.10.3"
         },
+        "python-telegram-bot": {
+            "hashes": [
+                "sha256:346d42771c2b23384c59f5f41e05bd7e801a0ce118d8dcb95209bb73d5f694c5",
+                "sha256:3beee89cba3bc3217566c96199f04776dd25f541ac8992da27fd247b2d208a14"
+            ],
+            "index": "pypi",
+            "version": "==12.2.0"
+        },
         "pytz": {
             "hashes": [
                 "sha256:1c557d7d0e871de1f5ccd5833f60fb2550652da6be2693c1e02300743d21500d",
@@ -265,6 +349,18 @@
             "index": "pypi",
             "version": "==1.3.11"
         },
+        "tornado": {
+            "hashes": [
+                "sha256:349884248c36801afa19e342a77cc4458caca694b0eda633f5878e458a44cb2c",
+                "sha256:398e0d35e086ba38a0427c3b37f4337327231942e731edaa6e9fd1865bbd6f60",
+                "sha256:4e73ef678b1a859f0cb29e1d895526a20ea64b5ffd510a2307b5998c7df24281",
+                "sha256:559bce3d31484b665259f50cd94c5c28b961b09315ccd838f284687245f416e5",
+                "sha256:abbe53a39734ef4aba061fca54e30c6b4639d3e1f59653f0da37a0003de148c7",
+                "sha256:c845db36ba616912074c5b1ee897f8e0124df269468f25e4fe21fe72f6edd7a9",
+                "sha256:c9399267c926a4e7c418baa5cbe91c7d1cf362d505a1ef898fde44a07c9dd8a5"
+            ],
+            "version": "==6.0.3"
+        },
         "tzlocal": {
             "hashes": [
                 "sha256:11c9f16e0a633b4b60e1eede97d8a46340d042e67b670b290ca526576e039048",

+ 4 - 0
app/__init__.py

@@ -3,6 +3,7 @@
 import os
 import logging
 
+import telegram
 from sqlalchemy import create_engine
 from sqlalchemy.orm import sessionmaker
 from dotenv import load_dotenv
@@ -13,6 +14,9 @@ from app.models import Base, Region, DeepExploration, ResourceTrack, ResourceSta
 
 load_dotenv()
 
+# Telegram
+TELEGRAM_BOT = telegram.Bot(os.environ['TELEGRAM_KEY'])
+
 # database
 ENGINE = create_engine(os.environ["DATABASE_URI"])
 SESSION = sessionmaker(bind=ENGINE)

+ 20 - 4
app/__main__.py

@@ -12,9 +12,11 @@ import pandas as pd
 
 from pandas.plotting import register_matplotlib_converters
 
-from app import SCHEDULER, LOGGER
+from telegram import ParseMode
+
+from app import SCHEDULER, LOGGER, TELEGRAM_BOT
 from app.api import download_resources, refill
-from app.database import save_resources, get_resources
+from app.database import save_resources, get_resources, get_work_percentage
 from app.app import need_refill, max_refill_seconds, print_resources
 
 
@@ -62,9 +64,21 @@ def add_check_resources(state_id, capital_id, resource_id, do_refill, minute):
         minute=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()
+    TELEGRAM_BOT.sendMessage(
+        chat_id=group_id, 
+        text='*test*',
+        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)
@@ -92,6 +106,7 @@ def graph():
     end_date_time = date.replace(hour=20, minute=0, second=0, microsecond=0)
     start_date_time = end_date_time - timedelta(hours=26)
     ax.set_xlim([start_date_time, end_date_time])
+    ax.set_ylim([0, 2500])
 
     # style
     plt.style.use('seaborn-darkgrid')
@@ -133,7 +148,8 @@ if __name__ == '__main__':
     # job_refill_resource(2788, 4002, 0)
     # job_check_resources(2788, 4002, 0, False) # VN
     # job_check_resources(2620, 4002, 0, False) # Zeelandiae
-    graph()
+    # graph()
+    job_send_telegram_update(2788, '@vn_resources', 0)
     # get_resources(4001, datetime.now(), 0)
     exit()
 

+ 85 - 0
app/database.py

@@ -8,6 +8,10 @@ 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"""
@@ -81,3 +85,84 @@ def get_state_regions(state_id):
     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)
+    stats = 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()
+    stats_dict = {}
+    for stat in stats:
+        stats_dict[stat.region_id] = stat
+    return stats_dict
+
+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 = {
+        0: {
+            'date': end_date_time,
+            'stats': _get_state_stat(session, state_id, resource_type, end_date_time)
+        }
+    }
+    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)
+        }
+    session.close()
+
+    print(data)
+
+    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))
+        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
+            ))
+            data[i]['progress'][stat.region_id] = percentage
+        print('test')
+
+    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,
+                    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

+ 4 - 0
app/models.py

@@ -68,6 +68,10 @@ class ResourceStat(Base):
         backref=backref("resource_stats", lazy="dynamic")
     )
 
+    def total(self):
+        """total left"""
+        return self.limit_left + self.explored
+
 
 class State(Base):
     """Model for state"""

+ 1 - 0
example.env

@@ -1,3 +1,4 @@
 AUTHORIZATION=PLACEHOLDER
 DATABASE_URI='postgresql://hvs@localhost/hvs'
 API_URL='http://localhost:5000/api/request/'
+TELEGRAM_KEY=PLACEHOLDER