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()