mirror of
https://gitcode.com/JianFeeeee/homeagent-sdk.git
synced 2026-09-20 17:08:01 +00:00
## 问题
1. NapCat get_msg 的 message_id 是 QQ 服务端临时短号,约 3 天后失效。
实测 1306 条真实 webhook 消息,141 条(10.8%)现在查回报「消息不存在」,
全是 3 天前的旧消息;1 小时内的消息可正常查回。NapCat 侧无保留时长配置项
(napcat.json / onebot11_*.json / webui.json 均无),是 QQ 协议硬限制。
模型收到 not_found 后曾编造正文(虚构 message_id + 虚构需求),
已在核心 prompt 加事实性约束,此处从插件层根治取不到正文的问题。
2. 插件与真人客户端差距大:没有会话列表、消息不按到达先后排序、无未读提醒,
模型只能靠单条中断消息被动响应,导致消息处理不及时。
## 改动
### msg_id → get_history 兜底(不缓存正文)
- 新增 msgRef{peerID,isGroup,time}:只记 msg_id → (peer, 时间) 映射,7 天 TTL
(qqMsgTTL),超 2000 条时惰性清理过期项。不缓存消息正文。
- handleGetMessage 改为包装层:命中映射且 <7 天 → getMsgFromHistoryByTime()
按 peer 拉 get_history(count=50),取时间最接近的一条,
经 msgToGetMsgResult() 包装为与 get_msg 同构的结果(附 resolved_via:history);
未命中或超 7 天 → 回退原 NapCat get_msg(重命名为 getMsgFromNapcat)。
- 超 7 天的消息由 get_history 自行处理,插件不做长期缓存。
- not_found 文案改为明确引导改用 qq_get_history / qq_list_chats。
### 会话列表(对齐真人客户端)
- 新增 chatMeta:会话名、未读数、最新一条 ≤60 字摘要(qqLastSumLen)、最新时间。
只维护最新一条摘要,不存历史。
- 新增 qq_list_chats:按最新消息时间降序返回会话列表,每项含
peer_id/type/name/unread/last_text/last_nick/last_time。
- 新增 qq_mark_read:按 group_id/user_id 清零未读;get_history 拉取某会话后
自动标已读(看过=已读,与真人客户端一致)。
- webhook 记录时机前移:策略允许的消息(群/私聊、是否 @bot 均记)都进入映射与
会话状态,@bot 只决定是否发中断——与真人客户端一致能看到全部会话。
### 中断模板
- 补 fallback 路径与私聊 user_id(原模板只给 message_id,取不到正文时
模型没有 peer 信息可用于 get_history):
「先用 get_message 取正文;若取不到(已过期),改用 get_history(...) 按会话拉取,
或用 list_chats 查看未读会话。用 output_send__qq 回复」
## 验证
用重建的 plugindev build --target linux/amd64 产出 dist/qq_linux_amd64.hmap,
经内核 plugin_install(overwrite=true) 安装(action=reinstalled, config_kept=true),
重启 homed 后内核注册 20 个 qq_* 工具(原 18 + list_chats + mark_read)。
实测 qq_list_chats(count=8) 返回按时间排序的会话,unread=6 正确累积。
注意:cgo c-shared 插件带完整 Go runtime,dlclose 后引用计数不归零,
同路径 dlopen 复用旧映像,plgreload 无法热替换 .so,换 .so 必须重启 homed。
18 lines
353 B
JSON
18 lines
353 B
JSON
{
|
|
"name": "qq",
|
|
"name_zh": "QQ消息",
|
|
"name_en": "qq",
|
|
"version": "1.2.0",
|
|
"description": "QQ 消息收发插件,通过 NapCat 协议桥接",
|
|
"author": "HomeAgent",
|
|
"entry": "plugin.so",
|
|
"tags": [
|
|
"qq",
|
|
"messaging"
|
|
],
|
|
"targets": "linux/amd64",
|
|
"outdir": "dist",
|
|
"bundle": false,
|
|
"replaces": {},
|
|
"source_dirs": []
|
|
} |