from aiogram import Bot, Dispatcher from aiogram.client.default import DefaultBotProperties from aiogram.fsm.storage.memory import MemoryStorage from aiogram.fsm.strategy import FSMStrategy import logging from helper_bot.handlers.admin import admin_router from helper_bot.handlers.callback import callback_router from helper_bot.handlers.group import group_router from helper_bot.handlers.private import private_router from helper_bot.handlers.voice import VoiceHandlers from helper_bot.middlewares.dependencies_middleware import DependenciesMiddleware from helper_bot.middlewares.blacklist_middleware import BlacklistMiddleware from helper_bot.middlewares.metrics_middleware import MetricsMiddleware, ErrorMetricsMiddleware from helper_bot.server_prometheus import start_metrics_server, stop_metrics_server async def start_bot(bdf): token = bdf.settings['Telegram']['bot_token'] bot = Bot(token=token, default=DefaultBotProperties( parse_mode='HTML', link_preview_is_disabled=bdf.settings['Telegram']['preview_link'] ), timeout=30.0) dp = Dispatcher(storage=MemoryStorage(), fsm_strategy=FSMStrategy.GLOBAL_USER) # ✅ Оптимизированная регистрация middleware dp.update.outer_middleware(DependenciesMiddleware()) dp.update.outer_middleware(MetricsMiddleware()) dp.update.outer_middleware(BlacklistMiddleware()) # Создаем экземпляр VoiceHandlers voice_handlers = VoiceHandlers(bdf, bdf.settings) voice_router = voice_handlers.router # Добавляем middleware напрямую к роутерам для тестирования admin_router.message.middleware(MetricsMiddleware()) private_router.message.middleware(MetricsMiddleware()) callback_router.callback_query.middleware(MetricsMiddleware()) group_router.message.middleware(MetricsMiddleware()) voice_router.message.middleware(MetricsMiddleware()) dp.include_routers(admin_router, private_router, callback_router, group_router, voice_router) await bot.delete_webhook(drop_pending_updates=True) # Запускаем HTTP сервер для метрик параллельно с ботом metrics_host = bdf.settings.get('Metrics', {}).get('host', '0.0.0.0') metrics_port = bdf.settings.get('Metrics', {}).get('port', 8080) try: # Запускаем метрики сервер await start_metrics_server(metrics_host, metrics_port) # Запускаем бота await dp.start_polling(bot, skip_updates=True) except Exception as e: logging.error(f"Error in bot startup: {e}") raise finally: # Останавливаем метрики сервер при завершении await stop_metrics_server()