53 lines
2.0 KiB
Python
53 lines
2.0 KiB
Python
"""
|
|
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
|