Files
tg_bot_language/bot/handlers/settings.py
mamonov.ep 44f4f61fce Реализованы настройки пользователя и новые типы заданий
Создано:
- 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>
2025-12-04 14:46:30 +03:00

179 lines
7.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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()