uploader-bot/app/services/telegram_poller.py

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