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