""" Клавиатуры для админа """ from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton from aiogram.utils.keyboard import InlineKeyboardBuilder, ReplyKeyboardBuilder from aiogram.types import ReplyKeyboardMarkup, KeyboardButton from typing import Optional def get_admin_main_menu() -> InlineKeyboardMarkup: """Главное меню админа (inline)""" builder = InlineKeyboardBuilder() builder.row( InlineKeyboardButton(text='📊 Статистика', callback_data='admin_stats'), InlineKeyboardButton(text='🕵️ Шпионы', callback_data='admin_spies'), ) builder.row( InlineKeyboardButton(text='👥 Пользователи', callback_data='admin_users'), InlineKeyboardButton(text='⏳ Непроверенные', callback_data='admin_unverified'), ) builder.row( InlineKeyboardButton(text='🏆 Рейтинг', callback_data='admin_rating'), InlineKeyboardButton(text='☠️ Токсичность', callback_data='admin_toxicity'), ) builder.row( InlineKeyboardButton(text='🏠 Квартиры', callback_data='admin_apartments'), InlineKeyboardButton(text='⚠️ Предупреждения', callback_data='admin_warnings'), ) builder.row( InlineKeyboardButton(text='🔇 Муты', callback_data='admin_muted'), InlineKeyboardButton(text='🚫 Баны', callback_data='admin_banned'), ) builder.row( InlineKeyboardButton(text='🔍 Поиск', callback_data='admin_search'), InlineKeyboardButton(text='👤 Действия', callback_data='admin_user_actions'), ) builder.row( InlineKeyboardButton(text='📥 Экспорт', callback_data='admin_export'), InlineKeyboardButton(text='📤 Рассылка', callback_data='admin_broadcast'), ) builder.row( InlineKeyboardButton(text='🚫 Отозвать вериф.', callback_data='admin_unverify'), InlineKeyboardButton(text='📋 Список не вериф.', callback_data='admin_unverified_list'), ) builder.row( InlineKeyboardButton(text='❓ Помощь', callback_data='admin_help'), ) return builder.as_markup() def get_admin_reply_menu() -> ReplyKeyboardMarkup: """Главное меню админа (reply - кнопки под полем ввода)""" builder = ReplyKeyboardBuilder() builder.row( KeyboardButton(text='📊 Статистика'), KeyboardButton(text='🕵️ Шпионы'), ) builder.row( KeyboardButton(text='👥 Пользователи'), KeyboardButton(text='⏳ Непроверенные'), ) builder.row( KeyboardButton(text='🏠 Квартиры'), KeyboardButton(text='⚠️ Предупреждения'), ) builder.row( KeyboardButton(text='🏆 Рейтинг'), KeyboardButton(text='📥 Экспорт'), ) builder.row( KeyboardButton(text='📤 Рассылка'), ) builder.row( KeyboardButton(text='🚫 Отозвать вериф.'), KeyboardButton(text='📋 Не верифицированные'), ) builder.row( KeyboardButton(text='❓ Помощь'), ) return builder.as_markup(resize_keyboard=True) def get_admin_help_menu() -> InlineKeyboardMarkup: """Меню помощи админа""" builder = InlineKeyboardBuilder() builder.button(text='🔙 Назад', callback_data='admin_menu') return builder.as_markup() def get_admin_apartments_menu() -> InlineKeyboardMarkup: """Меню квартир""" builder = InlineKeyboardBuilder() builder.row( InlineKeyboardButton(text='📊 Статистика квартир', callback_data='admin_apt_stats'), ) builder.row( InlineKeyboardButton(text='🔙 Назад', callback_data='admin_menu'), ) return builder.as_markup() def get_admin_warnings_menu() -> InlineKeyboardMarkup: """Меню предупреждений""" builder = InlineKeyboardBuilder() builder.row( InlineKeyboardButton(text='📋 Список предупреждений', callback_data='admin_warn_list'), ) builder.row( InlineKeyboardButton(text='🔙 Назад', callback_data='admin_menu'), ) return builder.as_markup() def get_admin_rating_menu() -> InlineKeyboardMarkup: """Меню рейтинга""" builder = InlineKeyboardBuilder() builder.row( InlineKeyboardButton(text='🏆 Топ-10', callback_data='admin_top'), InlineKeyboardButton(text='📊 Уровни', callback_data='admin_rank'), ) builder.row( InlineKeyboardButton(text='🔙 Назад', callback_data='admin_menu'), ) return builder.as_markup() def get_admin_toxicity_menu() -> InlineKeyboardMarkup: """Меню токсичности""" builder = InlineKeyboardBuilder() builder.row( InlineKeyboardButton(text='☠️ Топ токсичных', callback_data='admin_toxic_top'), InlineKeyboardButton(text='📊 Статистика', callback_data='admin_toxic_stats'), ) builder.row( InlineKeyboardButton(text='🔙 Назад', callback_data='admin_menu'), ) return builder.as_markup() def get_admin_search_menu() -> InlineKeyboardMarkup: """Меню поиска""" builder = InlineKeyboardBuilder() builder.row( InlineKeyboardButton(text='🏠 Поиск квартиры', callback_data='admin_search_apt'), InlineKeyboardButton(text='👤 Поиск пользователя', callback_data='admin_search_user'), ) builder.row( InlineKeyboardButton(text='🔙 Назад', callback_data='admin_menu'), ) return builder.as_markup() def get_user_pagination_keyboard( users: list, page: int = 0, page_size: int = 20, action_prefix: str = 'user_action' ) -> InlineKeyboardMarkup: """ Клавиатура с пагинацией для списка пользователей :param users: список пользователей (User модели) :param page: текущая страница (0-based) :param page_size: размер страницы :param action_prefix: префикс для callback_data """ builder = InlineKeyboardBuilder() total_pages = (len(users) + page_size - 1) // page_size # Получаем пользователей для текущей страницы start_idx = page * page_size end_idx = min(start_idx + page_size, len(users)) page_users = users[start_idx:end_idx] # Кнопки для каждого пользователя for user in page_users: status = '✅' if user.verified else '⏳' name = user.full_name or f'user{user.user_id}' apt = f' (кв. {user.apartment})' if user.apartment else '' button_text = f"{status} {name}{apt} | {user.user_id}" builder.button( text=button_text, callback_data=f'{action_prefix}_{user.user_id}' ) # Кнопки навигации nav_buttons = [] if page > 0: nav_buttons.append(InlineKeyboardButton(text='⬅️ Назад', callback_data=f'{action_prefix}_page_{page - 1}')) if page < total_pages - 1: nav_buttons.append(InlineKeyboardButton(text='Вперёд ➡️', callback_data=f'{action_prefix}_page_{page + 1}')) if nav_buttons: builder.row(*nav_buttons) # Инфо о странице builder.row( InlineKeyboardButton(text=f'📄 Стр. {page + 1}/{total_pages}', callback_data='page_info'), InlineKeyboardButton(text='🔙 Назад', callback_data='admin_menu'), ) return builder.as_markup() def get_user_action_menu(user_id: int, user_name: str, apartment: Optional[str] = None) -> InlineKeyboardMarkup: """ Меню действий с пользователем :param user_id: ID пользователя :param user_name: имя пользователя :param apartment: номер квартиры """ builder = InlineKeyboardBuilder() apt_info = f' (кв. {apartment})' if apartment else '' builder.row( InlineKeyboardButton(text=f'👤 {user_name}{apt_info}', callback_data='user_info_label'), ) builder.row( InlineKeyboardButton(text=f'ID: {user_id}', callback_data='user_id_label'), ) builder.row( InlineKeyboardButton(text='⚠️ Предупредить', callback_data=f'user_warn_{user_id}'), InlineKeyboardButton(text='🚫 Забанить', callback_data=f'user_ban_{user_id}'), ) builder.row( InlineKeyboardButton(text='✅ Разбанить', callback_data=f'user_unban_{user_id}'), InlineKeyboardButton(text='🔓 Снять вериф.', callback_data=f'user_revoke_{user_id}'), ) builder.row( InlineKeyboardButton(text='⏳ Отозвать (7д)', callback_data=f'user_unverify_{user_id}'), InlineKeyboardButton(text='📊 Рейтинг', callback_data=f'user_rating_{user_id}'), ) builder.row( InlineKeyboardButton(text='📝 История', callback_data=f'user_history_{user_id}'), InlineKeyboardButton(text='📞 Телефон', callback_data=f'user_phone_{user_id}'), ) builder.row( InlineKeyboardButton(text='🔙 Назад к списку', callback_data='admin_user_actions'), InlineKeyboardButton(text='🔙 В меню', callback_data='admin_menu'), ) return builder.as_markup() def get_admin_antispam_menu() -> InlineKeyboardMarkup: """Меню анти-спама/анти-мата""" builder = InlineKeyboardBuilder() builder.row( InlineKeyboardButton(text='📋 Стоп-слова', callback_data='admin_bad_words'), InlineKeyboardButton(text='🌐 Домены', callback_data='admin_bad_domains'), ) builder.row( InlineKeyboardButton(text='🔑 Паттерны', callback_data='admin_bad_patterns'), InlineKeyboardButton(text='🔑 Ключевые слова', callback_data='admin_bad_keywords'), ) builder.row( InlineKeyboardButton(text='🔙 Назад', callback_data='admin_menu'), ) return builder.as_markup() def get_bad_words_list_keyboard(words: list, page: int = 0, page_size: int = 20) -> InlineKeyboardMarkup: """Клавиатура со списком стоп-слов""" builder = InlineKeyboardBuilder() total_pages = (len(words) + page_size - 1) // page_size if words else 1 start_idx = page * page_size end_idx = min(start_idx + page_size, len(words)) page_words = words[start_idx:end_idx] for word in page_words: builder.button( text=f'❌ {word}', callback_data=f'badword_del_{word}' ) builder.row( InlineKeyboardButton(text='➕ Добавить слово', callback_data='badword_add'), ) nav_buttons = [] if page > 0: nav_buttons.append(InlineKeyboardButton(text='⬅️', callback_data=f'badwords_page_{page - 1}')) if page < total_pages - 1: nav_buttons.append(InlineKeyboardButton(text='➡️', callback_data=f'badwords_page_{page + 1}')) if nav_buttons: builder.row(*nav_buttons) builder.row( InlineKeyboardButton(text='🔙 Назад', callback_data='admin_warnings'), ) return builder.as_markup() def get_yes_no_keyboard(callback_prefix: str) -> InlineKeyboardMarkup: """Клавиатура Да/Нет с кастомным префиксом""" builder = InlineKeyboardBuilder() builder.row( InlineKeyboardButton(text='✅ Да', callback_data=f'{callback_prefix}_yes'), InlineKeyboardButton(text='❌ Нет', callback_data=f'{callback_prefix}_no'), ) return builder.as_markup() def get_back_keyboard(back_callback: str = 'admin_menu') -> InlineKeyboardMarkup: """Простая клавиатура с кнопкой Назад""" builder = InlineKeyboardBuilder() builder.row( InlineKeyboardButton(text='🔙 Назад', callback_data=back_callback), ) return builder.as_markup()