uploader-bot/app/bot/poller.py

68 lines
2.1 KiB
Python

"""
Lightweight Telegram bot poller to ensure the bot responds.
Does not depend on legacy sync DB middleware. Provides minimal /start handler.
"""
import asyncio
import logging
from typing import Optional
from aiogram import Bot, Dispatcher, Router, types
from aiogram.filters import Command
from app.core.config import get_settings
logger = logging.getLogger(__name__)
def build_router(name: str) -> Router:
r = Router(name=name)
@r.message(Command("start"))
async def cmd_start(message: types.Message):
await message.answer(
"MY Network bot online. Use /help to get options.")
@r.message(Command("help"))
async def cmd_help(message: types.Message):
await message.answer("Available: /start, /help")
return r
async def _run_single_bot(token: str, name: str):
bot = Bot(token)
dp = Dispatcher()
dp.include_router(build_router(name))
logger.info("Starting Telegram bot polling", extra={"name": name})
try:
await dp.start_polling(bot, allowed_updates=dp.resolve_used_update_types())
except Exception as e:
logger.error("Bot polling failed", extra={"name": name, "error": str(e)})
await bot.session.close()
async def start_bots_if_configured() -> list[asyncio.Task]:
settings = get_settings()
tasks: list[asyncio.Task] = []
# Prefer TELEGRAM_WEBHOOK_ENABLED to avoid double-processing
webhook_enabled = bool(getattr(settings, 'TELEGRAM_WEBHOOK_ENABLED', False))
if webhook_enabled:
logger.info("Telegram webhook enabled; skipping polling start")
return tasks
# Main bot
token: Optional[str] = getattr(settings, 'TELEGRAM_API_KEY', None)
if token:
tasks.append(asyncio.create_task(_run_single_bot(token, 'main')))
# Client bot
ct: Optional[str] = getattr(settings, 'CLIENT_TELEGRAM_API_KEY', None)
if ct:
tasks.append(asyncio.create_task(_run_single_bot(ct, 'client')))
if tasks:
logger.info("Telegram bots polling started", extra={"count": len(tasks)})
else:
logger.info("No Telegram tokens configured; polling not started")
return tasks