Реализованы настройки пользователя и новые типы заданий
Создано: - bot/handlers/settings.py - обработчик команды /settings Реализовано: ✅ /settings - настройки пользователя - Выбор уровня английского (A1-C2) - Выбор языка интерфейса (RU/EN) - Интерактивные inline-кнопки ✅ Новый тип заданий - заполнение пропусков - AI генерирует предложение с пропуском - Показывает перевод для контекста - Проверка ответа через AI ✅ Смешанные задания - Случайное чередование типов (переводы + fill-in) - Более разнообразная практика Изменено: - services/ai_service.py - метод generate_fill_in_sentence() - services/task_service.py - метод generate_mixed_tasks() - services/user_service.py - методы обновления настроек - bot/handlers/tasks.py - использование смешанных заданий - main.py - регистрация роутера настроек Теперь бот предлагает: - Перевод EN→RU - Перевод RU→EN - Заполнение пропусков в предложениях 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
178
bot/handlers/settings.py
Normal file
178
bot/handlers/settings.py
Normal file
@@ -0,0 +1,178 @@
|
||||
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 = (
|
||||
"⚙️ <b>Настройки</b>\n\n"
|
||||
f"📊 Уровень английского: <b>{user.level.value}</b>\n"
|
||||
f"🌐 Язык интерфейса: <b>{'Русский' if user.language_interface == 'ru' else 'English'}</b>\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(
|
||||
"📊 <b>Выбери свой уровень английского:</b>\n\n"
|
||||
"<b>A1-A2</b> - Начинающий\n"
|
||||
"<b>B1-B2</b> - Средний\n"
|
||||
"<b>C1-C2</b> - Продвинутый\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"✅ Уровень изменен на <b>{level_str}</b>\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(
|
||||
"🌐 <b>Выбери язык интерфейса:</b>\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"✅ Язык интерфейса: <b>{'Русский' if lang == 'ru' else 'English'}</b>",
|
||||
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 = (
|
||||
"⚙️ <b>Настройки</b>\n\n"
|
||||
f"📊 Уровень английского: <b>{user.level.value}</b>\n"
|
||||
f"🌐 Язык интерфейса: <b>{'Русский' if user.language_interface == 'ru' else 'English'}</b>\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()
|
||||
Reference in New Issue
Block a user