""" Project Telegram polling startup: launches both main and client bots with full routers and middleware. Cleans webhooks before polling to ensure updates delivery. """ import asyncio import logging from typing import Optional from aiogram import Bot, Dispatcher from aiogram.fsm.storage.memory import MemoryStorage from app.core.config import get_settings from app.bot.middleware import UserDataMiddleware from app.bot.routers.index import main_router as main_bot_router from app.client_bot.routers.index import main_router as client_bot_router logger = logging.getLogger(__name__) async def _run_bot(token: str, name: str, router) -> None: bot = Bot(token) dp = Dispatcher(storage=MemoryStorage()) dp.update.outer_middleware(UserDataMiddleware()) dp.include_router(router) logger.info("Preparing Telegram bot for polling", extra={"name": name}) # Ensure webhook is removed so polling works await bot.delete_webhook(drop_pending_updates=False) logger.info("Webhook cleared", extra={"name": name}) logger.info("Starting Telegram bot polling", extra={"name": name}) await dp.start_polling(bot, allowed_updates=dp.resolve_used_update_types()) async def start_bots_if_configured() -> list[asyncio.Task]: settings = get_settings() tasks: list[asyncio.Task] = [] if bool(getattr(settings, 'TELEGRAM_WEBHOOK_ENABLED', False)): logger.info("Telegram webhook enabled; skipping polling start") return tasks main_token: Optional[str] = getattr(settings, 'TELEGRAM_API_KEY', None) if main_token: tasks.append(asyncio.create_task(_run_bot(main_token, 'main', main_bot_router))) client_token: Optional[str] = getattr(settings, 'CLIENT_TELEGRAM_API_KEY', None) if client_token: tasks.append(asyncio.create_task(_run_bot(client_token, 'client', client_bot_router))) if tasks: logger.info("Telegram bots polling started", extra={"count": len(tasks)}) else: logger.info("No Telegram tokens configured; polling not started") return tasks