75 lines
2.7 KiB
Python
75 lines
2.7 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__"
|
|
TRAINING_RESET_BUTTON = "🗑 Сбросить данные"
|
|
TRAINING_RESET_VALUE = "__training_reset__"
|
|
POST_GENERATE_BUTTON = "✍️ Придумать пост"
|
|
|
|
BUTTON_TEXT_MAP: dict[str, str] = {
|
|
**MODE_BUTTONS,
|
|
MAIN_MENU_BUTTON: MAIN_MENU_VALUE,
|
|
"Главное меню": MAIN_MENU_VALUE,
|
|
TRAINING_RESET_BUTTON: TRAINING_RESET_VALUE,
|
|
POST_GENERATE_BUTTON: "/post",
|
|
}
|
|
|
|
|
|
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:
|
|
"""Внутри режима показывает релевантные действия и возврат в меню."""
|
|
rows = [[KeyboardButton(text=MAIN_MENU_BUTTON)]]
|
|
if mode == "training":
|
|
rows.append([KeyboardButton(text=TRAINING_RESET_BUTTON)])
|
|
elif mode == "generation":
|
|
rows.insert(0, [KeyboardButton(text=POST_GENERATE_BUTTON)])
|
|
return ReplyKeyboardMarkup(
|
|
keyboard=rows,
|
|
resize_keyboard=True,
|
|
input_field_placeholder=(
|
|
"Управляй обучением или вернись в меню"
|
|
if mode == "training"
|
|
else "Напиши сообщение или вернись в главное меню"
|
|
),
|
|
)
|
|
|
|
|
|
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} звёзд."
|