新增元宝(Yuanbao)渠道的完整适配器实现,包含以下核心模块: - 基础适配器与导出入口 - 协议编解码与WebSocket帧处理 - 会话管理与路由逻辑 - 事件队列与出站消息队列 - 消息格式转换与发送重试 - 安全审计与权限校验 - 配置映射与账户管理 - 视觉分析与工具函数 - 文档生成与设置向导
139 lines
3.7 KiB
Python
139 lines
3.7 KiB
Python
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()
|