From b4d1ef7db15da8d3f0834ce6c82af1b9ae8a1000 Mon Sep 17 00:00:00 2001 From: hikariatama Date: Wed, 3 Aug 2022 14:41:19 +0000 Subject: [PATCH] 1.3.0 - Automatically react to module post in developer's channel if possible --- CHANGELOG.md | 1 + hikka/modules/hikka_info.py | 4 +-- hikka/modules/loader.py | 72 ++++++++++++++++++++++++------------- 3 files changed, 50 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e37dbde..35d2d07 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,7 @@ - Add support for :obj:`aiogram.types.Message` in `utils.get_chat_id` - Add human-readable error message when trying to unload core module - Replace `print` with `logging.info` in main script to make url visible in logs +- Automatically react to module post in developer's channel if possible ## 🌑 Hikka 1.2.12 diff --git a/hikka/modules/hikka_info.py b/hikka/modules/hikka_info.py index 0e2d095..1197fd4 100755 --- a/hikka/modules/hikka_info.py +++ b/hikka/modules/hikka_info.py @@ -30,7 +30,7 @@ class HikkaInfoMod(loader.Module): "version": "Version", "build": "Build", "prefix": "Prefix", - "prefix": "Uptime", + "uptime": "Uptime", "send_info": "Send userbot info", "description": "ℹ This will not compromise any sensitive info", "up-to-date": "😌 Up-to-date", @@ -48,7 +48,7 @@ class HikkaInfoMod(loader.Module): "version": "Версия", "build": "Сборка", "prefix": "Префикс", - "prefix": "Аптайм", + "uptime": "Аптайм", "send_info": "Отправить информацию о юзерботе", "description": "ℹ Это не раскроет никакой личной информации", "_ihandle_doc_info": "Отправить информацию о юзерботе", diff --git a/hikka/modules/loader.py b/hikka/modules/loader.py index 0d2bc67..23bd213 100755 --- a/hikka/modules/loader.py +++ b/hikka/modules/loader.py @@ -319,6 +319,29 @@ class LoaderMod(loader.Module): asyncio.ensure_future(self._update_modules()) asyncio.ensure_future(self.get_repo_list("full")) + self._react_queue = [] + + @loader.loop(interval=30, autostart=True) + async def _react_processor(self): + if not self._react_queue: + return + + developer_entity, modname = self._react_queue.pop(0) + try: + await ( + await self._client.get_messages( + developer_entity, limit=1, search=modname + ) + )[0].react("❤️") + self.set( + "reacted", + self.get("reacted", []) + [f"{developer_entity.id}/{modname}"], + ) + except Exception: + logger.debug( + f"Unable to react to {developer_entity.id} about {modname}", + exc_info=True, + ) @loader.loop(interval=3, wait_before=True, autostart=True) async def _config_autosaver(self): @@ -1002,14 +1025,33 @@ class LoaderMod(loader.Module): if cmd in instance.commands: self.allmodules.add_alias(alias, cmd) - if message is None: - return - try: modname = instance.strings("name") except KeyError: modname = getattr(instance, "name", "ERROR") + try: + if developer in self._client._hikka_cache and getattr( + await self._client.get_entity(developer), "left", True + ): + developer_entity = await self._client.force_get_entity(developer) + else: + developer_entity = await self._client.get_entity(developer) + except Exception: + developer_entity = None + + if not isinstance(developer_entity, Channel): + developer_entity = None + + if ( + developer_entity is not None + and f"{developer_entity.id}/{modname}" not in self.get("reacted", []) + ): + self._react_queue += [(developer_entity, modname)] + + if message is None: + return + modhelp = "" if instance.__doc__: @@ -1053,20 +1095,8 @@ class LoaderMod(loader.Module): if developer.startswith("@") and developer not in self.get( "do_not_subscribe", [] ): - try: - if developer in self._client._hikka_cache and getattr( - await self._client.get_entity(developer), "left", True - ): - developer_entity = await self._client.force_get_entity( - developer - ) - else: - developer_entity = await self._client.get_entity(developer) - except Exception: - developer_entity = None - if ( - isinstance(developer_entity, Channel) + developer_entity and getattr(developer_entity, "left", True) and self._db.get(main.__name__, "suggest_subscribe", True) ): @@ -1094,17 +1124,9 @@ class LoaderMod(loader.Module): }, ] - try: - is_channel = isinstance( - await self._client.get_entity(developer), - Channel, - ) - except Exception: - is_channel = False - developer = self.strings("developer").format( utils.escape_html(developer) - if is_channel + if isinstance(developer_entity, Channel) else f"{utils.escape_html(developer)}" ) else: