initial commit

This commit is contained in:
2025-12-25 15:25:46 +03:00
commit 58827ac124
20 changed files with 1854 additions and 0 deletions

19
keyboards/__init__.py Normal file
View File

@@ -0,0 +1,19 @@
"""Модуль клавиатур бота"""
from keyboards.inline import (
get_auth_menu,
get_main_menu,
get_book_keyboard,
get_pagination_keyboard,
get_genres_keyboard,
get_back_to_menu_keyboard
)
__all__ = [
'get_auth_menu',
'get_main_menu',
'get_book_keyboard',
'get_pagination_keyboard',
'get_genres_keyboard',
'get_back_to_menu_keyboard'
]

89
keyboards/inline.py Normal file
View File

@@ -0,0 +1,89 @@
from aiogram.utils.keyboard import InlineKeyboardBuilder
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
from typing import List, Tuple
def get_auth_menu() -> InlineKeyboardMarkup:
"""Меню авторизации для неавторизованных пользователей"""
builder = InlineKeyboardBuilder()
builder.button(text="🔐 Войти", callback_data="login")
builder.button(text="📝 Зарегистрироваться", callback_data="register")
builder.adjust(1)
return builder.as_markup()
def get_main_menu() -> InlineKeyboardMarkup:
"""Главное меню для авторизованных пользователей"""
builder = InlineKeyboardBuilder()
builder.button(text="📚 Все книги", callback_data="books_all")
builder.button(text="⭐ Избранное", callback_data="favorites")
builder.button(text="🔍 Поиск по жанру", callback_data="search_genre")
builder.button(text="👤 Мой профиль", callback_data="profile")
builder.adjust(2, 2)
return builder.as_markup()
def get_book_keyboard(book_id: int, is_favorite: bool = False, page: int = 0, total_pages: int = 1) -> InlineKeyboardMarkup:
"""Клавиатура для отдельной книги с пагинацией"""
builder = InlineKeyboardBuilder()
# Кнопка добавления/удаления из избранного
if is_favorite:
builder.button(text="❌ Удалить из избранного", callback_data=f"remove_fav:{book_id}")
else:
builder.button(text="❤️ В избранное", callback_data=f"add_fav:{book_id}")
# Кнопки пагинации
nav_buttons = []
if page > 0:
nav_buttons.append(InlineKeyboardButton(text="⬅️ Назад", callback_data=f"books_page:{page-1}"))
nav_buttons.append(InlineKeyboardButton(text=f"{page+1}/{total_pages}", callback_data="page_info"))
if page < total_pages - 1:
nav_buttons.append(InlineKeyboardButton(text="➡️ Вперед", callback_data=f"books_page:{page+1}"))
builder.row(*nav_buttons)
builder.button(text="🏠 Главное меню", callback_data="main_menu")
builder.adjust(1, len(nav_buttons), 1)
return builder.as_markup()
def get_pagination_keyboard(page: int, total_pages: int, prefix: str = "books_page") -> InlineKeyboardMarkup:
"""Общая клавиатура пагинации"""
builder = InlineKeyboardBuilder()
nav_buttons = []
if page > 0:
nav_buttons.append(InlineKeyboardButton(text="⬅️ Назад", callback_data=f"{prefix}:{page-1}"))
nav_buttons.append(InlineKeyboardButton(text=f"{page+1}/{total_pages}", callback_data="page_info"))
if page < total_pages - 1:
nav_buttons.append(InlineKeyboardButton(text="➡️ Вперед", callback_data=f"{prefix}:{page+1}"))
builder.row(*nav_buttons)
builder.button(text="🏠 Главное меню", callback_data="main_menu")
return builder.as_markup()
def get_genres_keyboard(genres: List[Tuple[int, str]]) -> InlineKeyboardMarkup:
"""Клавиатура с жанрами (по 2 в строке)"""
builder = InlineKeyboardBuilder()
for genre_id, genre_name in genres:
builder.button(text=genre_name, callback_data=f"genre:{genre_id}")
builder.button(text="🏠 Главное меню", callback_data="main_menu")
builder.adjust(2)
return builder.as_markup()
def get_back_to_menu_keyboard() -> InlineKeyboardMarkup:
"""Простая клавиатура с возвратом в меню"""
builder = InlineKeyboardBuilder()
builder.button(text="🏠 Главное меню", callback_data="main_menu")
return builder.as_markup()