"""Главный файл запуска 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}")