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

Ouverte
#427 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

@fx-kurumi y travaille déjà.

Depuis le 13/11/2026.

  • #428 par @fx-kurumi — ouverte

Évaluation

Difficulté
3/5
Temps estimé
Une demi-journée
Accessibilité débutants
18/100
Type d'issue
Refactorisation
Clarté
Clairement spécifiée
Activité
À l'abandon
Stack technique
go
Domaine
backend

Piste de recherche

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.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

现状问题

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/... 通过。
Langage dominant
Go
Étoiles
141
Forks
28
Merge moyen
1 j 15 h
PR mergées (30 j)
113

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de Tencent/LoopForge

Toutes les issues de Tencent/LoopForge

Issues similaires

Plus d'issues Go

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.