# Friendly Telegram (telegram userbot) # Copyright (C) 2018-2021 The Authors # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # █ █ ▀ █▄▀ ▄▀█ █▀█ ▀ ▄▀█ ▀█▀ ▄▀█ █▀▄▀█ ▄▀█ # █▀█ █ █ █ █▀█ █▀▄ █ ▄ █▀█ █ █▀█ █ ▀ █ █▀█ # # © Copyright 2022 # # https://t.me/hikariatama # # 🔒 Licensed under the GNU GPLv3 # 🌐 https://www.gnu.org/licenses/agpl-3.0.html import os from telethon.tl.types import Message from .. import loader, main, translations, utils @loader.tds class CoreMod(loader.Module): """Control core userbot settings""" strings = { "name": "Settings", "too_many_args": "🚫 Too many args", "blacklisted": "✅ Chat {} blacklisted from userbot", "unblacklisted": "✅ Chat {} unblacklisted from userbot", "user_blacklisted": "✅ User {} blacklisted from userbot", "user_unblacklisted": "✅ User {} unblacklisted from userbot", "what_prefix": "❓ What should the prefix be set to?", "prefix_incorrect": "🚫 Prefix must be one symbol in length", "prefix_set": "✅ Command prefix updated. Type {newprefix}setprefix {oldprefix} to change it back", "alias_created": "✅ Alias created. Access it with {}", "aliases": "Aliases:\n", "no_command": "🚫 Command {} does not exist", "alias_args": "🚫 You must provide a command and the alias for it", "delalias_args": "🚫 You must provide the alias name", "alias_removed": "✅ Alias {} removed.", "no_alias": "🚫 Alias {} does not exist", "db_cleared": "✅ Database cleared", "hikka": "🌘 Hikka userbot\nVersion: {}.{}.{}", "check_url": "🚫 You need to specify valid url containing a langpack", "lang_saved": "{} Language saved!", "pack_saved": "✅ Translate pack saved!", "incorrect_language": "🚫 Incorrect language specified", "lang_removed": "✅ Translations reset to default ones", "check_pack": "🚫 Invalid pack format in url", } strings_ru = { "too_many_args": "🚫 Слишком много аргументов", "blacklisted": "✅ Чат {} добавлен в черный список юзербота", "unblacklisted": "✅ Чат {} удален из черного списка юзербота", "user_blacklisted": "✅ Пользователь {} добавлен в черный список юзербота", "user_unblacklisted": "✅ Пользователь {} удален из черного списка юзербота", "what_prefix": "❓ А какой префикс ставить то?", "prefix_incorrect": "🚫 Префикс должен быть лишь одним символом", "prefix_set": "✅ Префикс обновлен. Чтобы вернуть его, используй {newprefix}setprefix {oldprefix}", "alias_created": "✅ Алиас создан. Используй его через {}", "aliases": "Алиасы:\n", "no_command": "🚫 Команда {} не существует", "alias_args": "🚫 Требуется ввести команду и алиас для нее", "delalias_args": "🚫 Требуется имя алиаса", "alias_removed": "✅ Алиас {} удален.", "no_alias": "🚫 Алиас {} не существует", "db_cleared": "✅ База очищена", "hikka": "🌘 Hikka userbot\nВерсия: {}.{}.{}", "check_url": "🚫 Укажи правильную ссылку, ведущую на пак с переводом", "lang_saved": "{} Язык сохранен!", "pack_saved": "✅ Пак перевода сохранен!", "incorrect_language": "🚫 Указан неверный язык", "lang_removed": "✅ Переводы сброшены", "check_pack": "🚫 По ссылке находится неправильный пак", "_cmd_doc_hikka": "Показать версию Hikka", "_cmd_doc_blacklist": "Отключить бота где-либо", "_cmd_doc_unblacklist": "Включить бота где-либо", "_cmd_doc_blacklistuser": "Запретить пользователю выполнять все команды", "_cmd_doc_unblacklistuser": "Разрешить пользователю выполнять команды, на которые ему хватает разрешений", "_cmd_doc_setprefix": "Установить префикс", "_cmd_doc_aliases": "Показать алиасы", "_cmd_doc_addalias": "Установить алиас для команды", "_cmd_doc_delalias": "Удалить алиас для команды", "_cmd_doc_addtrnsl": "Установить пак перевода\n.addtrnsl <пак>\nТребуется перезагрузка после выполнения", "_cmd_doc_cleartrnsl": "Удалить все паки перевода", "_cmd_doc_setlang": "Выбрать предпочитаемый язык перевода\nТребуется перезагрузка после выполнения", "_cmd_doc_cleardb": "Сброс до заводских настроек - сброс базы данных", "_cls_doc": "Управление базовыми настройками юзербота", } async def client_ready(self, client, db): self._db = db self._client = client async def blacklistcommon(self, message: Message): args = utils.get_args(message) if len(args) > 2: await utils.answer(message, self.strings("too_many_args")) return chatid = None module = None if args: try: chatid = int(args[0]) except ValueError: module = args[0] if len(args) == 2: module = args[1] if chatid is None: chatid = utils.get_chat_id(message) module = self.allmodules.get_classname(module) return f"{str(chatid)}.{module}" if module else chatid async def hikkacmd(self, message: Message): """Get Hikka version""" await utils.answer(message, self.strings("hikka").format(*main.__version__)) async def blacklistcmd(self, message: Message): """Blacklist the bot from operating somewhere""" chatid = await self.blacklistcommon(message) self._db.set( main.__name__, "blacklist_chats", self._db.get(main.__name__, "blacklist_chats", []) + [chatid], ) await utils.answer(message, self.strings("blacklisted").format(chatid)) async def unblacklistcmd(self, message: Message): """Unblacklist the bot from operating somewhere""" chatid = await self.blacklistcommon(message) self._db.set( main.__name__, "blacklist_chats", list( set(self._db.get(main.__name__, "blacklist_chats", [])) - set([chatid]) ), ) await utils.answer(message, self.strings("unblacklisted").format(chatid)) async def getuser(self, message: Message): try: return int(utils.get_args(message)[0]) except (ValueError, IndexError): reply = await message.get_reply_message() if reply: return reply.sender_id if message.is_private: return message.to_id.user_id await utils.answer(message, self.strings("who_to_unblacklist")) return async def blacklistusercmd(self, message: Message): """Prevent this user from running any commands""" user = await self.getuser(message) self._db.set( main.__name__, "blacklist_users", self._db.get(main.__name__, "blacklist_users", []) + [user], ) await utils.answer(message, self.strings("user_blacklisted").format(user)) async def unblacklistusercmd(self, message: Message): """Allow this user to run permitted commands""" user = await self.getuser(message) self._db.set( main.__name__, "blacklist_users", list(set(self._db.get(main.__name__, "blacklist_users", [])) - set([user])), ) await utils.answer( message, self.strings("user_unblacklisted").format(user), ) @loader.owner async def setprefixcmd(self, message: Message): """Sets command prefix""" args = utils.get_args_raw(message) if not args: await utils.answer(message, self.strings("what_prefix")) return if len(args) != 1: await utils.answer(message, self.strings("prefix_incorrect")) return oldprefix = self.get_prefix() self._db.set(main.__name__, "command_prefix", args) await utils.answer( message, self.strings("prefix_set").format( newprefix=utils.escape_html(args[0]), oldprefix=utils.escape_html(oldprefix), ), ) @loader.owner async def aliasescmd(self, message: Message): """Print all your aliases""" aliases = self.allmodules.aliases string = self.strings("aliases") string += "\n".join([f"\n{i}: {y}" for i, y in aliases.items()]) await utils.answer(message, string) @loader.owner async def addaliascmd(self, message: Message): """Set an alias for a command""" args = utils.get_args(message) if len(args) != 2: await utils.answer(message, self.strings("alias_args")) return alias, cmd = args ret = self.allmodules.add_alias(alias, cmd) if ret: self._db.set( __name__, "aliases", { **self._db.get(__name__, "aliases"), alias: cmd, }, ) await utils.answer( message, self.strings("alias_created").format(utils.escape_html(alias)), ) else: await utils.answer( message, self.strings("no_command").format(utils.escape_html(cmd)), ) @loader.owner async def delaliascmd(self, message: Message): """Remove an alias for a command""" args = utils.get_args(message) if len(args) != 1: await utils.answer(message, self.strings("delalias_args")) return alias = args[0] ret = self.allmodules.remove_alias(alias) if ret: current = self._db.get(__name__, "aliases") del current[alias] self._db.set(__name__, "aliases", current) await utils.answer( message, self.strings("alias_removed").format(utils.escape_html(alias)), ) else: await utils.answer( message, self.strings("no_alias").format(utils.escape_html(alias)), ) async def dllangpackcmd(self, message: Message): """[link to a langpack | empty to remove] - Change Hikka translate pack (external)""" args = utils.get_args_raw(message) if not args: self._db.set(translations.__name__, "pack", False) await self.translator.init() await utils.answer(message, self.strings("lang_removed")) return if not utils.check_url(args): await utils.answer(message, self.strings("check_url")) return self._db.set(translations.__name__, "pack", args) success = await self.translator.init() await utils.answer( message, self.strings("pack_saved" if success else "check_pack") ) async def setlangcmd(self, message: Message): """[language] - Change default language""" args = utils.get_args_raw(message) if not args or len(args) != 2: await utils.answer(message, self.strings("incorrect_language")) return possible_pack_path = os.path.join( utils.get_base_dir(), f"langpacks/{args.lower()}.json", ) if os.path.isfile(possible_pack_path): self._db.set(translations.__name__, "pack", args.lower()) self._db.set(translations.__name__, "lang", args.lower()) await self.translator.init() await utils.answer( message, self.strings("lang_saved").format( utils.get_lang_flag(args.lower() if args.lower() != "en" else "gb") ), ) @loader.owner async def cleardbcmd(self, message: Message): """Clears the entire database, effectively performing a factory reset""" self._db.clear() self._db.save() await utils.answer(message, self.strings("db_cleared")) async def _client_ready2(self, client, db): # skicpq: PYL-W0613 ret = { alias: cmd for alias, cmd in db.get(__name__, "aliases", {}).items() if self.allmodules.add_alias(alias, cmd) } db.set(__name__, "aliases", ret)