#!/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("Завершение работы")