b88ccf3b4b
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
101 lines
3.7 KiB
Python
101 lines
3.7 KiB
Python
"""Главный файл запуска 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}")
|