# На модуль распространяется лицензия "GNU General Public License v3.0" # https://github.com/all-licenses/GNU-General-Public-License-v3.0 # meta developer: @pymodule from hikkatl.types import Message from telethon.tl.functions.account import UpdateProfileRequest from .. import loader, utils import asyncio import random @loader.tds class AutoProfileMod(loader.Module): """Automatically update your profile description""" strings = { "name": "AutoProfile", "no_desc": "[AutoProfile] No saved descriptions!", "error": "[AutoProfile] Auto bio update error: {}", "enabled": "[AutoProfile] Auto bio enabled!", "disabled": "[AutoProfile] Auto bio disabled!", "usage": "[AutoProfile] Usage: .autodesc on/off", "desc_added": "[AutoProfile] Description added: {}", "desc_removed": "[AutoProfile] Description removed: {}", "invalid_number": "[AutoProfile] Invalid number!", "enter_number": "[AutoProfile] Enter a description number to delete!", "desc_list": "[AutoProfile] Description list:\n{}", "desc_empty": "[AutoProfile] No descriptions saved!", "enter_text": "[AutoProfile] Enter text to add!", "set_interval": "[AutoProfile] Update interval set: {} sec.", "enter_interval": "[AutoProfile] Enter interval in seconds!", } strings_ru = { "no_desc": "[AutoProfile] Нет сохранённых описаний!", "error": "[AutoProfile] Ошибка автообновления описания: {}", "enabled": "[AutoProfile] Автоописание включено!", "disabled": "[AutoProfile] Автоописание отключено!", "usage": "[AutoProfile] Использование: .autodesc on/off", "desc_added": "[AutoProfile] Описание добавлено: {}", "desc_removed": "[AutoProfile] Описание удалено: {}", "invalid_number": "[AutoProfile] Некорректный номер!", "enter_number": "[AutoProfile] Введите номер описания для удаления!", "desc_list": "[AutoProfile] Список описаний:\n{}", "desc_empty": "[AutoProfile] Список описаний пуст!", "enter_text": "[AutoProfile] Введите текст для добавления!", "set_interval": "[AutoProfile] Интервал смены установлен: {} сек.", "enter_interval": "[AutoProfile] Введите интервал в секундах!", } def __init__(self): self._task = None async def client_ready(self, client, db): self.client = client self.db = db self.config = loader.ModuleConfig( "enabled", False, "Auto bio enabled", "interval", 3600, "Interval in seconds", "descriptions", [], "List of descriptions" ) if self.config["enabled"]: self._task = asyncio.create_task(self._update_bio()) async def _update_bio(self): while self.config["enabled"]: descs = self.config["descriptions"] if not descs: await self.client.send_message("me", self.strings("no_desc")) return try: new_bio = random.choice(descs) await self.client(UpdateProfileRequest(about=new_bio[:70])) except Exception as e: await self.client.send_message("me", self.strings("error").format(str(e))) await asyncio.sleep(self.config["interval"]) @loader.command( ru_doc="Включить или отключить автоописание", en_doc="Enable or disable auto bio updates" ) async def autodesccmd(self, message: Message): """Toggle auto bio""" arg = utils.get_args_raw(message) if arg not in ["on", "off"]: await utils.answer(message, self.strings("usage")) return enabled = arg == "on" self.config["enabled"] = enabled if enabled: self._task = asyncio.create_task(self._update_bio()) await utils.answer(message, self.strings("enabled")) else: await utils.answer(message, self.strings("disabled")) @loader.command( ru_doc="Добавить описание: .adddesc <текст>", en_doc="Add a description: .adddesc " ) async def adddesccmd(self, message: Message): """Add description""" text = utils.get_args_raw(message) if not text: await utils.answer(message, self.strings("enter_text")) return self.config["descriptions"].append(text) await utils.answer(message, self.strings("desc_added").format(text)) @loader.command( ru_doc="Удалить описание по номеру: .deldesc <номер>", en_doc="Delete description by number: .deldesc " ) async def deldesccmd(self, message: Message): """Delete description""" args = utils.get_args_raw(message) if not args.isdigit(): await utils.answer(message, self.strings("enter_number")) return index = int(args) - 1 descs = self.config["descriptions"] if 0 <= index < len(descs): removed = descs.pop(index) await utils.answer(message, self.strings("desc_removed").format(removed)) else: await utils.answer(message, self.strings("invalid_number")) @loader.command( ru_doc="Показать список описаний", en_doc="Show list of descriptions" ) async def listdesccmd(self, message: Message): """List descriptions""" descs = self.config["descriptions"] if not descs: await utils.answer(message, self.strings("desc_empty")) return text = "\n".join([f"{i + 1}. {d}" for i, d in enumerate(descs)]) await utils.answer(message, self.strings("desc_list").format(text)) @loader.command( ru_doc="Установить интервал обновления: .setinterval <сек>", en_doc="Set update interval: .setinterval " ) async def setintervalcmd(self, message: Message): """Set update interval""" args = utils.get_args_raw(message) if not args.isdigit(): await utils.answer(message, self.strings("enter_interval")) return self.config["interval"] = int(args) await utils.answer(message, self.strings("set_interval").format(args))