Мини-игры (/games): - Speed Round: 10 раундов, 10 секунд на ответ, очки за скорость - Match Pairs: 5 слов + 5 переводов, соединить пары Premium-функции: - Поля is_premium и premium_until для пользователей - AI режим проверки ответов (учитывает синонимы) - Batch проверка всех ответов одним запросом Улучшения: - Примеры использования для всех добавляемых слов - Разбиение переводов по запятой на отдельные записи - Полные предложения в контекстах (без ___) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
77 lines
3.0 KiB
Python
77 lines
3.0 KiB
Python
import asyncio
|
||
import logging
|
||
|
||
from aiogram import Bot, Dispatcher
|
||
from aiogram.client.default import DefaultBotProperties
|
||
from aiogram.enums import ParseMode
|
||
from aiogram.types import BotCommand
|
||
|
||
from config.settings import settings
|
||
from bot.handlers import start, vocabulary, tasks, settings as settings_handler, words, import_text, practice, reminder, level_test, admin, exercises, wordofday, stories, minigames
|
||
from services.reminder_service import init_reminder_service
|
||
|
||
|
||
async def main():
|
||
"""Главная функция запуска бота"""
|
||
# Настройка логирования
|
||
logging.basicConfig(
|
||
level=logging.INFO if settings.debug else logging.WARNING,
|
||
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
|
||
)
|
||
|
||
# Инициализация бота и диспетчера
|
||
bot = Bot(
|
||
token=settings.bot_token,
|
||
default=DefaultBotProperties(parse_mode=ParseMode.HTML)
|
||
)
|
||
dp = Dispatcher()
|
||
|
||
# Команды бота для меню Telegram
|
||
await bot.set_my_commands([
|
||
BotCommand(command="start", description="Запустить бота"),
|
||
BotCommand(command="task", description="Задания"),
|
||
BotCommand(command="practice", description="Диалог с AI"),
|
||
BotCommand(command="story", description="Мини-истории"),
|
||
BotCommand(command="games", description="Мини-игры"),
|
||
BotCommand(command="add", description="Добавить слово"),
|
||
BotCommand(command="words", description="Тематическая подборка слов"),
|
||
BotCommand(command="vocabulary", description="Мой словарь"),
|
||
BotCommand(command="stats", description="Статистика"),
|
||
BotCommand(command="settings", description="Настройки"),
|
||
BotCommand(command="help", description="Справка"),
|
||
])
|
||
|
||
# Регистрация роутеров
|
||
dp.include_router(start.router)
|
||
dp.include_router(level_test.router)
|
||
dp.include_router(vocabulary.router)
|
||
dp.include_router(tasks.router)
|
||
dp.include_router(settings_handler.router)
|
||
dp.include_router(words.router)
|
||
dp.include_router(import_text.router)
|
||
dp.include_router(practice.router)
|
||
dp.include_router(exercises.router)
|
||
dp.include_router(wordofday.router)
|
||
dp.include_router(stories.router)
|
||
dp.include_router(minigames.router)
|
||
dp.include_router(reminder.router)
|
||
dp.include_router(admin.router)
|
||
|
||
# База данных инициализируется через Alembic миграции (make local-migrate)
|
||
|
||
# Инициализация и запуск сервиса напоминаний
|
||
reminder_service = init_reminder_service(bot)
|
||
reminder_service.start()
|
||
|
||
# Запуск бота
|
||
logging.info("Бот запущен")
|
||
try:
|
||
await dp.start_polling(bot)
|
||
finally:
|
||
# Остановка планировщика при завершении
|
||
reminder_service.shutdown()
|
||
|
||
|
||
if __name__ == '__main__':
|
||
asyncio.run(main())
|