import logging from aiogram import Router, F, types, Bot from aiogram.filters import Command from aiogram.fsm.context import FSMContext from typing import Optional from config.settings import Settings from bot.keyboards.inline.admin_keyboards import get_admin_panel_keyboard from bot.middlewares.i18n import JsonI18n from bot.services.panel_api_service import PanelApiService from . import broadcast as admin_broadcast_handlers from . import promo_codes as admin_promo_handlers from . import user_management as admin_user_mgmnt_handlers from . import statistics as admin_stats_handlers from . import sync_admin as admin_sync_handlers from . import logs_admin as admin_logs_handlers router = Router(name="admin_common_router") @router.message(Command("admin")) async def admin_panel_command_handler(message: types.Message, settings: Settings, i18n_data: dict): current_lang = i18n_data.get("current_language", getattr(settings, 'DEFAULT_LANGUAGE', 'en')) i18n: Optional[JsonI18n] = i18n_data.get("i18n_instance") if not i18n: logging.error("i18n missing in admin_panel_command_handler") await message.answer("Language service error.") return _ = lambda key, **kwargs: i18n.gettext(current_lang, key, **kwargs) await message.answer(_(key="admin_panel_title"), reply_markup=get_admin_panel_keyboard( i18n, current_lang, settings)) @router.callback_query(F.data.startswith("admin_action:")) async def admin_panel_actions_callback_handler(callback: types.CallbackQuery, state: FSMContext, settings: Settings, i18n_data: dict, bot: Bot, panel_service: PanelApiService): action_parts = callback.data.split(":") action = action_parts[1] current_lang = i18n_data.get("current_language", getattr(settings, 'DEFAULT_LANGUAGE', 'en')) i18n: Optional[JsonI18n] = i18n_data.get("i18n_instance") if not i18n: logging.error("i18n missing in admin_panel_actions_callback_handler") await callback.answer("Language error.", show_alert=True) return _ = lambda key, **kwargs: i18n.gettext(current_lang, key, **kwargs) if not callback.message: logging.error( f"CallbackQuery {callback.id} from {callback.from_user.id} has no message for action {action}" ) await callback.answer("Error processing action: message context lost.", show_alert=True) return if action == "stats": await admin_stats_handlers.show_statistics_handler( callback, i18n_data, settings) elif action == "broadcast": await admin_broadcast_handlers.broadcast_message_prompt_handler( callback, state, i18n_data, settings) elif action == "create_promo": await admin_promo_handlers.create_promo_prompt_handler( callback, state, i18n_data, settings) elif action == "view_promos": await admin_promo_handlers.view_promo_codes_handler( callback, i18n_data, settings) elif action == "ban_user_prompt": await admin_user_mgmnt_handlers.ban_user_prompt_handler( callback, state, i18n_data, settings) elif action == "unban_user_prompt": await admin_user_mgmnt_handlers.unban_user_prompt_handler( callback, state, i18n_data, settings) elif action == "view_banned": await admin_user_mgmnt_handlers.view_banned_users_handler( callback, i18n_data, settings, state) elif action == "view_logs_menu": await admin_logs_handlers.display_logs_menu(callback, i18n_data, settings) elif action == "sync_panel": await admin_sync_handlers.sync_command_handler( callback.message, bot=bot, settings=settings, i18n_data=i18n_data, panel_service=panel_service) await callback.answer(_("admin_sync_initiated_from_panel")) elif action == "main": try: await callback.message.edit_text( _(key="admin_panel_title"), reply_markup=get_admin_panel_keyboard(i18n, current_lang, settings)) except Exception: await callback.message.answer( _(key="admin_panel_title"), reply_markup=get_admin_panel_keyboard(i18n, current_lang, settings)) await callback.answer() else: logging.warning( f"Unknown admin_action received: {action} from callback {callback.data}" ) await callback.answer(_("admin_unknown_action"), show_alert=True)