from aiogram.utils.keyboard import InlineKeyboardBuilder, InlineKeyboardButton from aiogram.types import InlineKeyboardMarkup, WebAppInfo from typing import Optional, List, Any import math from config.settings import Settings def get_admin_panel_keyboard(i18n_instance, lang: str, settings: Settings) -> InlineKeyboardMarkup: _ = lambda key, **kwargs: i18n_instance.gettext(lang, key, **kwargs) builder = InlineKeyboardBuilder() builder.button(text=_(key="admin_stats_button"), callback_data="admin_action:stats") builder.button(text=_(key="admin_broadcast_button"), callback_data="admin_action:broadcast") builder.button(text=_(key="admin_create_promo_button"), callback_data="admin_action:create_promo") builder.button(text=_(key="admin_view_promos_button"), callback_data="admin_action:view_promos") builder.button(text=_(key="admin_ban_user_button"), callback_data="admin_action:ban_user_prompt") builder.button(text=_(key="admin_unban_user_button"), callback_data="admin_action:unban_user_prompt") builder.button(text=_(key="admin_view_banned_users_button"), callback_data="admin_action:view_banned:0") builder.button(text=_(key="admin_view_logs_menu_button"), callback_data="admin_action:view_logs_menu") builder.button(text=_(key="admin_sync_panel_button"), callback_data="admin_action:sync_panel") builder.adjust(2, 2, 2, 2, 1) return builder.as_markup() def get_logs_menu_keyboard(i18n_instance, lang: str) -> InlineKeyboardMarkup: _ = lambda key, **kwargs: i18n_instance.gettext(lang, key, **kwargs) builder = InlineKeyboardBuilder() builder.button(text=_(key="admin_view_all_logs_button"), callback_data="admin_logs:view_all:0") builder.button(text=_(key="admin_view_user_logs_prompt_button"), callback_data="admin_logs:prompt_user") builder.row( InlineKeyboardButton(text=_(key="back_to_admin_panel_button"), callback_data="admin_action:main")) return builder.as_markup() def get_logs_pagination_keyboard( current_page: int, total_pages: int, base_callback_data: str, i18n_instance, lang: str, back_to_logs_menu: bool = False) -> InlineKeyboardMarkup: _ = lambda key, **kwargs: i18n_instance.gettext(lang, key, **kwargs) builder = InlineKeyboardBuilder() row_buttons = [] if current_page > 0: row_buttons.append( InlineKeyboardButton( text="⬅️ " + _("prev_page_button", default="Prev"), callback_data=f"{base_callback_data}:{current_page - 1}")) if current_page < total_pages - 1: row_buttons.append( InlineKeyboardButton( text=_("next_page_button", default="Next") + " ➡️", callback_data=f"{base_callback_data}:{current_page + 1}")) if row_buttons: builder.row(*row_buttons) if back_to_logs_menu: builder.row( InlineKeyboardButton(text=_(key="admin_logs_menu_title"), callback_data="admin_action:view_logs_menu")) else: builder.row( InlineKeyboardButton(text=_(key="back_to_admin_panel_button"), callback_data="admin_action:main")) return builder.as_markup() def get_banned_users_keyboard(users: List[Any], current_page: int, total_users_banned: int, i18n_instance, lang: str, settings: Settings) -> InlineKeyboardMarkup: _ = lambda key, **kwargs: i18n_instance.gettext(lang, key, **kwargs) builder = InlineKeyboardBuilder() page_size = settings.LOGS_PAGE_SIZE total_pages = math.ceil(total_users_banned / page_size) if page_size > 0 else 1 if total_users_banned == 0: total_pages = 1 for user_row in users: user_display = user_row['first_name'] or f"ID: {user_row['user_id']}" if user_row['username']: user_display += f" (@{user_row['username']})" else: user_display = f"ID: {user_row['user_id']}" if not user_row[ 'first_name'] else user_display builder.button(text=user_display, callback_data= f"admin_user_card:{user_row['user_id']}:{current_page}") pagination_row = [] if current_page > 0: pagination_row.append( InlineKeyboardButton( text="⬅️ " + _("prev_page_button", default="Prev"), callback_data=f"admin_action:view_banned:{current_page - 1}")) if (current_page + 1) * page_size < total_users_banned: pagination_row.append( InlineKeyboardButton( text=_("next_page_button", default="Next") + " ➡️", callback_data=f"admin_action:view_banned:{current_page + 1}")) if pagination_row: builder.row(*pagination_row) builder.row( InlineKeyboardButton(text=_(key="back_to_admin_panel_button"), callback_data="admin_action:main")) builder.adjust(1) return builder.as_markup() def get_user_card_keyboard(user_id: int, is_banned: bool, i18n_instance, lang: str, banned_list_page: int = 0) -> InlineKeyboardMarkup: _ = lambda key, **kwargs: i18n_instance.gettext(lang, key, **kwargs) builder = InlineKeyboardBuilder() if is_banned: builder.button( text=_(key="user_card_unban_button"), callback_data=f"admin_unban_confirm:{user_id}:{banned_list_page}") else: builder.button( text=_(key="user_card_ban_button"), callback_data=f"admin_ban_confirm:{user_id}:{banned_list_page}") builder.button( text=_(key="user_card_back_to_banned_list_button"), callback_data=f"admin_action:view_banned:{banned_list_page}") builder.button(text=_(key="back_to_admin_panel_button"), callback_data="admin_action:main") builder.adjust(1) return builder.as_markup() def get_confirmation_keyboard(yes_callback_data: str, no_callback_data: str, i18n_instance, lang: str) -> InlineKeyboardMarkup: _ = lambda key, **kwargs: i18n_instance.gettext(lang, key, **kwargs) builder = InlineKeyboardBuilder() builder.button(text=_(key="yes_button"), callback_data=yes_callback_data) builder.button(text=_(key="no_button"), callback_data=no_callback_data) return builder.as_markup() def get_broadcast_confirmation_keyboard(lang: str, i18n_instance) -> InlineKeyboardMarkup: _ = lambda key, **kwargs: i18n_instance.gettext(lang, key, **kwargs) builder = InlineKeyboardBuilder() builder.button(text=_(key="confirm_broadcast_send_button"), callback_data="broadcast_final_action:send") builder.button(text=_(key="cancel_broadcast_button"), callback_data="broadcast_final_action:cancel") builder.adjust(2) return builder.as_markup() def get_back_to_admin_panel_keyboard(lang: str, i18n_instance) -> InlineKeyboardMarkup: _ = lambda key, **kwargs: i18n_instance.gettext(lang, key, **kwargs) builder = InlineKeyboardBuilder() builder.button(text=_(key="back_to_admin_panel_button"), callback_data="admin_action:main") return builder.as_markup()