from __future__ import annotations from dataclasses import dataclass, field from typing import Any @dataclass class TemplateButton: text: str action_type: str = "url" value: str = "" style: str = "default" def to_dict(self) -> dict[str, Any]: return { "text": self.text, "type": self.action_type, "value": self.value, "style": self.style, } @dataclass class SelectorOption: label: str value: str description: str = "" def to_dict(self) -> dict[str, Any]: result = {"label": self.label, "value": self.value} if self.description: result["description"] = self.description return result @dataclass class ActionSelector: placeholder: str = "请选择" options: list[SelectorOption] = field(default_factory=list) selector_id: str = "" def to_dict(self) -> dict[str, Any]: return { "type": "action_select", "selector_id": self.selector_id, "placeholder": self.placeholder, "options": [opt.to_dict() for opt in self.options], } @dataclass class TemplateCard: title: str = "" content: str = "" image_url: str = "" link_url: str = "" buttons: list[TemplateButton] = field(default_factory=list) selectors: list[ActionSelector] = field(default_factory=list) def to_dict(self) -> dict[str, Any]: result: dict[str, Any] = {"type": "card"} if self.title: result["title"] = self.title if self.content: result["content"] = self.content if self.image_url: result["image_url"] = self.image_url if self.link_url: result["link_url"] = self.link_url if self.buttons: result["buttons"] = [b.to_dict() for b in self.buttons] if self.selectors: result["selectors"] = [s.to_dict() for s in self.selectors] return result class TemplateMessageBuilder: def __init__(self) -> None: self._content: str = "" self._buttons: list[TemplateButton] = [] self._card: TemplateCard | None = None self._selectors: list[ActionSelector] = [] def set_content(self, content: str) -> TemplateMessageBuilder: self._content = content return self def add_button( self, text: str, action_type: str = "url", value: str = "", style: str = "default", ) -> TemplateMessageBuilder: self._buttons.append(TemplateButton(text=text, action_type=action_type, value=value, style=style)) return self def set_card(self, card: TemplateCard) -> TemplateMessageBuilder: self._card = card return self def add_selector( self, placeholder: str = "请选择", options: list[SelectorOption] | None = None, selector_id: str = "", ) -> TemplateMessageBuilder: self._selectors.append( ActionSelector( placeholder=placeholder, options=options or [], selector_id=selector_id, ) ) return self def build_metadata(self) -> dict[str, Any]: metadata: dict[str, Any] = {} if self._buttons: metadata["buttons"] = [b.to_dict() for b in self._buttons] if self._card: metadata["card"] = self._card.to_dict() if self._selectors: metadata["selectors"] = [s.to_dict() for s in self._selectors] return metadata def build_content(self) -> str: return self._content def reset(self) -> None: self._content = "" self._buttons.clear() self._card = None self._selectors.clear()