# █ █ ▀ █▄▀ ▄▀█ █▀█ ▀
# █▀█ █ █ █ █▀█ █▀▄ █
# © 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)