|
@@ -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"<code>{package.__version__}</code>"
|
|
|
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"<b>{package}</b>: "
|
|
|
+ f"<code>{versions['current']}</code> —> "
|
|
|
+ f"<code>{versions['new']}</code>"
|
|
|
+ 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(
|