From 16014c5a424c57249685ad2fbc1f03727d041503 Mon Sep 17 00:00:00 2001 From: Davte Date: Sun, 26 Apr 2020 23:30:44 +0200 Subject: [PATCH] Working on package update notifier --- davtelepot/administration_tools.py | 55 ++++++++++++++++-------------- 1 file changed, 30 insertions(+), 25 deletions(-) diff --git a/davtelepot/administration_tools.py b/davtelepot/administration_tools.py index 4231ab5..0a3a1c4 100644 --- a/davtelepot/administration_tools.py +++ b/davtelepot/administration_tools.py @@ -12,6 +12,7 @@ davtelepot.admin_tools.init(my_bot) import asyncio import datetime import json +import logging # Third party modules from sqlalchemy.exc import ResourceClosedError @@ -25,13 +26,6 @@ from .utilities import ( send_csv_file ) -# davtelepot_web_page = CachedPage(url="https://pypi.org/project/davtelepot/", -davtelepot_web_page = CachedPage( - url='https://pypi.python.org/pypi/davtelepot/json', - cache_time=2, - mode='json' -) - async def _forward_to(update, bot, sender, addressee, is_admin=False): if update['text'].lower() in ['stop'] and is_admin: @@ -187,11 +181,9 @@ def get_talk_panel(bot, update, user_record=None, text=''): { key: val for key, val in user.items() - if key in ( - 'first_name', - 'last_name', - 'username' - ) + if key in ('first_name', + 'last_name', + 'username') } ) ), @@ -835,10 +827,10 @@ async def notify_new_version(bot): or old_record['davtelepot_version'] != davtelepot_version ): new_record = dict( - updated_at=datetime.datetime.now(), - last_commit=last_commit, - davtelepot_version=davtelepot_version - ) + updated_at=datetime.datetime.now(), + last_commit=last_commit, + davtelepot_version=davtelepot_version + ) bot.db['version_history'].insert( new_record ) @@ -863,14 +855,27 @@ async def notify_new_version(bot): return -async def update_davtelepot(bot: davtelepot_bot, - monitoring_interval: int = 60 * 60): +async def get_package_updates(bot: davtelepot_bot, + monitoring_interval: int = 60 * 60): while 1: - web_page = await davtelepot_web_page.get_page() - if web_page['info']['version'] != version: - bot.stop(message='New version of davtelepot detected.\n' - '=== RESTARTING ===', - final_state=65) + for package in bot.packages: + package_web_page = CachedPage.get( + f'https://pypi.python.org/pypi/{package.__name__}/json', + cache_time=2, + mode='json' + ) + web_page = await package_web_page.get_page() + if web_page is None or isinstance(web_page, Exception): + logging.error(f"Cannot get updates for {package.__name__}, " + "skipping...") + continue + new_version = web_page['info']['version'] + current_version = package.__version__ + if new_version != current_version: + print(f"New version of {package}: " + f"{current_version} > " + f"{new_version}") + # TODO notify administrators await asyncio.sleep(monitoring_interval) @@ -897,7 +902,7 @@ def init(telegram_bot, talk_messages=None, admin_messages=None): for command in ['stop', 'restart', 'maintenance'] ] - asyncio.ensure_future(update_davtelepot(telegram_bot)) + asyncio.ensure_future(get_package_updates(telegram_bot)) @telegram_bot.additional_task(when='BEFORE') async def load_talking_sessions(): @@ -1066,7 +1071,7 @@ def init(telegram_bot, talk_messages=None, admin_messages=None): 'help_section',) }, show_in_keyboard=False, - authorization_level='admin',) + authorization_level='admin') async def version_command(bot, update, user_record): return await _version_command(bot=bot, update=update,