from aiogram import Bot, Dispatcher from aiogram.webhook.aiohttp_server import SimpleRequestHandler from fastapi import APIRouter, Request, Response from app.config import settings from app.messengers.base import MessengerService from app.messengers.telegram.handlers import router as handlers_router api_router = APIRouter() class TelegramService(MessengerService): def __init__(self): self.bot = Bot(token=settings.telegram_bot_token) self.dp = Dispatcher() self.dp.include_router(handlers_router) async def setup(self): if settings.telegram_webhook_url: await self.bot.set_webhook( settings.telegram_webhook_url, drop_pending_updates=True, ) async def shutdown(self): await self.bot.delete_webhook() await self.bot.session.close() async def send_message(self, chat_id: str, text: str, **kwargs): await self.bot.send_message(int(chat_id), text, **kwargs) async def send_file(self, chat_id: str, file_path: str, caption: str = ""): from aiogram.types import FSInputFile await self.bot.send_document( int(chat_id), FSInputFile(file_path), caption=caption, ) async def notify_progress(self, chat_id: str, status: str, progress: int | None = None): text = f"⚙️ {status}" if progress is not None: bar = "▓" * (progress // 10) + "░" * (10 - progress // 10) text += f"\n{bar} {progress}%" await self.send_message(chat_id, text) async def feed_webhook(self, request: Request) -> Response: update = await request.json() from aiogram.types import Update await self.dp.feed_update(self.bot, Update(**update)) return Response(status_code=200) telegram_service = TelegramService() @api_router.post("/api/telegram/webhook") async def telegram_webhook(request: Request): return await telegram_service.feed_webhook(request)