From f840f9fe13ab6620a8dce2d46d416bf2e22b2f9e Mon Sep 17 00:00:00 2001 From: Davte Date: Wed, 13 May 2020 19:45:15 +0200 Subject: [PATCH] /version command looks for updates --- davtelepot/__init__.py | 2 +- davtelepot/administration_tools.py | 95 ++++++++++++++++++++---------- 2 files changed, 66 insertions(+), 31 deletions(-) diff --git a/davtelepot/__init__.py b/davtelepot/__init__.py index 102665e..f0b5941 100644 --- a/davtelepot/__init__.py +++ b/davtelepot/__init__.py @@ -11,7 +11,7 @@ __author__ = "Davide Testa" __email__ = "davide@davte.it" __credits__ = ["Marco Origlia", "Nick Lee @Nickoala"] __license__ = "GNU General Public License v3.0" -__version__ = "2.5.10" +__version__ = "2.5.11" __maintainer__ = "Davide Testa" __contact__ = "t.me/davte" diff --git a/davtelepot/administration_tools.py b/davtelepot/administration_tools.py index 7a50d81..41fda79 100644 --- a/davtelepot/administration_tools.py +++ b/davtelepot/administration_tools.py @@ -830,6 +830,46 @@ async def get_last_commit(): return last_commit +async def get_new_versions(bot: Bot, + notification_interval: datetime.timedelta = None) -> dict: + """Get new versions of packages in bot.packages. + + Result: {"name": {"current": "0.1", "new": "0.2"}} + """ + if notification_interval is None: + notification_interval = datetime.timedelta(seconds=0) + news = dict() + 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__ + notification_record = bot.db['updates_notifications'].find_one( + package=package.__name__, + order_by=['-id'], + _limit=1 + ) + if ( + new_version != current_version + and (notification_record is None + or notification_record['notified_at'] + < datetime.datetime.now() - notification_interval) + ): + news[package.__name__] = { + 'current': current_version, + 'new': new_version + } + return news + + async def _version_command(bot: Bot, update, user_record): last_commit = await get_last_commit() text = bot.get_message( @@ -842,7 +882,29 @@ async def _version_command(bot: Bot, update, user_record): f"{package.__version__}" for package in bot.packages ) - return text + temporary_message = await bot.send_message( + text=text + '\n\n⏳ Checking for updates... ☑️', + update=update, + send_default_keyboard=False + ) + news = await get_new_versions(bot=bot) + if not news: + text += '\n\n⌛️ All packages are updated! ✅' + else: + text += '\n\n' + bot.get_message( + 'admin', 'updates_available', 'header', + user_record=user_record + ) + '\n\n' + text += '\n'.join( + f"{package}: " + f"{versions['current']} —> " + f"{versions['new']}" + for package, versions in news.items() + ) + await bot.edit_message_text( + text=text, + update=temporary_message + ) async def notify_new_version(bot: Bot): @@ -918,35 +980,8 @@ async def get_package_updates(bot: Bot, seconds=notification_interval ) while 1: - news = dict() - 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__ - notification_record = bot.db['updates_notifications'].find_one( - package=package.__name__, - order_by=['-id'], - _limit=1 - ) - if ( - new_version != current_version - and (notification_record is None - or notification_record['notified_at'] - < datetime.datetime.now() - notification_interval) - ): - news[package.__name__] = { - 'current': current_version, - 'new': new_version - } + news = await get_new_versions(bot=bot, + notification_interval=notification_interval) if news: for admin in bot.administrators: text = bot.get_message(