ForcePilot/backend/package/yuxi/channels/adapters/qqbot/ark_templates.py
Kris ef5483dc1a refactor(qqbot): 重构QQ机器人适配器代码,优化多项功能与结构
主要变更:
1. 修复速率限流器使用setdefault替代重复创建令牌桶
2. 重构交互注册表匹配逻辑,优化精确匹配查找
3. 重构去重缓存逻辑,移到适配器实例方法
4. 重构发送URL解析,增加合法性校验并拆分公共方法
5. 优化流式消息处理逻辑,简化flush_controller调用
6. 重构群聊类型判断代码,简化语法
7. 修复重连管理器对None类型关闭分类的处理
8. 新增消息缓存、线程模拟器、发送初始化模块
9. 重构凭证备份与会话存储逻辑,支持环境变量指定状态目录
10. 新增配置提示与向导二维码绑定功能
11. 优化媒体上传逻辑,增加重试机制与缓存
12. 新增审批键盘模板构建函数
13. 重构消息格式处理,修正媒体发送字段与长度限制
14. 修复令牌过期时间计算,使用time.time替代monotonic
15. 新增群组激活缓冲区与用户追踪器增强功能
16. 修复换行符问题,统一文件结尾格式
2026-05-13 16:13:48 +08:00

125 lines
3.5 KiB
Python

from __future__ import annotations
from typing import Any
def build_ark_23(kv_pairs: list[dict[str, str]]) -> dict:
return {
"msg_type": 3,
"ark": {
"template_id": 23,
"kv": kv_pairs,
},
}
def build_ark_24(desc: str, prompt: str, title: str, meta_desc: str, img: str, jump_url: str) -> dict:
return {
"msg_type": 3,
"ark": {
"template_id": 24,
"kv": [
{"key": "#DESC#", "value": desc},
{"key": "#PROMPT#", "value": prompt},
{"key": "#TITLE#", "value": title},
{"key": "#METADESC#", "value": meta_desc},
{"key": "#IMG#", "value": img},
{"key": "#JUMPURL#", "value": jump_url},
],
},
}
def build_ark_37(prompt: str, title: str, subtitle: str, jump_url: str) -> dict:
return {
"msg_type": 3,
"ark": {
"template_id": 37,
"kv": [
{"key": "#PROMPT#", "value": prompt},
{"key": "#TITLE#", "value": title},
{"key": "#SUBTITLE#", "value": subtitle},
{"key": "#JUMPURL#", "value": jump_url},
],
},
}
def build_embed(
title: str = "",
description: str = "",
prompt: str = "",
fields: list[dict] | None = None,
thumbnail: str | None = None,
) -> dict:
result: dict[str, Any] = {
"msg_type": 4,
"embed": {
"title": title,
"description": description[:4096],
"prompt": prompt or description[:200],
"fields": fields or [],
},
}
if thumbnail:
result["embed"]["thumbnail"] = {"url": thumbnail}
return result
def build_text_card(text: str, buttons: list[dict] | None = None) -> dict:
payload: dict[str, Any] = {
"msg_type": 0,
"content": text,
}
if buttons:
payload["keyboard"] = {"content": {"rows": [{"buttons": buttons}]}}
return payload
def build_approval_keyboard(
request_id: str,
action_label: str = "Approve",
reject_label: str = "Reject",
cancel_label: str = "Cancel",
) -> dict:
buttons = [
{
"id": f"approval_approve_{request_id}",
"render_data": {"label": action_label, "visited_label": "✅ 已批准"},
"action": {
"type": 2,
"permission": {"type": 2},
"click_limit": 1,
"data": f"approve:{request_id}",
},
"group_id": "approval",
},
{
"id": f"approval_reject_{request_id}",
"render_data": {"label": reject_label, "visited_label": "❌ 已拒绝"},
"action": {
"type": 2,
"permission": {"type": 2},
"click_limit": 1,
"data": f"reject:{request_id}",
},
"group_id": "approval",
},
{
"id": f"approval_cancel_{request_id}",
"render_data": {"label": cancel_label, "visited_label": "↩️ 已取消"},
"action": {
"type": 2,
"permission": {"type": 2},
"click_limit": 1,
"data": f"cancel:{request_id}",
},
"group_id": "approval",
},
]
return {"content": {"rows": [{"buttons": buttons}]}}
def _kv(key: str, value: str) -> dict[str, str]:
return {"key": key, "value": value}