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

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 в режиме «Подписка»."