from aiogram import types from aiogram.utils.keyboard import ReplyKeyboardBuilder, InlineKeyboardBuilder # Local imports - metrics from helper_bot.utils.metrics import ( track_time, track_errors ) def get_reply_keyboard_for_post(): builder = InlineKeyboardBuilder() builder.row(types.InlineKeyboardButton( text="Опубликовать", callback_data="publish"), types.InlineKeyboardButton( text="Отклонить", callback_data="decline") ) builder.row(types.InlineKeyboardButton( text="👮‍♂️ Забанить", callback_data="ban") ) markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) return markup async def get_reply_keyboard(db, user_id): builder = ReplyKeyboardBuilder() builder.row(types.KeyboardButton(text="📢Предложить свой пост")) builder.row(types.KeyboardButton(text="📩Связаться с админами")) builder.row(types.KeyboardButton(text=" 🎤Голосовой бот")) builder.row(types.KeyboardButton(text="👋🏼Сказать пока!")) if not await db.get_stickers_info(user_id): builder.row(types.KeyboardButton(text="🤪Хочу стикеры")) markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) return markup def get_reply_keyboard_leave_chat(): builder = ReplyKeyboardBuilder() builder.add(types.KeyboardButton(text="Выйти из чата")) markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) return markup def get_reply_keyboard_admin(): builder = ReplyKeyboardBuilder() builder.row( types.KeyboardButton(text="Бан (Список)"), types.KeyboardButton(text="Бан по нику"), types.KeyboardButton(text="Бан по ID") ) builder.row( types.KeyboardButton(text="Разбан (список)"), types.KeyboardButton(text="Вернуться в бота") ) markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) return markup @track_time("create_keyboard_with_pagination", "keyboard_service") @track_errors("keyboard_service", "create_keyboard_with_pagination") def create_keyboard_with_pagination(page: int, total_items: int, array_items: list, callback: str): """ Создает клавиатуру с пагинацией для заданного набора элементов и устанавливает необходимый callback Args: page: Номер текущей страницы (начинается с 1). total_items: Общее количество элементов. array_items: Лист кортежей. Содержит в себе user_name: user_id callback: Действие в коллбеке. Вернет callback вида ({callback}_{user_id}) Returns: InlineKeyboardMarkup: Клавиатура с кнопками пагинации. """ # Проверяем валидность входных данных if page < 1: page = 1 if not array_items: # Если нет элементов, возвращаем только кнопку "Назад" keyboard = InlineKeyboardBuilder() home_button = types.InlineKeyboardButton(text="🏠 Назад", callback_data="return") keyboard.row(home_button) return keyboard.as_markup() # Определяем общее количество страниц items_per_page = 9 total_pages = (total_items + items_per_page - 1) // items_per_page # Ограничиваем страницу максимальным значением if page > total_pages: page = total_pages # Создаем билдер для клавиатуры keyboard = InlineKeyboardBuilder() # Вычисляем стартовый номер для текущей страницы start_index = (page - 1) * items_per_page # Кнопки с элементами текущей страницы end_index = min(start_index + items_per_page, len(array_items)) current_row = [] for i in range(start_index, end_index): current_row.append(types.InlineKeyboardButton( text=f"{array_items[i][0]}", callback_data=f"{callback}_{array_items[i][1]}" )) # Когда набирается 3 кнопки, добавляем ряд if len(current_row) == 3: keyboard.row(*current_row) current_row = [] # Добавляем оставшиеся кнопки, если они есть if current_row: keyboard.row(*current_row) # Создаем кнопки навигации только если нужно navigation_buttons = [] # Кнопка "Предыдущая" - показываем только если не первая страница if page > 1: prev_button = types.InlineKeyboardButton( text="⬅️ Предыдущая", callback_data=f"page_{page - 1}" ) navigation_buttons.append(prev_button) # Кнопка "Следующая" - показываем только если не последняя страница if page < total_pages: next_button = types.InlineKeyboardButton( text="➡️ Следующая", callback_data=f"page_{page + 1}" ) navigation_buttons.append(next_button) # Добавляем кнопки навигации, если они есть if navigation_buttons: keyboard.row(*navigation_buttons) # Кнопка "Назад" home_button = types.InlineKeyboardButton(text="🏠 Назад", callback_data="return") keyboard.row(home_button) return keyboard.as_markup() def create_keyboard_for_ban_reason(): builder = ReplyKeyboardBuilder() builder.add(types.KeyboardButton(text="Спам")) builder.add(types.KeyboardButton(text="Заебал стикерами")) builder.row(types.KeyboardButton(text="Реклама здесь: @kerrad1 ")) builder.row(types.KeyboardButton(text="Тема с лагерями: https://vk.com/topic-75343895_50049913")) builder.row(types.KeyboardButton(text="Отменить")) markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) return markup def create_keyboard_for_ban_days(): builder = ReplyKeyboardBuilder() builder.add(types.KeyboardButton(text="1")) builder.add(types.KeyboardButton(text="7")) builder.add(types.KeyboardButton(text="30")) builder.row(types.KeyboardButton(text="Навсегда")) builder.row(types.KeyboardButton(text="Отменить")) markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) return markup def create_keyboard_for_approve_ban(): builder = ReplyKeyboardBuilder() builder.add(types.KeyboardButton(text="Подтвердить")) builder.add(types.KeyboardButton(text="Отменить")) markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) return markup def get_main_keyboard(): builder = ReplyKeyboardBuilder() # Первая строка: Высказаться и послушать builder.row( types.KeyboardButton(text="🎤Высказаться"), types.KeyboardButton(text="🎧Послушать") ) # Вторая строка: сбросить прослушивания и узнать эмодзи builder.row( types.KeyboardButton(text="🔄Сбросить прослушивания"), types.KeyboardButton(text="😊Узнать эмодзи") ) # Третья строка: Вернуться в меню builder.row(types.KeyboardButton(text="Отменить")) markup = builder.as_markup(resize_keyboard=True) return markup def get_reply_keyboard_for_voice(): builder = InlineKeyboardBuilder() builder.row(types.InlineKeyboardButton( text="Сохранить", callback_data="save") ) builder.row(types.InlineKeyboardButton( text="Удалить", callback_data="delete") ) markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) return markup