# █ █ ▀ █▄▀ ▄▀█ █▀█ ▀ # █▀█ █ █ █ █▀█ █▀▄ █ # © Copyright 2022 # https://t.me/hikariatama # # 🔒 Licensed under the GNU AGPLv3 # 🌐 https://www.gnu.org/licenses/agpl-3.0.html # meta pic: https://static.dan.tatar/dnd_statuses_icon.png # meta banner: https://mods.hikariatama.ru/badges/dnd_statuses.jpg # meta developer: @hikarimods # scope: hikka_only # scope: hikka_min 1.3.0 import asyncio import logging from telethon.tl.types import Message from .. import loader, utils logger = logging.getLogger(__name__) @loader.tds class StatusesMod(loader.Module): """AFK Module analog with extended functionality""" strings = { "name": "Statuses", "status_not_found": "🚫 Status not found", "status_set": "✅ Status set\n{}\nNotify: {}", "pzd_with_args": "🚫 Args are incorrect", "status_created": "✅ Status {} created\n{}\nNotify: {}", "status_removed": "✅ Status {} deleted", "no_status": "🚫 No status is active", "status_unset": "✅ Status removed", "available_statuses": "🦊 Available statuses:\n\n", } strings_ru = { "status_not_found": "🚫 Статус не найден", "status_set": "✅ Статус установлен\n{}\nУведомлять: {}", "pzd_with_args": "🚫 Неверные аргументы", "status_created": "✅ Статус {} создан\n{}\nУведомлять: {}", "status_removed": "✅ Статус {} удален", "no_status": "🚫 Сейчас нет активного статуса", "status_unset": "✅ Статус удален", "available_statuses": "🦊 Доступные статусы:\n\n", "_cmd_doc_status": " - Установить статус", "_cmd_doc_newstatus": ( " <уведомлять|0/1> <текст> - Создать новый статус\nПример:" " .newstatus test 1 Hello!" ), "_cmd_doc_delstatus": " - Удалить статус", "_cmd_doc_unstatus": "Удалить статус", "_cmd_doc_statuses": "Показать доступные статусы", "_cls_doc": "AFK модуль с расширенным функционалом", } strings_de = { "status_not_found": "🚫 Status nicht gefunden", "status_set": "✅ Status gesetzt\n{}\nBenachrichtigen: {}", "pzd_with_args": "🚫 Falsche Argumente", "status_created": ( "✅ Status {} erstellt\n{}\nBenachrichtigen: {}" ), "status_removed": "✅ Status {} gelöscht", "no_status": "🚫 Es ist kein Status aktiv", "status_unset": "✅ Status gelöscht", "available_statuses": "🦊 Verfügbarer Status:\n\n", "_cmd_doc_status": " - Setze Status", "_cmd_doc_newstatus": ( " - Erstelle neuen" " Status\nBeispiel: .newstatus test 1 Hallo!" ), "_cmd_doc_delstatus": " - Lösche Status", "_cmd_doc_unstatus": "Lösche Status", "_cmd_doc_statuses": "Zeige verfügbare Status", "_cls_doc": "AFK Modul mit erweitertem Funktionsumfang", } strings_uz = { "status_not_found": "🚫 Status topilmadi", "status_set": "✅ Status o'rnatildi\n{}\nBildirish: {}", "pzd_with_args": "🚫 Argumetlarni xato kiritdingiz", "status_created": ( "✅ Status {} yaratildi\n{}\nBildirish: {}" ), "status_removed": "✅ Status {} o'chirildi", "no_status": "🚫 Hozircha aktiv status yo'q", "status_unset": "✅ Status o'chirildi", "available_statuses": "🦊 Mavjud statuslar:\n\n", "_cmd_doc_status": " - Statusni o'rnatish", "_cmd_doc_newstatus": ( " - Yangi status yaratish\nMasalan:" " .newstatus test 1 Salom!" ), "_cmd_doc_delstatus": " - Statusni o'chirish", "_cmd_doc_unstatus": "Statusni o'chirish", "_cmd_doc_statuses": "Mavjud statuslarni ko'rsatish", "_cls_doc": "AFK moduli kengaytirilgan funktsiyalari bilan", } strings_tr = { "status_not_found": "🚫 Durum bulunamadı", "status_set": "✅ Durum ayarlandı\n{}\nBildirim: {}", "pzd_with_args": "🚫 Yanlış argümanlar", "status_created": ( "✅ Durum {} oluşturuldu\n{}\nBildirim: {}" ), "status_removed": "✅ Durum {} kaldırıldı", "no_status": "🚫 Şu anda aktif durum yok", "status_unset": "✅ Durum kaldırıldı", "available_statuses": "🦊 Mevcut durumlar:\n\n", "_cmd_doc_status": " - Durum ayarla", "_cmd_doc_newstatus": ( " - Yeni durum oluştur\nÖrnek:" " .newstatus test 1 Merhaba!" ), "_cmd_doc_delstatus": " - Durum kaldır", "_cmd_doc_unstatus": "Durum kaldır", "_cmd_doc_statuses": "Mevcut durumları göster", "_cls_doc": "AFK modülü genişletilmiş özelliklerle", } strings_hi = { "status_not_found": "🚫 स्थिति नहीं मिली", "status_set": "✅ स्थिति सेट की गई\n{}\nसूचित करना: {}", "pzd_with_args": "🚫 गलत तर्क", "status_created": ( "✅ स्थिति {} बनाया गया\n{}\nसूचित करना: {}" ), "status_removed": "✅ स्थिति {} हटाया गया", "no_status": "🚫 अभी कोई सक्रिय स्थिति नहीं है", "status_unset": "✅ स्थिति हटाया गया", "available_statuses": "🦊 उपलब्ध स्थितियां:\n\n", "_cmd_doc_status": " - स्थिति सेट करें", "_cmd_doc_newstatus": ( " <सूचित करना|0/1> <पाठ> - नया स्थिति बनाएं\nउदाहरण:" " .newstatus test 1 हैलो!" ), "_cmd_doc_delstatus": " - स्थिति हटाएं", "_cmd_doc_unstatus": "स्थिति हटाएं", "_cmd_doc_statuses": "उपलब्ध स्थितियों को दिखाएं", "_cls_doc": "एफके मॉड्यूल विस्तारित सुविधाओं के साथ", } def __init__(self): self._ratelimit = [] self._sent_messages = [] @loader.tag("only_messages", "in") async def watcher(self, message: Message): if not self.get("status", False): return if message.is_private: user = await message.get_sender() if user.id in self._ratelimit or user.is_self or user.bot or user.verified: return elif not message.mentioned: return chat = utils.get_chat_id(message) if chat in self._ratelimit: return m = await utils.answer( message, self.get("texts", {"": ""})[self.get("status", "")], ) self._sent_messages += [m] if not self.get("notif", {"": False})[self.get("status", "")]: await self._client.send_read_acknowledge( message.peer_id, clear_mentions=True, ) self._ratelimit += [chat] async def statuscmd(self, message: Message): """ - Set status""" args = utils.get_args_raw(message) if args not in self.get("texts", {}): await utils.answer(message, self.strings("status_not_found")) await asyncio.sleep(3) await message.delete() return self.set("status", args) self._ratelimit = [] await utils.answer( message, self.strings("status_set").format( utils.escape_html(self.get("texts", {})[args]), str(self.get("notif")[args]), ), ) async def newstatuscmd(self, message: Message): """ - New status Example: .newstatus test 1 Hello!""" args = utils.get_args_raw(message) args = args.split(" ", 2) if len(args) < 3: await utils.answer(message, self.strings("pzd_with_args")) await asyncio.sleep(3) await message.delete() return args[1] = args[1] in ["1", "true", "yes", "+"] texts = self.get("texts", {}) texts[args[0]] = args[2] self.set("texts", texts) notif = self.get("notif", {}) notif[args[0]] = args[1] self.set("notif", notif) await utils.answer( message, self.strings("status_created").format( utils.escape_html(args[0]), utils.escape_html(args[2]), args[1], ), ) async def delstatuscmd(self, message: Message): """ - Delete status""" args = utils.get_args_raw(message) if args not in self.get("texts", {}): await utils.answer(message, self.strings("status_not_found")) await asyncio.sleep(3) await message.delete() return texts = self.get("texts", {}) del texts[args] self.set("texts", texts) notif = self.get("notif", {}) del notif[args] self.set("notif", notif) await utils.answer( message, self.strings("status_removed").format(utils.escape_html(args)), ) async def unstatuscmd(self, message: Message): """Remove status""" if not self.get("status", False): await utils.answer(message, self.strings("no_status")) await asyncio.sleep(3) await message.delete() return self.set("status", False) self._ratelimit = [] for m in self._sent_messages: try: await m.delete() except Exception: logger.exception("Message not deleted due to") self._sent_messages = [] await utils.answer(message, self.strings("status_unset")) async def statusescmd(self, message: Message): """Show available statuses""" res = self.strings("available_statuses") for short_name, status in self.get("texts", {}).items(): res += ( f"{short_name} | Notify:" f" {self.get('notif', {})[short_name]}\n{status}\n➖➖➖➖➖➖➖➖➖\n" ) await utils.answer(message, res)