import asyncio import logging from aiogram import Bot, Dispatcher from aiogram.fsm.storage.memory import MemoryStorage from aiogram.client.default import DefaultBotProperties from aiogram.enums import ParseMode from config import BOT_TOKEN from handlers import auth, books, favorites from middlewares.auth import DatabaseMiddleware # Настройка логирования logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) logger = logging.getLogger(__name__) async def main(): """Главная функция запуска бота""" logger.info("Запуск бота...") # Инициализация бота и диспетчера bot = Bot( token=BOT_TOKEN, default=DefaultBotProperties(parse_mode=ParseMode.HTML) ) dp = Dispatcher(storage=MemoryStorage()) # Регистрация middleware # DatabaseMiddleware предоставляет сессию БД для всех хендлеров dp.message.middleware(DatabaseMiddleware()) dp.callback_query.middleware(DatabaseMiddleware()) # Регистрация роутеров # Порядок важен: auth должен быть первым, так как обрабатывает /start dp.include_router(auth.router) dp.include_router(books.router) dp.include_router(favorites.router) # Удаление вебхука и очистка pending updates await bot.delete_webhook(drop_pending_updates=True) logger.info("Бот успешно запущен и готов к работе!") # Запуск polling try: await dp.start_polling(bot) except Exception as e: logger.error(f"Ошибка при работе бота: {e}") finally: await bot.session.close() logger.info("Бот остановлен") if __name__ == '__main__': try: asyncio.run(main()) except KeyboardInterrupt: logger.info("Бот остановлен пользователем") except Exception as e: logger.error(f"Критическая ошибка: {e}")