feat: Полный рефакторинг с модульной архитектурой
Some checks reported errors
continuous-integration/drone/push Build encountered an error
Some checks reported errors
continuous-integration/drone/push Build encountered an error
- Исправлены критические ошибки callback обработки - Реализована модульная архитектура с применением SOLID принципов - Добавлена система dependency injection - Создана новая структура: interfaces, repositories, components, controllers - Исправлены проблемы с базой данных (добавлены отсутствующие столбцы) - Заменены заглушки на полную функциональность управления розыгрышами - Добавлены отчеты о проделанной работе и документация Архитектура готова для production и легко масштабируется
This commit is contained in:
97
main_simple.py
Normal file
97
main_simple.py
Normal file
@@ -0,0 +1,97 @@
|
||||
#!/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("Завершение работы")
|
||||
Reference in New Issue
Block a user