from typing import Any from aiogram.filters.callback_data import CallbackData from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup from aiogram.utils.keyboard import InlineKeyboardBuilder from handlers.buttons import BACK, MAIN_MENU from hooks.hook_buttons import insert_hook_buttons from hooks.hooks import run_hooks class AdminPanelCallback(CallbackData, prefix="admin_panel"): action: str page: int def __init__(self, /, **data: Any) -> None: if "page" not in data or data["page"] is None: data["page"] = 1 super().__init__(**data) async def build_panel_kb(admin_role: str) -> InlineKeyboardMarkup: builder = InlineKeyboardBuilder() is_super = admin_role == "superadmin" is_moderator = admin_role == "moderator" builder.row( InlineKeyboardButton( text="👤 Поиск пользователя", callback_data=AdminPanelCallback(action="search_user").pack(), ), InlineKeyboardButton( text="🔑 Поиск подписок", callback_data=AdminPanelCallback(action="search_key").pack(), ), ) if is_super: builder.row( InlineKeyboardButton( text="🖥️ Управление серверами", callback_data=AdminPanelCallback(action="clusters").pack(), ) ) builder.row( InlineKeyboardButton( text="💸Управление тарифами", callback_data=AdminPanelCallback(action="tariffs").pack(), ) ) builder.row( InlineKeyboardButton( text="🤖 Управление ботом", callback_data=AdminPanelCallback(action="management").pack(), ) ) builder.row( InlineKeyboardButton( text="📢 Рассылка", callback_data=AdminPanelCallback(action="sender").pack(), ), InlineKeyboardButton( text="🎟️ Купоны", callback_data=AdminPanelCallback(action="coupons").pack(), ), ) if is_super: builder.row( InlineKeyboardButton( text="🎁 Подарки", callback_data=AdminPanelCallback(action="gifts").pack(), ), InlineKeyboardButton( text="🧩 Мои модули", callback_data=AdminPanelCallback(action="modules").pack(), ), ) builder.row( InlineKeyboardButton( text="📊 Статистика", callback_data=AdminPanelCallback(action="stats").pack(), ), InlineKeyboardButton( text="📈 Аналитика", callback_data=AdminPanelCallback(action="ads").pack(), ), ) else: builder.row( InlineKeyboardButton( text="🎁 Подарки", callback_data=AdminPanelCallback(action="gifts").pack(), ) ) module_buttons = await run_hooks("admin_panel", admin_role=admin_role) builder = insert_hook_buttons(builder, module_buttons) if not is_moderator: builder.row( InlineKeyboardButton( text="⚙️ Настройки", callback_data=AdminPanelCallback(action="settings").pack(), ) ) builder.row(InlineKeyboardButton(text=MAIN_MENU, callback_data="profile")) markup = builder.as_markup() if is_super: ads_callback = AdminPanelCallback(action="ads").pack() emoji_button = InlineKeyboardButton( text="😀 Эмоджи", callback_data=AdminPanelCallback(action="emoji").pack(), ) inserted = False for index, row in enumerate(markup.inline_keyboard): for button in row: if getattr(button, "callback_data", None) == ads_callback: markup.inline_keyboard.insert(index + 1, [emoji_button]) inserted = True break if inserted: break if not inserted: markup.inline_keyboard.append([emoji_button]) return markup def build_restart_kb() -> InlineKeyboardMarkup: builder = InlineKeyboardBuilder() builder.button( text="✅ Да, перезагрузить", callback_data=AdminPanelCallback(action="restart_confirm").pack(), ) builder.row(build_admin_back_btn()) builder.adjust(1) return builder.as_markup() def build_admin_back_kb(action: str = "admin") -> InlineKeyboardMarkup: return build_admin_singleton_kb(BACK, action) def build_admin_singleton_kb(text: str, action: str) -> InlineKeyboardMarkup: builder = InlineKeyboardBuilder() builder.row(build_admin_btn(text, action)) return builder.as_markup() def build_admin_back_btn(action: str = "admin") -> InlineKeyboardButton: return build_admin_btn(BACK, action) def build_admin_btn(text: str, action: str) -> InlineKeyboardButton: return InlineKeyboardButton( text=text, callback_data=AdminPanelCallback(action=action).pack(), )