Files

101 lines
3.7 KiB
Python
Raw Permalink Normal View History

2026-05-31 18:46:09 +08:00
"""Главный файл запуска Telegram бота."""
import asyncio
import logging
import os
from aiogram import Bot, Dispatcher
from aiogram.client.default import DefaultBotProperties
from aiogram.enums import ParseMode
from config import settings
from database.database import db
from bot.handlers_start import router as start_router
from bot.handlers_generation import router as generation_router
from bot.handlers_profiles import router as profiles_router
from bot.handlers_settings import router as settings_router, scheduled_cleanup
from bot.handlers_admin import router as admin_router
from bot.middleware import AccessCheckMiddleware
async def main():
"""Основная функция запуска бота."""
# Настройка логирования
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
)
logger = logging.getLogger(__name__)
# Проверяем настройки
try:
settings.validate()
except ValueError as e:
logger.error(f"Ошибка конфигурации: {e}")
return
# Инициализация базы данных
await db.initialize()
logger.info("База данных инициализирована")
# Инициализация админа
if settings.ADMIN_ID:
await db.ensure_admin(settings.ADMIN_ID)
logger.info(f"Админ инициализирован: {settings.ADMIN_ID}")
else:
logger.warning("ADMIN_ID не установлен — админ-панель будет недоступна")
# Создаём директорию для изображений
os.makedirs(settings.IMAGES_DIR, exist_ok=True)
logger.info(f"Директория для изображений: {settings.IMAGES_DIR}")
# Инициализация бота и диспетчера
bot = Bot(
token=settings.BOT_TOKEN,
default=DefaultBotProperties(parse_mode=ParseMode.HTML)
)
dp = Dispatcher()
# Регистрируем мидлварь проверки доступа
dp.message.middleware(AccessCheckMiddleware())
dp.callback_query.middleware(AccessCheckMiddleware())
logger.info("Мидлварь проверки доступа зарегистрирована")
# Регистрация роутеров (админ первым, чтобы его обработчики имели приоритет)
dp.include_router(admin_router)
dp.include_router(start_router)
dp.include_router(generation_router)
dp.include_router(profiles_router)
dp.include_router(settings_router)
# Запуск фоновой задачи очистки
async def cleanup_task():
"""Фоновая задача очистки просроченных изображений."""
while True:
await asyncio.sleep(settings.CLEANUP_INTERVAL_MINUTES * 60)
await scheduled_cleanup()
cleanup_task_handle = asyncio.create_task(cleanup_task())
logger.info(
f"Запущена фоновая очистка изображений каждые {settings.CLEANUP_INTERVAL_MINUTES} минут"
)
try:
logger.info("Бот запущен!")
await dp.start_polling(bot)
except Exception as e:
logger.error(f"Ошибка работы бота: {e}")
finally:
cleanup_task_handle.cancel()
await bot.session.close()
logger.info("Бот остановлен")
if __name__ == "__main__":
try:
asyncio.run(main())
except KeyboardInterrupt:
print("\nБот остановлен пользователем")
except Exception as e:
print(f"Критическая ошибка: {e}")