Files
social-post-writer-bot/keyboards.py
T

61 lines
2.1 KiB
Python

"""Клавиатуры главного меню и пользовательских режимов бота."""
from __future__ import annotations
from aiogram.types import (
KeyboardButton,
ReplyKeyboardMarkup,
)
from user_store import SUBSCRIPTION_PRICE_STARS
MODE_BUTTONS: dict[str, str] = {
"🎓 Обучение": "/training",
"✍️ Генерация": "/generate",
"💳 Подписка": "/subscription",
"📖 Помощь": "/help",
}
MAIN_MENU_BUTTON = "🏠 Главное меню"
MAIN_MENU_VALUE = "__main_menu__"
BUTTON_TEXT_MAP: dict[str, str] = {
**MODE_BUTTONS,
MAIN_MENU_BUTTON: MAIN_MENU_VALUE,
"Главное меню": MAIN_MENU_VALUE,
}
def main_menu_keyboard() -> ReplyKeyboardMarkup:
"""Показывает только четыре доступных пользователю режима."""
return ReplyKeyboardMarkup(
keyboard=[
[KeyboardButton(text="🎓 Обучение"), KeyboardButton(text="✍️ Генерация")],
[KeyboardButton(text="💳 Подписка"), KeyboardButton(text="📖 Помощь")],
],
resize_keyboard=True,
input_field_placeholder="Выбери режим",
)
def mode_keyboard(_mode: str) -> ReplyKeyboardMarkup:
"""Внутри любого режима оставляет только выход в главное меню."""
return ReplyKeyboardMarkup(
keyboard=[[KeyboardButton(text=MAIN_MENU_BUTTON)]],
resize_keyboard=True,
input_field_placeholder="Напиши сообщение или вернись в главное меню",
)
MAIN_MENU = main_menu_keyboard()
LOCKED_MENU = mode_keyboard("subscription")
def resolve_button_text(text: str | None) -> str | None:
"""Возвращает команду или текст запроса для нажатой кнопки, иначе None."""
if not text:
return None
return BUTTON_TEXT_MAP.get(text.strip())
def price_hint() -> str:
return f"Продление подписки — {SUBSCRIPTION_PRICE_STARS} звёзд."