diff --git a/bot/handlers/start.py b/bot/handlers/start.py index a461428..dd7861f 100644 --- a/bot/handlers/start.py +++ b/bot/handlers/start.py @@ -15,6 +15,16 @@ from services.user_service import UserService router = Router() +# Тексты кнопок главного меню +BTN_ADD = "➕ Добавить слово" +BTN_VOCAB = "📚 Словарь" +BTN_TASK = "🧠 Задание" +BTN_PRACTICE = "💬 Практика" +BTN_WORDS = "🎯 Тематические слова" +BTN_IMPORT = "📖 Импорт из текста" +BTN_STATS = "📊 Статистика" +BTN_SETTINGS = "⚙️ Настройки" + def main_menu_keyboard() -> ReplyKeyboardMarkup: """Клавиатура с основными командами (кнопки отправляют команды).""" @@ -22,20 +32,20 @@ def main_menu_keyboard() -> ReplyKeyboardMarkup: resize_keyboard=True, keyboard=[ [ - KeyboardButton(text="/add"), - KeyboardButton(text="/vocabulary"), + KeyboardButton(text=BTN_ADD), + KeyboardButton(text=BTN_VOCAB), ], [ - KeyboardButton(text="/task"), - KeyboardButton(text="/practice"), + KeyboardButton(text=BTN_TASK), + KeyboardButton(text=BTN_PRACTICE), ], [ - KeyboardButton(text="/words travel"), - KeyboardButton(text="/import"), + KeyboardButton(text=BTN_WORDS), + KeyboardButton(text=BTN_IMPORT), ], [ - KeyboardButton(text="/stats"), - KeyboardButton(text="/settings"), + KeyboardButton(text=BTN_STATS), + KeyboardButton(text=BTN_SETTINGS), ], ], ) @@ -114,6 +124,108 @@ async def cmd_menu(message: Message): await message.answer("Главное меню доступно ниже ⤵️", reply_markup=main_menu_keyboard()) +# Обработчики кнопок главного меню (по тексту) + +@router.message(F.text == BTN_ADD) +async def btn_add_pressed(message: Message, state: FSMContext): + from bot.handlers.vocabulary import AddWordStates + await message.answer( + "Отправь слово, которое хочешь добавить:\n" + "Например: /add elephant\n\n" + "Или просто отправь слово без команды!" + ) + await state.set_state(AddWordStates.waiting_for_word) + + +@router.message(F.text == BTN_VOCAB) +async def btn_vocab_pressed(message: Message): + from bot.handlers.vocabulary import cmd_vocabulary + await cmd_vocabulary(message) + + +@router.message(F.text == BTN_TASK) +async def btn_task_pressed(message: Message, state: FSMContext): + from bot.handlers.tasks import cmd_task + await cmd_task(message, state) + + +@router.message(F.text == BTN_PRACTICE) +async def btn_practice_pressed(message: Message, state: FSMContext): + from bot.handlers.practice import cmd_practice + await cmd_practice(message, state) + + +@router.message(F.text == BTN_IMPORT) +async def btn_import_pressed(message: Message, state: FSMContext): + from bot.handlers.import_text import cmd_import + await cmd_import(message, state) + + +@router.message(F.text == BTN_STATS) +async def btn_stats_pressed(message: Message): + from bot.handlers.tasks import cmd_stats + await cmd_stats(message) + + +@router.message(F.text == BTN_SETTINGS) +async def btn_settings_pressed(message: Message): + from bot.handlers.settings import cmd_settings + await cmd_settings(message) + + +@router.message(F.text == BTN_WORDS) +async def btn_words_pressed(message: Message, state: FSMContext): + """Подсказать про тематические слова и показать быстрые темы.""" + from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton + + text = ( + "📚 Тематические подборки слов\n\n" + "Используй: /words [тема]\n\n" + "Популярные темы:" + ) + keyboard = InlineKeyboardMarkup(inline_keyboard=[ + [InlineKeyboardButton(text="✈️ Путешествия", callback_data="menu_theme_travel")], + [InlineKeyboardButton(text="🍔 Еда", callback_data="menu_theme_food")], + [InlineKeyboardButton(text="💼 Работа", callback_data="menu_theme_work")], + [InlineKeyboardButton(text="🌿 Природа", callback_data="menu_theme_nature")], + [InlineKeyboardButton(text="💻 Технологии", callback_data="menu_theme_technology")], + ]) + await message.answer(text, reply_markup=keyboard) + + +@router.callback_query(F.data.startswith("menu_theme_")) +async def pick_theme_from_menu(callback: CallbackQuery, state: FSMContext): + """Сгенерировать слова по выбранной теме из меню и показать список.""" + from database.db import async_session_maker + from services.user_service import UserService + from services.ai_service import ai_service + from bot.handlers.words import show_words_list, WordsStates + + theme = callback.data.split("menu_theme_")[-1] + + async with async_session_maker() as session: + user = await UserService.get_user_by_telegram_id(session, callback.from_user.id) + if not user: + await callback.answer("Сначала /start", show_alert=True) + return + + generating = await callback.message.answer(f"🔄 Генерирую подборку слов по теме '{theme}'...") + words = await ai_service.generate_thematic_words(theme=theme, level=user.level.value, count=10) + await generating.delete() + + if not words: + await callback.message.answer("❌ Не удалось сгенерировать подборку. Попробуй позже.") + await callback.answer() + return + + # Сохраняем в состояние как в /words + await state.update_data(theme=theme, words=words, user_id=user.id, level=user.level.name) + await state.set_state(WordsStates.viewing_words) + + await show_words_list(callback.message, words, theme) + await callback.answer() + + @router.message(Command("help")) async def cmd_help(message: Message): """Обработчик команды /help"""