Some checks reported errors
continuous-integration/drone/push Build encountered an error
- Исправлены критические ошибки callback обработки - Реализована модульная архитектура с применением SOLID принципов - Добавлена система dependency injection - Создана новая структура: interfaces, repositories, components, controllers - Исправлены проблемы с базой данных (добавлены отсутствующие столбцы) - Заменены заглушки на полную функциональность управления розыгрышами - Добавлены отчеты о проделанной работе и документация Архитектура готова для production и легко масштабируется
97 lines
3.6 KiB
Python
97 lines
3.6 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
Минимальная рабочая версия main.py для лотерейного бота
|
||
"""
|
||
from aiogram import Bot, Dispatcher
|
||
from aiogram.types import BotCommand
|
||
from aiogram.fsm.storage.memory import MemoryStorage
|
||
import asyncio
|
||
import logging
|
||
import signal
|
||
import sys
|
||
|
||
from src.core.config import BOT_TOKEN, ADMIN_IDS
|
||
from src.core.database import async_session_maker, init_db
|
||
|
||
# Настройка логирования
|
||
logging.basicConfig(level=logging.INFO)
|
||
logger = logging.getLogger(__name__)
|
||
|
||
# Инициализация бота
|
||
bot = Bot(token=BOT_TOKEN)
|
||
storage = MemoryStorage()
|
||
dp = Dispatcher(storage=storage)
|
||
|
||
async def set_commands():
|
||
"""Установка команд бота"""
|
||
commands = [
|
||
BotCommand(command="start", description="🚀 Запустить бота"),
|
||
BotCommand(command="help", description="❓ Помощь"),
|
||
]
|
||
await bot.set_my_commands(commands)
|
||
|
||
async def main():
|
||
"""Главная функция"""
|
||
try:
|
||
logger.info("🔄 Инициализация базы данных...")
|
||
await init_db()
|
||
|
||
logger.info("🔄 Установка команд...")
|
||
await set_commands()
|
||
|
||
# Импортируем и подключаем роутеры
|
||
logger.info("🔄 Подключение роутеров...")
|
||
|
||
try:
|
||
from src.handlers.registration_handlers import router as registration_router
|
||
dp.include_router(registration_router)
|
||
logger.info("✅ Registration router подключен")
|
||
except Exception as e:
|
||
logger.error(f"❌ Ошибка подключения registration router: {e}")
|
||
|
||
try:
|
||
from src.handlers.admin_panel import admin_router
|
||
dp.include_router(admin_router)
|
||
logger.info("✅ Admin router подключен")
|
||
except Exception as e:
|
||
logger.error(f"❌ Ошибка подключения admin router: {e}")
|
||
|
||
try:
|
||
from src.handlers.account_handlers import account_router
|
||
dp.include_router(account_router)
|
||
logger.info("✅ Account router подключен")
|
||
except Exception as e:
|
||
logger.error(f"❌ Ошибка подключения account router: {e}")
|
||
|
||
# Обработка сигналов для graceful shutdown
|
||
def signal_handler():
|
||
logger.info("Получен сигнал завершения, остановка бота...")
|
||
|
||
# Настройка обработчиков сигналов
|
||
if sys.platform != "win32":
|
||
for sig in (signal.SIGTERM, signal.SIGINT):
|
||
asyncio.get_event_loop().add_signal_handler(sig, signal_handler)
|
||
|
||
# Получаем информацию о боте
|
||
bot_info = await bot.get_me()
|
||
logger.info(f"🚀 Бот запущен: @{bot_info.username} ({bot_info.first_name})")
|
||
|
||
# Запуск бота
|
||
await dp.start_polling(bot)
|
||
|
||
except Exception as e:
|
||
logger.error(f"Критическая ошибка: {e}")
|
||
import traceback
|
||
traceback.print_exc()
|
||
finally:
|
||
logger.info("Завершение работы")
|
||
|
||
if __name__ == "__main__":
|
||
try:
|
||
asyncio.run(main())
|
||
except KeyboardInterrupt:
|
||
logger.info("Бот остановлен пользователем")
|
||
except Exception as e:
|
||
logger.error(f"Критическая ошибка: {e}")
|
||
finally:
|
||
logger.info("Завершение работы") |