【架构优化】合并 botinteraction/socket.go dial 中三处重复的帧 JSON 键收集排序逻辑

未关闭
#427 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 1 天内回复

@fx-kurumi 已经在做这个了。

开始于 2026年11月13日。

  • #428 来自 @fx-kurumi —— 未关闭

评估

难度
3/5
预计耗时
半天
新手友好度
18/100
Issue 类型
重构
描述清晰度
描述清楚
活跃度
停滞
技术栈
go
领域
backend

调研方向

The work is in internal/botinteraction/socket.go, inside the read-loop goroutine of dial, where three near-identical blocks unmarshal the body, event and template_card_event levels, collect keys and sort them. Read that block and the existing frame logging first. Extract the shared logic into a private helper, then add a unit test file for nested keys, missing levels, invalid JSON and empty input. Note that pull request #428 is already open against this issue, so check it before starting. Done means go vet and go test ./internal/botinteraction/... pass with the log format unchanged.

由索引模型根据 Issue 内容生成。

描述

现状问题

internal/botinteraction/socket.go 的 dial 函数约 75 行,读循环 goroutine 中内联了一段约 25 行的帧诊断日志逻辑:对 body、body.event、body.event.template_card_event 三层 JSON 分别执行「Unmarshal → 收集键 → 排序」,三段代码几乎完全重复,使读循环的主流程(ack 分发 / 回调分发)被淹没,也无法单独测试。

重构方案

  • 新增包内私有辅助函数 sortedJSONKeys(raw json.RawMessage) ([]string, map[string]json.RawMessage),统一完成解析、取键、排序(解析失败或为空时返回空切片 [],与原行为一致)。
  • 新增 logFrameKeys(f Frame) 封装诊断日志,dial 读循环中仅保留一行调用。
  • 日志格式 wecom frame cmd=%s body_keys=%v event_keys=%v card_keys=%v 及触发条件(Cmd 非空且非 aibot_msg_callback)保持不变。

影响范围

仅 internal/botinteraction/socket.go 及新增单测文件;无对外接口、协议或行为变化。

验证方式

  • 新增单测覆盖:三层嵌套键、缺失层级、非法 JSON、空输入。
  • go vet ./internal/botinteraction/...、go test ./internal/botinteraction/... 通过。
主要语言
Go
星标
141
派生
28
平均合并
1 天 15 小时
30 天内合并 PR
113

环境准备

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

Tencent/LoopForge 的其他 Issue

查看 Tencent/LoopForge 的全部 Issue

相似的 Issue

更多 Go Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。