""" Утилиты для работы с кнопками в различных мессенджерах. Автор: Сергей Антропов Сайт: 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