# 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}")