922b1b26a6
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
60 lines
2.0 KiB
Python
60 lines
2.0 KiB
Python
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)
|