Spaces:
Running
Running
| # Ultroid - UserBot | |
| # Copyright (C) 2021-2025 TeamUltroid | |
| # | |
| # This file is a part of < https://github.com/TeamUltroid/Ultroid/ > | |
| # PLease read the GNU Affero General Public License in | |
| # <https://www.github.com/TeamUltroid/Ultroid/blob/main/LICENSE/>. | |
| from telethon.errors.rpcerrorlist import ( | |
| BotInlineDisabledError, | |
| BotInvalidError, | |
| BotMethodInvalidError, | |
| BotResponseTimeoutError, | |
| ) | |
| from telethon.tl.custom import Button | |
| from pyUltroid.dB._core import HELP, LIST | |
| from pyUltroid.fns.tools import cmd_regex_replace | |
| from . import HNDLR, LOGS, OWNER_NAME, asst, get_string, inline_pic, udB, ultroid_cmd | |
| def _build_help_menu(include_settings=True, include_manager=False): | |
| """Build the help menu dynamically, optionally including settings button and manager help""" | |
| menu = [ | |
| [ | |
| Button.inline(get_string("help_4"), data="uh_Official_"), | |
| Button.inline(get_string("help_5"), data="uh_Addons_"), | |
| ], | |
| ] | |
| # Manager Help button | |
| if include_manager: | |
| menu.append([Button.inline("• Manager Help •", "mngbtn")]) | |
| menu.append([ | |
| Button.inline(get_string("help_6"), data="uh_VCBot_"), | |
| Button.inline(get_string("help_7"), data="inlone"), | |
| ]) | |
| # Settings button only if bot is available | |
| settings_row = [Button.inline(get_string("help_8"), data="ownr")] | |
| if include_settings: | |
| try: | |
| if hasattr(asst, "me") and hasattr(asst.me, "username") and asst.me.username: | |
| settings_row.append( | |
| Button.url( | |
| get_string("help_9"), url=f"https://t.me/{asst.me.username}?start=set" | |
| ) | |
| ) | |
| except Exception: | |
| pass | |
| menu.append(settings_row) | |
| menu.append([Button.inline(get_string("help_10"), data="close")]) | |
| return menu | |
| async def _help(ult): | |
| plug = ult.pattern_match.group(1).strip() | |
| chat = await ult.get_chat() | |
| if plug: | |
| try: | |
| if plug in HELP["Official"]: | |
| output = f"**Plugin** - `{plug}`\n" | |
| for i in HELP["Official"][plug]: | |
| output += i | |
| output += "\n© @TeamUltroid" | |
| await ult.eor(output) | |
| elif HELP.get("Addons") and plug in HELP["Addons"]: | |
| output = f"**Plugin** - `{plug}`\n" | |
| for i in HELP["Addons"][plug]: | |
| output += i | |
| output += "\n© @TeamUltroid" | |
| await ult.eor(output) | |
| elif HELP.get("VCBot") and plug in HELP["VCBot"]: | |
| output = f"**Plugin** - `{plug}`\n" | |
| for i in HELP["VCBot"][plug]: | |
| output += i | |
| output += "\n© @TeamUltroid" | |
| await ult.eor(output) | |
| else: | |
| try: | |
| x = get_string("help_11").format(plug) | |
| for d in LIST[plug]: | |
| x += HNDLR + d | |
| x += "\n" | |
| x += "\n© @TeamUltroid" | |
| await ult.eor(x) | |
| except BaseException: | |
| file = None | |
| compare_strings = [] | |
| for file_name in LIST: | |
| compare_strings.append(file_name) | |
| value = LIST[file_name] | |
| for j in value: | |
| j = cmd_regex_replace(j) | |
| compare_strings.append(j) | |
| if j.strip() == plug: | |
| file = file_name | |
| break | |
| if not file: | |
| # the enter command/plugin name is not found | |
| text = f"`{plug}` is not a valid plugin!" | |
| best_match = None | |
| for _ in compare_strings: | |
| if plug in _ and not _.startswith("_"): | |
| best_match = _ | |
| break | |
| if best_match: | |
| text += f"\nDid you mean `{best_match}`?" | |
| return await ult.eor(text) | |
| output = f"**Command** `{plug}` **found in plugin** - `{file}`\n" | |
| if file in HELP["Official"]: | |
| for i in HELP["Official"][file]: | |
| output += i | |
| elif HELP.get("Addons") and file in HELP["Addons"]: | |
| for i in HELP["Addons"][file]: | |
| output += i | |
| elif HELP.get("VCBot") and file in HELP["VCBot"]: | |
| for i in HELP["VCBot"][file]: | |
| output += i | |
| output += "\n© @TeamUltroid" | |
| await ult.eor(output) | |
| except BaseException as er: | |
| LOGS.exception(er) | |
| await ult.eor("Error 🤔 occured.") | |
| else: | |
| # Check if asst is actually a bot before trying inline_query | |
| is_bot = False | |
| try: | |
| # Check if asst has bot token (_bot attribute) or if me.bot is True | |
| is_bot = (hasattr(asst, "_bot") and asst._bot) or (hasattr(asst, "me") and hasattr(asst.me, "bot") and asst.me.bot) | |
| except Exception: | |
| pass | |
| if not is_bot: | |
| # asst is not a bot, fallback to button-based help menu | |
| z = [] | |
| for x in LIST.values(): | |
| z.extend(x) | |
| cmd = len(z) + 10 | |
| include_manager = bool(udB.get_key("MANAGER") and udB.get_key("DUAL_HNDLR") == "/") | |
| help_menu = _build_help_menu(include_settings=False, include_manager=include_manager) | |
| return await ult.reply( | |
| get_string("inline_4").format( | |
| OWNER_NAME, | |
| len(HELP["Official"]), | |
| len(HELP["Addons"] if "Addons" in HELP else []), | |
| cmd, | |
| ), | |
| file=inline_pic(), | |
| buttons=help_menu, | |
| ) | |
| try: | |
| results = await ult.client.inline_query(asst.me.username, "ultd") | |
| except BotInvalidError: | |
| # Bot is invalid, fallback to button-based help menu | |
| z = [] | |
| for x in LIST.values(): | |
| z.extend(x) | |
| cmd = len(z) + 10 | |
| include_manager = bool(udB.get_key("MANAGER") and udB.get_key("DUAL_HNDLR") == "/") | |
| help_menu = _build_help_menu(include_settings=False, include_manager=include_manager) | |
| return await ult.reply( | |
| get_string("inline_4").format( | |
| OWNER_NAME, | |
| len(HELP["Official"]), | |
| len(HELP["Addons"] if "Addons" in HELP else []), | |
| cmd, | |
| ), | |
| file=inline_pic(), | |
| buttons=help_menu, | |
| ) | |
| except BotMethodInvalidError: | |
| z = [] | |
| for x in LIST.values(): | |
| z.extend(x) | |
| cmd = len(z) + 10 | |
| include_manager = bool(udB.get_key("MANAGER") and udB.get_key("DUAL_HNDLR") == "/") | |
| help_menu = _build_help_menu(include_settings=False, include_manager=include_manager) | |
| return await ult.reply( | |
| get_string("inline_4").format( | |
| OWNER_NAME, | |
| len(HELP["Official"]), | |
| len(HELP["Addons"] if "Addons" in HELP else []), | |
| cmd, | |
| ), | |
| file=inline_pic(), | |
| buttons=help_menu, | |
| ) | |
| except BotResponseTimeoutError: | |
| return await ult.eor( | |
| get_string("help_2").format(HNDLR), | |
| ) | |
| except BotInlineDisabledError: | |
| return await ult.eor(get_string("help_3")) | |
| await results[0].click(chat.id, reply_to=ult.reply_to_msg_id, hide_via=True) | |
| await ult.delete() | |