from aiogram import Router, F from aiogram.filters import Command from aiogram.types import Message, CallbackQuery, InlineKeyboardMarkup, InlineKeyboardButton from aiogram.fsm.context import FSMContext from database.db import async_session_maker from database.models import LanguageLevel from services.user_service import UserService router = Router() def get_settings_keyboard(user) -> InlineKeyboardMarkup: """Создать клавиатуру настроек""" keyboard = InlineKeyboardMarkup(inline_keyboard=[ [InlineKeyboardButton( text=f"📊 Уровень: {user.level.value}", callback_data="settings_level" )], [InlineKeyboardButton( text=f"🌐 Язык интерфейса: {'🇷🇺 Русский' if user.language_interface == 'ru' else '🇬🇧 English'}", callback_data="settings_language" )], [InlineKeyboardButton( text="❌ Закрыть", callback_data="settings_close" )] ]) return keyboard def get_level_keyboard() -> InlineKeyboardMarkup: """Клавиатура выбора уровня""" levels = [ ("A1 - Начальный", "set_level_A1"), ("A2 - Элементарный", "set_level_A2"), ("B1 - Средний", "set_level_B1"), ("B2 - Выше среднего", "set_level_B2"), ("C1 - Продвинутый", "set_level_C1"), ("C2 - Профессиональный", "set_level_C2"), ] keyboard = [] for level_name, callback_data in levels: keyboard.append([InlineKeyboardButton(text=level_name, callback_data=callback_data)]) keyboard.append([InlineKeyboardButton(text="⬅️ Назад", callback_data="settings_back")]) return InlineKeyboardMarkup(inline_keyboard=keyboard) def get_language_keyboard() -> InlineKeyboardMarkup: """Клавиатура выбора языка интерфейса""" keyboard = InlineKeyboardMarkup(inline_keyboard=[ [InlineKeyboardButton(text="🇷🇺 Русский", callback_data="set_lang_ru")], [InlineKeyboardButton(text="🇬🇧 English (скоро)", callback_data="set_lang_en")], [InlineKeyboardButton(text="⬅️ Назад", callback_data="settings_back")] ]) return keyboard @router.message(Command("settings")) async def cmd_settings(message: Message): """Обработчик команды /settings""" async with async_session_maker() as session: user = await UserService.get_user_by_telegram_id(session, message.from_user.id) if not user: await message.answer("Сначала запусти бота командой /start") return settings_text = ( "⚙️ Настройки\n\n" f"📊 Уровень английского: {user.level.value}\n" f"🌐 Язык интерфейса: {'Русский' if user.language_interface == 'ru' else 'English'}\n\n" "Выбери, что хочешь изменить:" ) await message.answer(settings_text, reply_markup=get_settings_keyboard(user)) @router.callback_query(F.data == "settings_level") async def settings_level(callback: CallbackQuery): """Показать выбор уровня""" await callback.message.edit_text( "📊 Выбери свой уровень английского:\n\n" "A1-A2 - Начинающий\n" "B1-B2 - Средний\n" "C1-C2 - Продвинутый\n\n" "Это влияет на сложность предлагаемых слов и заданий.", reply_markup=get_level_keyboard() ) await callback.answer() @router.callback_query(F.data.startswith("set_level_")) async def set_level(callback: CallbackQuery): """Установить уровень""" level_str = callback.data.split("_")[-1] # A1, A2, B1, B2, C1, C2 async with async_session_maker() as session: user = await UserService.get_user_by_telegram_id(session, callback.from_user.id) if user: # Обновляем уровень await UserService.update_user_level(session, user.id, LanguageLevel[level_str]) await callback.message.edit_text( f"✅ Уровень изменен на {level_str}\n\n" "Теперь ты будешь получать слова и задания, соответствующие твоему уровню!", reply_markup=InlineKeyboardMarkup(inline_keyboard=[ [InlineKeyboardButton(text="⬅️ К настройкам", callback_data="settings_back")] ]) ) await callback.answer() @router.callback_query(F.data == "settings_language") async def settings_language(callback: CallbackQuery): """Показать выбор языка""" await callback.message.edit_text( "🌐 Выбери язык интерфейса:\n\n" "Это изменит язык всех сообщений бота.", reply_markup=get_language_keyboard() ) await callback.answer() @router.callback_query(F.data.startswith("set_lang_")) async def set_language(callback: CallbackQuery): """Установить язык""" lang = callback.data.split("_")[-1] # ru или en if lang == "en": await callback.answer("Английский интерфейс скоро будет доступен! 🚧", show_alert=True) return async with async_session_maker() as session: user = await UserService.get_user_by_telegram_id(session, callback.from_user.id) if user: await UserService.update_user_language(session, user.id, lang) await callback.message.edit_text( f"✅ Язык интерфейса: {'Русский' if lang == 'ru' else 'English'}", reply_markup=InlineKeyboardMarkup(inline_keyboard=[ [InlineKeyboardButton(text="⬅️ К настройкам", callback_data="settings_back")] ]) ) await callback.answer() @router.callback_query(F.data == "settings_back") async def settings_back(callback: CallbackQuery): """Вернуться к настройкам""" async with async_session_maker() as session: user = await UserService.get_user_by_telegram_id(session, callback.from_user.id) if user: settings_text = ( "⚙️ Настройки\n\n" f"📊 Уровень английского: {user.level.value}\n" f"🌐 Язык интерфейса: {'Русский' if user.language_interface == 'ru' else 'English'}\n\n" "Выбери, что хочешь изменить:" ) await callback.message.edit_text(settings_text, reply_markup=get_settings_keyboard(user)) await callback.answer() @router.callback_query(F.data == "settings_close") async def settings_close(callback: CallbackQuery): """Закрыть настройки""" await callback.message.delete() await callback.answer()