Initial commit
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,100 @@
|
||||
"""Главный файл запуска 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}")
|
||||
Reference in New Issue
Block a user