From b95887e20c3663ecd05c8129d3a6c7fa151cbf81 Mon Sep 17 00:00:00 2001 From: "hikari.ftg" Date: Sun, 27 Mar 2022 13:19:29 +0000 Subject: [PATCH] 1.0.4: Add Okteto pinger, which will wake the pod up, when it goes to sleep --- hikka/main.py | 2 +- hikka/modules/okteto.py | 85 ++++++++++++++++++++++++++++++++++ hikka/web/root.py | 6 +-- web-resources/static/okteto.js | 2 + 4 files changed, 91 insertions(+), 4 deletions(-) create mode 100644 hikka/modules/okteto.py diff --git a/hikka/main.py b/hikka/main.py index 6c4ccab..a40bfd8 100755 --- a/hikka/main.py +++ b/hikka/main.py @@ -56,7 +56,7 @@ from .translations.core import Translator from math import ceil -__version__ = (1, 0, 3) +__version__ = (1, 0, 4) try: from .web import core except ImportError: diff --git a/hikka/modules/okteto.py b/hikka/modules/okteto.py new file mode 100644 index 0000000..05c9b5a --- /dev/null +++ b/hikka/modules/okteto.py @@ -0,0 +1,85 @@ +# █ █ ▀ █▄▀ ▄▀█ █▀█ ▀ ▄▀█ ▀█▀ ▄▀█ █▀▄▀█ ▄▀█ +# █▀█ █ █ █ █▀█ █▀▄ █ ▄ █▀█ █ █▀█ █ ▀ █ █▀█ +# +# © Copyright 2022 +# +# https://t.me/hikariatama +# +# 🔒 Licensed under the GNU GPLv3 +# 🌐 https://www.gnu.org/licenses/agpl-3.0.html + +from .. import loader +import logging +import asyncio +import os +import time +from telethon.tl.functions.messages import GetScheduledHistoryRequest + +logger = logging.getLogger(__name__) + + +@loader.tds +class OktetoMod(loader.Module): + """Stuff related to Hikka Okteto cloud installation""" + + strings = {"name": "Okteto"} + + async def client_ready(self, client, db) -> None: + if "OKTETO" not in os.environ: + raise loader.LoadError( + "This module can be loaded only if userbot is installed to ☁️ Okteto" + ) + + self._db = db + self._client = client + self._env_wait_interval = 10 + self._overall_polling_interval = 60 * 60 + self._plan = 3 * 24 * 60 * 60 + self._messages_interval = 60 * 60 + self._exception_timeout = 10 + self._send_interval = 5 + self._bot = "@WebpageBot" + self._task = asyncio.ensure_future(self._okteto_poller()) + + async def on_unload(self) -> None: + self._task.cancel() + + async def _okteto_poller(self) -> None: + """Creates queue to Webpage bot to reset Okteto polling after app goes to sleep""" + while True: + try: + if "OKTETO_URI" not in os.environ: + await asyncio.sleep(self._env_wait_interval) + continue + + uri = os.environ["OKTETO_URI"] + current_queue = ( + await self._client( + GetScheduledHistoryRequest( + peer=self._bot, + hash=0, + ), + ) + ).messages + + try: + last_date = max( + time.mktime(m.date.timetuple()) for m in current_queue + ) + except ValueError: + last_date = time.time() + + while last_date < time.time() + self._plan: + last_date += self._messages_interval + await self._client.send_message( + self._bot, + uri, + schedule=last_date, + ) + logger.debug(f"Scheduled Okteto pinger to {last_date}") + await asyncio.sleep(self._send_interval) + + await asyncio.sleep(self._overall_polling_interval) + except Exception: + logger.exception("Caught exception on Okteto poller") + await asyncio.sleep(self._exception_timeout) diff --git a/hikka/web/root.py b/hikka/web/root.py index 46f1a3c..52194b4 100644 --- a/hikka/web/root.py +++ b/hikka/web/root.py @@ -136,11 +136,11 @@ class Web: return web.Response() async def okteto(self, request): - if not self._check_session(request): - return web.Response(body="WAIT") + if "OKTETO_URI" in os.environ: + return web.Response(status=418) text = await request.text() - main.hikka.okteto_uri = text + os.environ["OKTETO_URI"] = text return web.Response(body="URI_SAVED") async def tg_code(self, request): diff --git a/web-resources/static/okteto.js b/web-resources/static/okteto.js index 1d468ec..5eeb5c5 100644 --- a/web-resources/static/okteto.js +++ b/web-resources/static/okteto.js @@ -11,3 +11,5 @@ function okteto() { } }) } + +okteto()