# composer.py
from datetime import datetime
from typing import Optional, Tuple
from zoneinfo import ZoneInfo
from app.bot.utils.tg_escape_chars import escape_telegram_chars # или твоя функция, если кастомная
from config import ZABBIX_TZ
def compose_telegram_message(data: dict) -> Tuple[str, Optional[str]]:
"""
Формирует сообщение для Telegram и возвращает его вместе со ссылкой (если есть).
Args:
data (dict): сообщение из очереди
Returns:
Tuple[str, Optional[str]]: текст сообщения и ссылка для кнопки (если есть)
"""
try:
priority_map = {
'High': '⚠️',
'Disaster': '⛔️'
}
convert_time_format = {
"h": "ч",
"m": "м",
"s": "с"
}
priority = priority_map.get(data.get('severity', ''), '')
msg = escape_telegram_chars(data.get('msg', ''))
host = escape_telegram_chars(data.get('host', ''))
ip = escape_telegram_chars(data.get('ip', ''))
severity = escape_telegram_chars(data.get('severity', ''))
status = data.get('status', '').upper()
timestamp = int(data.get('date_reception', 0))
dt = datetime.fromtimestamp(timestamp, tz=ZoneInfo(ZABBIX_TZ))
time_str = dt.strftime('%d.%m.%Y %H:%M:%S')
if status == "PROBLEM":
message = (
f"{priority} {host} ({ip})\n"
f"Описание: {msg}\n"
f"Критичность: {severity}\n"
f"Время возникновения: {time_str} Мск\n"
)
else:
event_duration = data.get('event_duration', '')
duration = ' '.join(
f"{part[:-1]}{convert_time_format.get(part[-1], part[-1])}"
for part in event_duration.split()
)
# Переформатируем event_date из '2025.06.27 16:46:04' в '27.06.2025 16:46:04'
event_date_str = data.get('event_date', '')
if event_date_str:
try:
dt_start = datetime.strptime(event_date_str, "%Y.%m.%d %H:%M:%S")
# не меняем timezone, просто меняем формат
time_start = dt_start.strftime('%d.%m.%Y %H:%M:%S')
except Exception:
time_start = event_date_str # fallback — оставляем как есть
else:
time_start = ''
message = (
f"✅ {host} ({ip})\n"
f"Описание: {msg}\n"
f"Критичность: {severity}\n"
f"Проблема устранена!\n"
f"Время начала: {time_start} Мск\n"
f"Время устранения: {time_str} Мск\n"
f"Длительность проблемы: {duration}\n"
)
link = data.get("link")
return message, link
except KeyError as e:
raise ValueError(f"Missing key in data: {e}")