feat: batch-генерация слов дня, кнопка "Слово дня" в статистике

- Оптимизирована генерация слов дня: 2 запроса к AI вместо 11
- Добавлена кнопка "Слово дня" в /stats для быстрого доступа
- Локализация для ru/en/ja

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-12-10 11:00:30 +03:00
parent aa7121a1af
commit badad0a529
7 changed files with 141 additions and 77 deletions

View File

@@ -663,4 +663,51 @@ async def cmd_stats(message: Message):
else:
stats_text += t(lang, 'stats.hint_keep_practice')
await message.answer(stats_text)
# Кнопка "Слово дня"
keyboard = InlineKeyboardMarkup(inline_keyboard=[
[InlineKeyboardButton(
text=t(lang, 'stats.word_of_day_btn'),
callback_data="stats_word_of_day"
)]
])
await message.answer(stats_text, reply_markup=keyboard)
@router.callback_query(F.data == "stats_word_of_day")
async def stats_word_of_day(callback: CallbackQuery):
"""Показать слово дня из статистики"""
await callback.answer()
from services.wordofday_service import wordofday_service
from bot.handlers.wordofday import format_word_of_day
async with async_session_maker() as session:
user = await UserService.get_user_by_telegram_id(session, callback.from_user.id)
if not user:
return
lang = get_user_lang(user)
learning_lang = user.learning_language or 'en'
level = get_user_level_for_language(user)
wod = await wordofday_service.get_word_of_day(
learning_lang=learning_lang,
level=level
)
if not wod:
await callback.message.answer(t(lang, 'wod.not_available'))
return
text = format_word_of_day(wod, lang)
keyboard = InlineKeyboardMarkup(inline_keyboard=[
[InlineKeyboardButton(
text=t(lang, 'wod.add_btn'),
callback_data=f"wod_add_{wod.id}"
)]
])
await callback.message.answer(text, reply_markup=keyboard)