# ©️ Dan Gazizullin, 2021-2023 # This file is a part of Hikka Userbot # 🌐 https://github.com/hikariatama/Hikka # You can redistribute it and/or modify it under the terms of the GNU AGPLv3 # 🔑 https://www.gnu.org/licenses/agpl-3.0.html import re import difflib import inspect import logging from hikkatl.extensions.html import CUSTOM_EMOJIS from hikkatl.tl.types import Message from .. import loader, utils logger = logging.getLogger(__name__) @loader.tds class Help(loader.Module): """Shows help for modules and commands""" strings = {"name": "Help"} def __init__(self): self.config = loader.ModuleConfig( loader.ConfigValue( "core_emoji", "▪️", lambda: "Core module bullet", ), loader.ConfigValue( "plain_emoji", "▪️", lambda: "Plain module bullet", ), loader.ConfigValue( "empty_emoji", "🟠", lambda: "Empty modules bullet", ), loader.ConfigValue( "desc_icon", "🪐", lambda: "Desc emoji", ), ) @loader.command(ru_doc="[args] | Спрячет ваши модули", ua_doc="[args] | Сховає ваші модулі", de_doc="[args] | Versteckt Ihre Module") async def helphide(self, message: Message): """[args] | hide your modules""" if not (modules := utils.get_args(message)): await utils.answer(message, self.strings("no_mod")) return currently_hidden = self.get("hide", []) hidden, shown = [], [] for module in filter(lambda module: self.lookup(module), modules): module = self.lookup(module) module = module.__class__.__name__ if module in currently_hidden: currently_hidden.remove(module) shown += [module] else: currently_hidden += [module] hidden += [module] self.set("hide", currently_hidden) await utils.answer( message, self.strings("hidden_shown").format( len(hidden), len(shown), "\n".join([f"👁‍🗨 {m}" for m in hidden]), "\n".join([f"👁 {m}" for m in shown]), ), ) def find_aliases(self, command: str) -> list: """Find aliases for command""" aliases = [] _command = self.allmodules.commands[command] if getattr(_command, "alias", None) and not ( aliases := getattr(_command, "aliases", None) ): aliases = [_command.alias] return aliases or [] async def modhelp(self, message: Message, args: str): exact = True if not (module := self.lookup(args)): if method := self.allmodules.dispatch( args.lower().strip(self.get_prefix()) )[1]: module = method.__self__ else: module = self.lookup( next( ( reversed( sorted( [ module.strings["name"] for module in self.allmodules.modules ], key=lambda x: difflib.SequenceMatcher( None, args.lower(), x, ).ratio(), ) ) ), None, ) ) exact = False try: name = module.strings("name") except (KeyError, AttributeError): name = getattr(module, "name", "ERROR") _name = ( "{} (v{}.{}.{})".format( utils.escape_html(name), module.__version__[0], module.__version__[1], module.__version__[2], ) if hasattr(module, "__version__") else utils.escape_html(name) ) reply = "{} {}:".format( "🪐", _name, "" ) if module.__doc__: reply += ( "\nℹ️ " + utils.escape_html(inspect.getdoc(module)) + "\n" ) commands = { name: func for name, func in module.commands.items() if await self.allmodules.check_security(message, func) } if hasattr(module, "inline_handlers"): for name, fun in module.inline_handlers.items(): reply += ( "\n🤖" " {} {}".format( f"@{self.inline.bot_username} {name}", ( utils.escape_html(inspect.getdoc(fun)) if fun.__doc__ else self.strings("undoc") ), ) ) for name, fun in commands.items(): reply += ( "\n▫️" " {}{}{} {}".format( utils.escape_html(self.get_prefix()), name, ( " ({})".format( ", ".join( "{}{}".format( utils.escape_html(self.get_prefix()), alias, ) for alias in self.find_aliases(name) ) ) if self.find_aliases(name) else "" ), ( utils.escape_html(inspect.getdoc(fun)) if fun.__doc__ else self.strings("undoc") ), ) ) await utils.answer( message, reply + (f"\n\n{self.strings('not_exact')}" if not exact else "") + ( f"\n\n{self.strings('core_notice')}" if module.__origin__.startswith("