Files
MessageGateway/app/core/button_utils.py
Sergey Antropov b90def35ed Initial commit: Message Gateway project
- FastAPI приложение для отправки мониторинговых алертов в мессенджеры
- Поддержка Telegram и MAX/VK
- Интеграция с Grafana, Zabbix, AlertManager
- Автоматическое создание тикетов в Jira
- Управление группами мессенджеров через API
- Декораторы для авторизации и скрытия эндпоинтов
- Подробная документация в папке docs/

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-11-12 20:25:11 +03:00

128 lines
4.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
Утилиты для работы с кнопками в различных мессенджерах.
Автор: Сергей Антропов
Сайт: https://devops.org.ru
"""
import logging
from typing import Optional, Dict, Any, List
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
logger = logging.getLogger(__name__)
def convert_telegram_buttons_to_dict(buttons: Optional[InlineKeyboardMarkup]) -> Optional[Dict[str, Any]]:
"""
Преобразовать кнопки Telegram (InlineKeyboardMarkup) в универсальный формат Dict.
Args:
buttons: InlineKeyboardMarkup с кнопками или None.
Returns:
Словарь с кнопками в универсальном формате или None.
Формат:
{
"inline_keyboard": [
[
{"text": "Кнопка 1", "url": "https://example.com"},
{"text": "Кнопка 2", "url": "https://example2.com"}
],
[
{"text": "Кнопка 3", "url": "https://example3.com"}
]
]
}
"""
if buttons is None:
return None
if not isinstance(buttons, InlineKeyboardMarkup):
logger.warning(f"Неизвестный тип кнопок: {type(buttons)}")
return None
inline_keyboard = []
for row in buttons.inline_keyboard:
row_buttons = []
for button in row:
if isinstance(button, InlineKeyboardButton):
button_dict = {"text": button.text}
if button.url:
button_dict["url"] = button.url
if button.callback_data:
button_dict["callback_data"] = button.callback_data
row_buttons.append(button_dict)
if row_buttons:
inline_keyboard.append(row_buttons)
if not inline_keyboard:
return None
return {"inline_keyboard": inline_keyboard}
def convert_dict_to_telegram_buttons(buttons_dict: Optional[Dict[str, Any]]) -> Optional[InlineKeyboardMarkup]:
"""
Преобразовать универсальный формат Dict в кнопки Telegram (InlineKeyboardMarkup).
Args:
buttons_dict: Словарь с кнопками в универсальном формате или None.
Returns:
InlineKeyboardMarkup с кнопками или None.
"""
if buttons_dict is None:
return None
inline_keyboard_data = buttons_dict.get("inline_keyboard", [])
if not inline_keyboard_data:
return None
inline_keyboard = []
for row in inline_keyboard_data:
row_buttons = []
for button_data in row:
if isinstance(button_data, dict):
text = button_data.get("text")
url = button_data.get("url")
callback_data = button_data.get("callback_data")
if text:
if url:
row_buttons.append(InlineKeyboardButton(text=text, url=url))
elif callback_data:
row_buttons.append(InlineKeyboardButton(text=text, callback_data=callback_data))
if row_buttons:
inline_keyboard.append(row_buttons)
if not inline_keyboard:
return None
return InlineKeyboardMarkup(inline_keyboard)
def convert_dict_to_vk_buttons(buttons_dict: Optional[Dict[str, Any]]) -> Optional[str]:
"""
Преобразовать универсальный формат Dict в кнопки VK (JSON строка).
Args:
buttons_dict: Словарь с кнопками в универсальном формате или None.
Returns:
JSON строка с кнопками для VK API или None.
"""
if buttons_dict is None:
return None
inline_keyboard_data = buttons_dict.get("inline_keyboard", [])
if not inline_keyboard_data:
return None
# Формируем клавиатуру для VK API
# VK API использует другой формат клавиатуры
# Для простоты возвращаем None, так как VK API требует более сложной структуры
# В реальной реализации нужно преобразовать в формат VK Keyboard
logger.warning("Преобразование кнопок в формат VK пока не реализовано полностью")
return None