diff --git a/main.py b/main.py index 7597f7d..34ba444 100644 --- a/main.py +++ b/main.py @@ -46,7 +46,6 @@ import logging import sqlite3 import platform import subprocess -from pathlib import Path from pyrogram import Client, idle, errors from pyrogram.enums.parse_mode import ParseMode @@ -56,8 +55,9 @@ import requests from utils import config from utils.db import db from utils.misc import gitrepo, userbot_version -from utils.scripts import restart, load_module +from utils.scripts import restart from utils.rentry import rentry_cleanup_job +from utils.module import ModuleManager SCRIPT_PATH = os.path.dirname(os.path.realpath(__file__)) if SCRIPT_PATH != os.getcwd(): @@ -142,23 +142,8 @@ async def main(): restart() load_missing_modules() - success_modules = 0 - failed_modules = 0 - - for path in Path("modules").rglob("*.py"): - try: - await load_module( - path.stem, app, core="custom_modules" not in path.parent.parts - ) - except Exception: - logging.warning("Can't import module %s", path.stem, exc_info=True) - failed_modules += 1 - else: - success_modules += 1 - - logging.info("Imported %s modules", success_modules) - if failed_modules: - logging.warning("Failed to import %s modules", failed_modules) + module_manager = ModuleManager.get_instance() + await module_manager.load_modules(app) if info := db.get("core.updater", "restart_info"): text = { diff --git a/modules/help.py b/modules/help.py index 7c0ff3d..9a7ccf9 100644 --- a/modules/help.py +++ b/modules/help.py @@ -16,33 +16,19 @@ from pyrogram.types import Message from utils.misc import modules_help, prefix from utils.scripts import format_module_help, with_reply +from utils.module import ModuleManager -current_page = 0 -total_pages = 0 - - -async def send_page(message, module_list, page, total_page): - start_index = (page - 1) * 10 - end_index = start_index + 10 - page_modules = module_list[start_index:end_index] - text = "Help for Moon-Userbot\n" - text += f"For more help on how to use a command, type {prefix}help [module]\n\n" - text += f"Help Page No: {page}/{total_page}\n\n" - for module_name in page_modules: - commands = modules_help[module_name] - text += f"• {module_name.title()}: {', '.join([f'{prefix + cmd_name.split()[0]}' for cmd_name in commands.keys()])}\n" - text += f"\nThe number of modules in the userbot: {len(modules_help)}" - await message.edit(text, disable_web_page_preview=True) +module_manager = ModuleManager.get_instance() @Client.on_message(filters.command(["help", "h"], prefix) & filters.me) async def help_cmd(_, message: Message): + if not module_manager.help_navigator: + await message.edit("Help system is not initialized yet. Please wait...") + return + if len(message.command) == 1: - global current_page, total_pages - module_list = list(modules_help.keys()) - total_pages = (len(module_list) + 9) // 10 - current_page = 1 - await send_page(message, module_list, current_page, total_pages) + await module_manager.help_navigator.send_page(message) elif message.command[1].lower() in modules_help: await message.edit(format_module_help(message.command[1].lower(), prefix)) else: @@ -68,26 +54,25 @@ async def help_cmd(_, message: Message): @Client.on_message(filters.command(["pn", "pp", "pq"], prefix) & filters.me) @with_reply async def handle_navigation(_, message: Message): - if message.reply_to_message and "Help Page No:" in message.reply_to_message.text: - global current_page - if message.command[0].lower() == "pn": - if current_page < total_pages: - current_page += 1 - await send_page( - message, list(modules_help.keys()), current_page, total_pages - ) - return await message.reply_to_message.delete() + if not module_manager.help_navigator: + await message.edit("Help system is not initialized yet. Please wait...") + return + + reply_message = message.reply_to_message + if reply_message and "Help Page No:" in message.reply_to_message.text: + cmd = message.command[0].lower() + if cmd == "pn": + if module_manager.help_navigator.next_page(): + await module_manager.help_navigator.send_page(reply_message) + return await message.delete() await message.edit("No more pages available.") - elif message.command[0].lower() == "pp": - if current_page > 1: - current_page -= 1 - await send_page( - message, list(modules_help.keys()), current_page, total_pages - ) - return await message.reply_to_message.delete() + elif cmd == "pp": + if module_manager.help_navigator.prev_page(): + await module_manager.help_navigator.send_page(reply_message) + return await message.delete() return await message.edit("This is the first page.") - elif message.command[0].lower() == "pq": - await message.reply_to_message.delete() + elif cmd == "pq": + await reply_message.delete() return await message.edit("Help closed.") diff --git a/utils/module.py b/utils/module.py new file mode 100644 index 0000000..6e51325 --- /dev/null +++ b/utils/module.py @@ -0,0 +1,78 @@ +import logging +from pathlib import Path +from typing import Optional + +from pyrogram import Client + +from utils.scripts import load_module +from utils.misc import modules_help + + +class ModuleManager: + _instance: Optional["ModuleManager"] = None + + def __init__(self): + self.success_modules = 0 + self.failed_modules = 0 + self.help_navigator = None + + @classmethod + def get_instance(cls) -> "ModuleManager": + if cls._instance is None: + cls._instance = ModuleManager() + return cls._instance + + async def load_modules(self, app: Client): + """Load all modules and initialize help navigator""" + for path in Path("modules").rglob("*.py"): + try: + await load_module( + path.stem, app, core="custom_modules" not in path.parent.parts + ) + except Exception: + logging.warning("Can't import module %s", path.stem, exc_info=True) + self.failed_modules += 1 + else: + self.success_modules += 1 + + logging.info("Imported %d modules", self.success_modules) + if self.failed_modules: + logging.warning("Failed to import %d modules", self.failed_modules) + + self.help_navigator = HelpNavigator() + return self.help_navigator + + +class HelpNavigator: + def __init__(self): + self.current_page = 1 + self.module_list = list(modules_help.keys()) + self.total_pages = (len(modules_help) + 9) // 10 + logging.info("Initialized HelpNavigator with %d modules", len(self.module_list)) + + async def send_page(self, message): + from utils.misc import prefix + + start_index = (self.current_page - 1) * 10 + end_index = start_index + 10 + page_modules = self.module_list[start_index:end_index] + text = "Help for Moon-Userbot\n" + text += f"For more help on how to use a command, type {prefix}help [module]\n\n" + text += f"Help Page No: {self.current_page}/{self.total_pages}\n\n" + for module_name in page_modules: + commands = modules_help[module_name] + text += f"• {module_name.title()}: {', '.join([f'{prefix + cmd_name.split()[0]}' for cmd_name in commands.keys()])}\n" + text += f"\nThe number of modules in the userbot: {len(modules_help)}" + await message.edit(text, disable_web_page_preview=True) + + def next_page(self) -> bool: + if self.current_page < self.total_pages: + self.current_page += 1 + return True + return False + + def prev_page(self) -> bool: + if self.current_page > 1: + self.current_page -= 1 + return True + return False