import asyncio import logging from schedule import refresh_cache from aiogram import Bot, Dispatcher from aiogram.enums import ParseMode from aiogram.client.default import DefaultBotProperties from aiogram.fsm.storage.memory import MemoryStorage from config import BOT_TOKEN from api import api from handlers.support import router as support_router from handlers.start import router as start_router from handlers.group import router as group_router from handlers.admin import router as admin_router from logger import logger from database import ( init_db, clear_old_cache ) logging.basicConfig( level=logging.INFO, format="%(asctime)s | %(levelname)s | %(name)s | %(message)s" ) bot = Bot( token=BOT_TOKEN, default=DefaultBotProperties( parse_mode=ParseMode.HTML ) ) dp = Dispatcher( storage=MemoryStorage() ) dp.include_router(start_router) dp.include_router(group_router) dp.include_router(support_router) dp.include_router(admin_router) #стартует бот async def on_startup(): await init_db() deleted = await clear_old_cache() logger.info("База данных инициализирована") logger.info( f"Удалено {deleted} записей кэша" ) asyncio.create_task( refresh_cache() ) logger.info( "Фоновое обновление кэша запущено" ) async def on_shutdown(): await api.close() await bot.session.close() logger.info("Бот остановлен") async def main(): await on_startup() try: logger.info("Бот запущен") await dp.start_polling(bot) finally: await on_shutdown() if __name__ == "__main__": try: asyncio.run(main()) except KeyboardInterrupt: logger.info("Остановка...")