Queer European MD passionate about IT
瀏覽代碼

Working on package update notifier

Davte 5 年之前
父節點
當前提交
f0be5b5ff2
共有 3 個文件被更改,包括 33 次插入11 次删除
  1. 28 7
      davtelepot/administration_tools.py
  2. 4 4
      davtelepot/api.py
  3. 1 0
      setup.py

+ 28 - 7
davtelepot/administration_tools.py

@@ -14,15 +14,23 @@ import datetime
 import json
 
 # Third party modules
-import davtelepot
-from davtelepot import messages
-from davtelepot.utilities import (
-    async_wrapper, Confirmator, extract, get_cleaned_text, get_user,
-    escape_html_chars, line_drawing_unordered_list, make_button,
+from sqlalchemy.exc import ResourceClosedError
+
+# Project modules
+from . import bot as davtelepot_bot, messages, __version__ as version
+from .utilities import (
+    async_wrapper, CachedPage, Confirmator, extract, get_cleaned_text,
+    get_user, escape_html_chars, line_drawing_unordered_list, make_button,
     make_inline_keyboard, remove_html_tags, send_part_of_text_file,
     send_csv_file
 )
-from sqlalchemy.exc import ResourceClosedError
+
+# 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):
@@ -793,7 +801,7 @@ async def get_version():
         last_commit = f"{e}"
     if last_commit.startswith("fatal: not a git repository"):
         last_commit = "-"
-    davtelepot_version = davtelepot.__version__
+    davtelepot_version = version
     return last_commit, davtelepot_version
 
 
@@ -855,6 +863,17 @@ async def notify_new_version(bot):
     return
 
 
+async def update_davtelepot(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)
+        await asyncio.sleep(monitoring_interval)
+
+
 def init(telegram_bot, talk_messages=None, admin_messages=None):
     """Assign parsers, commands, buttons and queries to given `bot`."""
     if talk_messages is None:
@@ -878,6 +897,8 @@ def init(telegram_bot, talk_messages=None, admin_messages=None):
         for command in ['stop', 'restart', 'maintenance']
     ]
 
+    asyncio.ensure_future(update_davtelepot(telegram_bot))
+
     @telegram_bot.additional_task(when='BEFORE')
     async def load_talking_sessions():
         sessions = []

+ 4 - 4
davtelepot/api.py

@@ -1,4 +1,4 @@
-"""This module provides a glow-like middleware for Telegram bot API.
+"""This module provides a python mirror for Telegram bot API.
 
 All methods and parameters are the same as the original json API.
 A simple aiohttp asynchronous web client is used to make requests.
@@ -10,11 +10,11 @@ import datetime
 import json
 import logging
 
-# Third party modules
 from typing import Union, List
 
+# Third party modules
 import aiohttp
-from aiohttp import web
+import aiohttp.web
 
 
 class TelegramError(Exception):
@@ -82,7 +82,7 @@ class TelegramBot:
     """
 
     loop = asyncio.get_event_loop()
-    app = web.Application()
+    app = aiohttp.web.Application()
     sessions_timeouts = {
         'getUpdates': dict(
             timeout=35,

+ 1 - 0
setup.py

@@ -59,6 +59,7 @@ setuptools.setup(
         'bs4',
         'dataset',
     ],
+    python_requires='>=3.5',
     classifiers=[
         "Development Status :: 5 - Production/Stable",
         "Environment :: Console",