gitscope
https://dev.kronoz.win/r/marzneshin.git
app/notification/telegram.py · v0.7.3
Source
1 8440155 mahdim10 1y ago import logging
2 8440155 mahdim10 1y ago
3 8440155 mahdim10 1y ago from aiogram import Bot
4 8440155 mahdim10 1y ago from aiogram.client.default import DefaultBotProperties
5 8440155 mahdim10 1y ago from aiogram.client.session.aiohttp import AiohttpSession
6 8440155 mahdim10 1y ago from aiogram.enums import ParseMode
7 8440155 mahdim10 1y ago from aiogram.exceptions import TelegramAPIError
8 8440155 mahdim10 1y ago
9 8440155 mahdim10 1y ago from app.config import TELEGRAM_PROXY_URL
10 8440155 mahdim10 1y ago from app.config.env import (
11 8440155 mahdim10 1y ago TELEGRAM_API_TOKEN,
12 8440155 mahdim10 1y ago TELEGRAM_ADMIN_ID,
13 8440155 mahdim10 1y ago TELEGRAM_LOGGER_CHANNEL_ID,
14 8440155 mahdim10 1y ago )
15 8440155 mahdim10 1y ago from app.models.notification import Notification
16 8440155 mahdim10 1y ago from app.notification.helper import create_text
17 8440155 mahdim10 1y ago
18 8440155 mahdim10 1y ago logger = logging.getLogger(__name__)
19 8440155 mahdim10 1y ago
20 8440155 mahdim10 1y ago
21 8440155 mahdim10 1y ago class BotManager:
22 8440155 mahdim10 1y ago _instance = None
23 8440155 mahdim10 1y ago
24 8440155 mahdim10 1y ago @classmethod
25 8440155 mahdim10 1y ago async def get_instance(cls):
26 8440155 mahdim10 1y ago if cls._instance is None and TELEGRAM_API_TOKEN:
27 8440155 mahdim10 1y ago if TELEGRAM_PROXY_URL:
28 8440155 mahdim10 1y ago session = AiohttpSession(proxy=TELEGRAM_PROXY_URL)
29 8440155 mahdim10 1y ago else:
30 8440155 mahdim10 1y ago session = None
31 8440155 mahdim10 1y ago
32 8440155 mahdim10 1y ago cls._instance = Bot(
33 8440155 mahdim10 1y ago token=TELEGRAM_API_TOKEN,
34 8440155 mahdim10 1y ago default=DefaultBotProperties(parse_mode=ParseMode.HTML),
35 8440155 mahdim10 1y ago session=session,
36 8440155 mahdim10 1y ago )
37 8440155 mahdim10 1y ago try:
38 8440155 mahdim10 1y ago await cls._instance.get_me()
39 8440155 mahdim10 1y ago except:
40 8440155 mahdim10 1y ago logger.error("Telegram API token is not valid.")
41 8440155 mahdim10 1y ago return cls._instance
42 8440155 mahdim10 1y ago
43 8440155 mahdim10 1y ago
44 8440155 mahdim10 1y ago async def send_message(
45 8440155 mahdim10 1y ago message: str,
46 8440155 mahdim10 1y ago parse_mode=ParseMode.HTML,
47 8440155 mahdim10 1y ago ):
48 8440155 mahdim10 1y ago if not (bot := await BotManager.get_instance()):
49 8440155 mahdim10 1y ago return
50 8440155 mahdim10 1y ago
51 8440155 mahdim10 1y ago for recipient_id in (TELEGRAM_ADMIN_ID or []) + [
52 8440155 mahdim10 1y ago TELEGRAM_LOGGER_CHANNEL_ID
53 8440155 mahdim10 1y ago ]:
54 8440155 mahdim10 1y ago if not recipient_id:
55 8440155 mahdim10 1y ago continue
56 8440155 mahdim10 1y ago try:
57 8440155 mahdim10 1y ago await bot.send_message(
58 8440155 mahdim10 1y ago recipient_id,
59 8440155 mahdim10 1y ago message,
60 8440155 mahdim10 1y ago parse_mode=parse_mode,
61 8440155 mahdim10 1y ago )
62 8440155 mahdim10 1y ago except TelegramAPIError as e:
63 8440155 mahdim10 1y ago logger.error(e)
64 8440155 mahdim10 1y ago
65 8440155 mahdim10 1y ago
66 8440155 mahdim10 1y ago async def send_notification(notif: Notification):
67 8440155 mahdim10 1y ago text = create_text(notif)
68 8440155 mahdim10 1y ago await send_message(text)