74 lines
2.7 KiB
Python
74 lines
2.7 KiB
Python
"""Reply-клавиатуры пяти режимов бота."""
|
|
from __future__ import annotations
|
|
|
|
from aiogram.types import (
|
|
KeyboardButton,
|
|
ReplyKeyboardMarkup,
|
|
)
|
|
|
|
from user_store import SUBSCRIPTION_PRICE_STARS
|
|
|
|
MODE_BUTTONS: dict[str, str] = {
|
|
"🏠 Лобби": "/lobby",
|
|
"🎓 Обучение": "/training",
|
|
"✍️ Генерация": "/generate",
|
|
"💳 Подписка": "/subscription",
|
|
"📖 Помощь": "/help",
|
|
}
|
|
|
|
MODE_ROWS = [
|
|
["🏠 Лобби", "🎓 Обучение"],
|
|
["✍️ Генерация", "💳 Подписка"],
|
|
["📖 Помощь"],
|
|
]
|
|
|
|
MODE_ACTIONS: dict[str, list[list[str]]] = {
|
|
"lobby": [],
|
|
"training": [["🎨 Мой стиль", "🗑 Сбросить данные"]],
|
|
"generation": [["✍️ Написать пост", "💡 Идея"]],
|
|
"subscription": [["👤 Статус подписки", "⭐ Оплатить подписку"]],
|
|
"help": [],
|
|
}
|
|
|
|
BUTTON_TEXT_MAP: dict[str, str] = {
|
|
**MODE_BUTTONS,
|
|
"🎨 Мой стиль": "/style",
|
|
"🗑 Сбросить данные": "/clear",
|
|
"✍️ Написать пост": "/post",
|
|
"💡 Идея": "/idea",
|
|
"👤 Статус подписки": "/balance",
|
|
"⭐ Оплатить подписку": "/subscribe",
|
|
}
|
|
|
|
|
|
def mode_keyboard(mode: str) -> ReplyKeyboardMarkup:
|
|
"""Создаёт клавиатуру режимных переходов и действий текущего режима."""
|
|
rows = [*MODE_ROWS, *MODE_ACTIONS.get(mode, [])]
|
|
return ReplyKeyboardMarkup(
|
|
keyboard=[[KeyboardButton(text=text) for text in row] for row in rows],
|
|
resize_keyboard=True,
|
|
input_field_placeholder={
|
|
"lobby": "Выбери режим",
|
|
"training": "Пришли скриншоты постов",
|
|
"generation": "Опиши задачу для поста",
|
|
"subscription": "Выбери действие с подпиской",
|
|
"help": "Выбери раздел справки",
|
|
}.get(mode, "Выбери режим"),
|
|
)
|
|
|
|
|
|
# Совместимые имена для мест, где ещё используется клавиатура главного меню.
|
|
MAIN_MENU = mode_keyboard("lobby")
|
|
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} звёзд — команда /subscribe в режиме «Подписка»."
|