69 lines
2.7 KiB
Python
69 lines
2.7 KiB
Python
# pxy_bots/renderer.py
|
|
import json
|
|
import logging
|
|
from typing import Dict, List, Optional
|
|
|
|
from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Bot, Message
|
|
from telegram.error import TelegramError
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
# ... _build_keyboard stays the same ...
|
|
|
|
async def render_spec(*, bot: Bot, chat_id: int, spec: Dict) -> List[Message]:
|
|
msgs = spec.get("messages") or []
|
|
top_buttons = spec.get("buttons") or None
|
|
sent: List[Message] = []
|
|
|
|
for i, m in enumerate(msgs):
|
|
mtype = (m.get("type") or "text").lower()
|
|
kb = _build_keyboard(m.get("buttons") or (top_buttons if i == len(msgs) - 1 else None))
|
|
|
|
try:
|
|
if mtype == "text":
|
|
text = m.get("text") or ""
|
|
msg = await bot.send_message(chat_id=chat_id, text=text, reply_markup=kb)
|
|
sent.append(msg)
|
|
|
|
elif mtype == "photo":
|
|
file_id = m.get("file_id")
|
|
media_url = m.get("media_url")
|
|
caption = m.get("caption") or None
|
|
if not (file_id or media_url):
|
|
logger.warning("renderer: photo without file_id/media_url; skipping")
|
|
continue
|
|
msg = await bot.send_photo(chat_id=chat_id, photo=file_id or media_url, caption=caption, reply_markup=kb)
|
|
sent.append(msg)
|
|
|
|
elif mtype == "document":
|
|
file_id = m.get("file_id")
|
|
media_url = m.get("media_url")
|
|
caption = m.get("caption") or None
|
|
if not (file_id or media_url):
|
|
logger.warning("renderer: document without file_id/media_url; skipping")
|
|
continue
|
|
msg = await bot.send_document(chat_id=chat_id, document=file_id or media_url, caption=caption, reply_markup=kb)
|
|
sent.append(msg)
|
|
|
|
elif mtype == "video":
|
|
file_id = m.get("file_id")
|
|
media_url = m.get("media_url")
|
|
caption = m.get("caption") or None
|
|
if not (file_id or media_url):
|
|
logger.warning("renderer: video without file_id/media_url; skipping")
|
|
continue
|
|
msg = await bot.send_video(chat_id=chat_id, video=file_id or media_url, caption=caption, reply_markup=kb)
|
|
sent.append(msg)
|
|
|
|
else:
|
|
logger.warning("renderer: unsupported message type=%s; skipping", mtype)
|
|
|
|
except TelegramError as te:
|
|
logger.exception("renderer.telegram_error type=%s err=%s", mtype, te)
|
|
# continue to next message
|
|
except Exception as e:
|
|
logger.exception("renderer.unexpected type=%s err=%s", mtype, e)
|
|
# continue to next message
|
|
|
|
return sent
|