Prechádzať zdrojové kódy

Add function to send player deparment progress

JoostSijm 5 rokov pred
rodič
commit
37fa51b636
3 zmenil súbory, kde vykonal 109 pridanie a 3 odobranie
  1. 57 3
      app/__main__.py
  2. 37 0
      app/api.py
  3. 15 0
      app/database.py

+ 57 - 3
app/__main__.py

@@ -1,10 +1,11 @@
 """Main app"""
 
+import math
 import time
 
 from app import scheduler, LOGGER
-from app.api import get_professors
-from app.database import get_latest_professor, save_professors
+from app.api import get_professors, get_institutes, send_message
+from app.database import get_latest_professor, save_professors, get_yesterday_professors
 
 
 def job_update_department(state_id, department_type):
@@ -43,9 +44,59 @@ def add_update_department(state_id, department_type):
         hour='20'
     )
 
+def job_send_progress_message(state_id, department_type, language):
+    """Update department professors"""
+    LOGGER.info('"%s": Send progress message for "%s" department', state_id, department_type)
+    yesterday_professors = get_yesterday_professors(state_id, department_type)
+    if not yesterday_professors:
+        return
+    yesterday_total = 0
+    for professor in yesterday_professors:
+        yesterday_total += professor.points
+
+    institutes = get_institutes()
+    uranium_institutes = []
+    for institute in institutes:
+        if institute['department_type'] == department_type:
+            uranium_institutes.append(institute)
+            if institute['state_id'] == state_id:
+                state_institute = institute
+    top_department = uranium_institutes[0]
+    top_value = math.ceil(top_department['value'] / 10) * 10
+    points_per_day = round(top_value / 14)
+    message = ' '.join([
+        "Huidige uranium bonus is {} % met {} punten.".format(
+            state_institute['current_bonus'],
+            state_institute['value']
+        ),
+        "Benodigde punten voor 10 % bonus: {} wat dagelijks {} punten zijn.".format(
+            top_value,
+            points_per_day
+        ),
+        "Aantal punten gisteren was: {}, dat is {} % van de benodigde punten.".format(
+            yesterday_total,
+            round(100 / points_per_day * yesterday_total)
+        )
+    ])
+    print(message)
+    send_message(language, message)
+
+def add_send_progress_message(state_id, department_type, language):
+    """Add send_message"""
+    scheduler.add_job(
+        job_send_progress_message,
+        'cron',
+        args=[state_id, department_type, language],
+        id='send_message_{}_{}'.format(state_id, department_type),
+        replace_existing=True,
+        hour='20',
+        minute='10'
+    )
+
 if __name__ == '__main__':
     # jobs
-    # job_update_department(2788, 2)
+    # job_update_department(2788, 6)
+    # job_send_progress_message(2788, 6)
     # VN
     # uranium
     add_update_department(2788, 6)
@@ -62,6 +113,9 @@ if __name__ == '__main__':
     # gold
     add_update_department(2620, 2)
 
+    # send message
+    add_send_progress_message(2788, 6, 'nl')
+
     try:
         while True:
             time.sleep(100)

+ 37 - 0
app/api.py

@@ -62,3 +62,40 @@ def parse_department(html):
             'date_time': datetime.strptime(date, '%d %B %Y %H:%M'),
         })
     return professors
+
+def get_institutes():
+    """Get all institutes"""
+    # institutes = download_institutes()
+    institutes = read_institutes()
+    return institutes
+
+def read_institutes():
+    """Read from department file"""
+    with open('institutes.html') as file:
+        return parse_institutes(file)
+
+def parse_institutes(html):
+    """Parse html to institute list"""
+    soup = BeautifulSoup(html, 'html.parser')
+    institutes_tree = soup.find_all(class_='list_link')
+    institutes = []
+    for institute_tree in institutes_tree:
+        department_type = int(re.sub(r'^.*\/', '', institute_tree.select('.results_date')[1]['action']))
+        value = int(institute_tree.select('.list_level')[0].string)
+        current_bonus = float(re.sub(r'\s%$', '', institute_tree.select('.list_level')[2].string))
+        if current_bonus >= 2:
+            institutes.append({
+                'state_id': int(institute_tree['user']),
+                'department_type': department_type,
+                'current_bonus': current_bonus,
+                'value': value,
+            })
+    return institutes
+
+def send_message(language, message):
+    """Send chat message"""
+    requests.post(
+        '{}send_chat/{}'.format(BASE_URL, language),
+        headers=HEADERS,
+        data={'message': message}
+    )

+ 15 - 0
app/database.py

@@ -1,5 +1,7 @@
 """Database module"""
 
+from datetime import datetime, timedelta
+
 from app import Session
 from app.models import Player, Department, DepartmentStat
 
@@ -53,3 +55,16 @@ def save_professors(state_id, department_type, professors):
         session.add(department_stat)
     session.commit()
     session.close()
+
+def get_yesterday_professors(state_id, department_type):
+    """Get professors from yesterday"""
+    session = Session()
+    department = get_department(session, state_id, department_type)
+    until_date = datetime.today().replace(hour=20, minute=0, second=0)
+    from_date = until_date - timedelta(1)
+    professors = session.query(DepartmentStat) \
+        .filter(DepartmentStat.department_id == department.id) \
+        .filter(DepartmentStat.date_time >= from_date) \
+        .filter(DepartmentStat.date_time < until_date) \
+        .all()
+    return professors