diff --git a/handlers/pay.py b/handlers/pay.py index 5c58d30a..22ce7c67 100644 --- a/handlers/pay.py +++ b/handlers/pay.py @@ -53,6 +53,8 @@ from handlers.payments.wata import process_callback_pay_wata from handlers.payments.yookassa_pay import process_callback_pay_yookassa from handlers.payments.yoomoney_pay import process_callback_pay_yoomoney from handlers.texts import BALANCE_MANAGEMENT_TEXT, PAYMENT_METHODS_MSG +from hooks.hook_buttons import insert_hook_buttons +from hooks.hooks import run_hooks from .utils import edit_or_send_message @@ -115,6 +117,9 @@ async def handle_pay(callback_query: CallbackQuery, state: FSMContext, session: if DONATIONS_ENABLE: builder.row(InlineKeyboardButton(text="πŸ’° ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚", callback_data="donate")) + module_buttons = await run_hooks("pay_menu_buttons", chat_id=callback_query.from_user.id, admin=False, session=session) + builder = insert_hook_buttons(builder, module_buttons) + builder.row(InlineKeyboardButton(text=MAIN_MENU, callback_data="profile")) await edit_or_send_message( diff --git a/utils/modules_loader.py b/utils/modules_loader.py index 044e0f85..218f2a27 100644 --- a/utils/modules_loader.py +++ b/utils/modules_loader.py @@ -28,3 +28,27 @@ def load_modules_from_folder(folder: str = "modules") -> list[Router]: except Exception as e: logger.error(f"[Modules] Ошибка ΠΏΡ€ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ {module_path}: {e}") return routers + + +def load_module_webhooks(folder: str = "modules") -> list[dict]: + webhooks = [] + base_path = Path(folder) + + if not base_path.exists(): + logger.warning(f"[Modules] Папка {folder} Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Π°, пропускаСм Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ Π²Π΅Π±Ρ…ΡƒΠΊΠΎΠ².") + return [] + + for _finder, name, _ispkg in pkgutil.iter_modules([str(base_path)]): + module_path = f"{folder}.{name}" + try: + router_module = importlib.import_module(f"{module_path}.router") + if hasattr(router_module, "get_webhook_data"): + webhook_data = router_module.get_webhook_data() + if isinstance(webhook_data, dict) and "path" in webhook_data and "handler" in webhook_data: + webhooks.append(webhook_data) + logger.info(f"[Modules] НайдСн Π²Π΅Π±Ρ…ΡƒΠΊ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ {name}: {webhook_data['path']}") + + except Exception as e: + logger.error(f"[Modules] Ошибка ΠΏΡ€ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ Π²Π΅Π±Ρ…ΡƒΠΊΠΎΠ² ΠΈΠ· {module_path}: {e}") + + return webhooks diff --git a/web/__init__.py b/web/__init__.py index c8148319..8dd0f32b 100644 --- a/web/__init__.py +++ b/web/__init__.py @@ -6,6 +6,7 @@ from .heleket_payment import heleket_payment_webhook from .kassai_payment import kassai_payment_webhook from .tblocker import tblocker_webhook from .wata_payment import wata_payment_webhook +from utils.modules_loader import load_module_webhooks WATA_WEBHOOK_PATH = "/wata/webhook" @@ -18,3 +19,15 @@ async def register_web_routes(router: UrlDispatcher) -> None: router.add_post(WATA_WEBHOOK_PATH, wata_payment_webhook) router.add_post(KASSAI_WEBHOOK_PATH, kassai_payment_webhook) router.add_post(HELEKET_WEBHOOK_PATH, heleket_payment_webhook) + + try: + module_webhooks = load_module_webhooks() + + for webhook_data in module_webhooks: + path = webhook_data.get("path") + handler = webhook_data.get("handler") + if path and handler: + router.add_post(path, handler) + print(f"[Web] ЗарСгистрирован Π²Π΅Π±Ρ…ΡƒΠΊ модуля: {path}") + except Exception as e: + print(f"[Web] Ошибка ΠΏΡ€ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ Π²Π΅Π±Ρ…ΡƒΠΊΠΎΠ² ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ: {e}")