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

Aberta
#427 0 comentários 0 reações 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 1 dia

@fx-kurumi já está trabalhando nisso.

Desde 13/11/2026.

  • #428 de @fx-kurumi — aberto

Avaliação

Dificuldade
3/5
Tempo estimado
Meio dia
Facilidade para iniciantes
18/100
Tipo de issue
Refatoração
Clareza
Claramente especificada
Status de atividade
Estagnada
Stack de tecnologia
go
Domínio
backend

Direção de pesquisa

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.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

现状问题

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/... 通过。
Linguagem predominante
Go
Estrelas
141
Forks
28
Merge médio
1d 15h
PRs com merge (30d)
113

Preparar o ambiente

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de Tencent/LoopForge

Todas as issues de Tencent/LoopForge

Issues semelhantes

Mais issues de Go

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.