from aiogram.types import InlineKeyboardMarkup from aiogram.utils.keyboard import InlineKeyboardBuilder def _add_pagination_row( builder: InlineKeyboardBuilder, *, page_token: str | None, page_index: int, total_pages: int, ) -> None: if not page_token or total_pages <= 1: return if page_index > 0: builder.button(text="◀", callback_data=f"page:{page_token}:{page_index - 1}") builder.button( text=f"{page_index + 1}/{total_pages}", callback_data=f"page:{page_token}:{page_index}", ) if page_index + 1 < total_pages: builder.button(text="▶", callback_data=f"page:{page_token}:{page_index + 1}") def help_home_keyboard(is_admin: bool) -> InlineKeyboardMarkup: builder = InlineKeyboardBuilder() builder.button(text="Сегодня", callback_data="help:today") builder.button(text="Неделя", callback_data="help:week") builder.button(text="Самые шумные", callback_data="help:top") builder.button(text="Давно висят", callback_data="help:stale") if is_admin: builder.button(text="Админ-панель", callback_data="admin:open") builder.adjust(2, 2, 1) else: builder.adjust(2, 2) return builder.as_markup() def help_result_keyboard( back_callback: str, is_admin: bool, *, page_token: str | None = None, page_index: int = 0, total_pages: int = 1, ) -> InlineKeyboardMarkup: builder = InlineKeyboardBuilder() _add_pagination_row( builder, page_token=page_token, page_index=page_index, total_pages=total_pages, ) builder.button(text="Назад", callback_data=back_callback) builder.button(text="Главное меню", callback_data="help:open") if is_admin: builder.button(text="Админ-панель", callback_data="admin:open") if total_pages > 1: builder.adjust(3, 2, 1) else: builder.adjust(2, 1) else: if total_pages > 1: builder.adjust(3, 2) else: builder.adjust(2) return builder.as_markup() def admin_home_keyboard() -> InlineKeyboardMarkup: builder = InlineKeyboardBuilder() builder.button(text="Сводки", callback_data="admin:menu:overview") builder.button(text="Синхронизация", callback_data="admin:menu:sync") builder.button(text="Получатели", callback_data="admin:menu:recipients") builder.button(text="Администраторы", callback_data="admin:admins") builder.button(text="Routing и topics", callback_data="admin:ownership") builder.button(text="Mute rules", callback_data="admin:mute_list") builder.button(text="Инструкция", callback_data="admin:guide") builder.button(text="Пользовательское меню", callback_data="help:open") builder.adjust(2, 2, 2, 1, 1) return builder.as_markup() def admin_sync_keyboard() -> InlineKeyboardMarkup: builder = InlineKeyboardBuilder() builder.button(text="Запустить sync", callback_data="admin:sync") builder.button(text="Статус sync", callback_data="admin:sync_status") builder.button(text="Назад", callback_data="admin:open") builder.button(text="Пользовательское меню", callback_data="help:open") builder.adjust(2, 2) return builder.as_markup() def admin_overview_keyboard() -> InlineKeyboardMarkup: builder = InlineKeyboardBuilder() builder.button(text="Сегодня", callback_data="admin:today") builder.button(text="Неделя", callback_data="admin:week") builder.button(text="Самые шумные", callback_data="admin:top") builder.button(text="Давно висят", callback_data="admin:stale") builder.button(text="Назад", callback_data="admin:open") builder.adjust(2, 2, 1) return builder.as_markup() def admin_recipients_keyboard() -> InlineKeyboardMarkup: builder = InlineKeyboardBuilder() builder.button(text="Backend", callback_data="admin:recipients:backend") builder.button(text="Frontend", callback_data="admin:recipients:frontend") builder.button(text="Назад", callback_data="admin:open") builder.adjust(2, 1) return builder.as_markup() def admin_recipient_group_keyboard(group_name: str) -> InlineKeyboardMarkup: builder = InlineKeyboardBuilder() builder.button(text="Список", callback_data=f"admin:recipients:list:{group_name}") builder.button(text="Добавить ID", callback_data=f"admin:recipients:add:{group_name}") builder.button(text="Удалить ID", callback_data=f"admin:recipients:del:{group_name}") builder.button(text="Назад", callback_data="admin:menu:recipients") builder.adjust(2, 1, 1) return builder.as_markup() def admin_result_keyboard( back_callback: str, *, page_token: str | None = None, page_index: int = 0, total_pages: int = 1, ) -> InlineKeyboardMarkup: builder = InlineKeyboardBuilder() _add_pagination_row( builder, page_token=page_token, page_index=page_index, total_pages=total_pages, ) builder.button(text="Назад", callback_data=back_callback) builder.button(text="Админ-панель", callback_data="admin:open") builder.button(text="Пользовательское меню", callback_data="help:open") if total_pages > 1: builder.adjust(3, 2, 1) else: builder.adjust(2, 1) return builder.as_markup()