Files
2026-07-20 19:01:03 +08:00

3.7 KiB

文本消息

用户流程:收到文本消息 → 发送文本消息 → 消息按目标归档 对应程序流程:TsClient.sendTextMessage(targetMode, targetID, text) → 等待命令响应 → onTextMessage 按 targetMode/target 归档


一、状态树

聊天状态

flowchart TD
    CHAT[聊天状态<br/>维护发送与接收消息]

    CHAT --> T0[空闲 Idle<br/>没有正在发送的文本消息]
    CHAT --> T1[发送中 Sending<br/>sendTextMessage 等待响应]
    CHAT --> T2[发送失败 Failed<br/>命令返回错误]
    CHAT --> T3[收到消息 Received<br/>OnTextMessage 归档服务端推送]

二、时序:发送与接收文本消息

sequenceDiagram
    participant UI as 聊天 UI<br/>输入消息并展示会话
    participant CHAT as 聊天状态机<br/>管理发送 Pending 和失败
    participant BRIDGE as TSBridge<br/>调用 TsClient API
    participant SDK as Go SDK (gomobile)<br/>发送并解析文本消息
    participant TS as TeamSpeak 服务器<br/>路由私聊、频道或服务器消息
    participant STORE as 消息仓库<br/>按真实目标会话归档

    UI->>CHAT: MessageSendRequested(targetMode, targetID, text)
    CHAT->>CHAT: 创建 requestId 与 sending 状态
    CHAT->>BRIDGE: sendTextMessage(targetMode, targetID, text)
    BRIDGE->>SDK: gomobile SendTextMessage
    SDK->>TS: sendtextmessage

    alt 发送失败
        TS-->>SDK: error
        SDK-->>BRIDGE: 命令失败
        BRIDGE-->>CHAT: 返回错误
        CHAT-->>UI: 标记消息发送失败
    else 发送成功
        TS-->>SDK: command ok
        SDK-->>BRIDGE: 命令成功
        BRIDGE-->>CHAT: 返回成功
        CHAT-->>UI: 标记发送完成
    end

    TS-->>SDK: notifytextmessage
    SDK->>CHAT: onTextMessage(TsTextMessage)
    CHAT->>STORE: 按 targetMode 与 target 归档
    STORE-->>UI: 更新目标会话和未读状态

三、事件依赖

文本消息前置依赖矩阵

操作或事件 必须依赖 建议依赖 依赖失败时的处理
TsClient.sendTextMessage 已连接、合法 targetMode 和 target 已建立目标会话上下文 失败保留可重试消息状态
onTextMessage 归档 targetModetarget、发送者信息 已有频道或私聊实体 不得使用当前页面猜测目标

服务端通知映射

服务端通知 TSBridge 回调 → EventBus 事件 上层状态依赖 中文说明
notifytextmessage OnTextMessageTextMessage 消息归档、未读 立即分发,必须读取 targetMode 和 target

命令响应与事件事实的区别

flowchart LR
    INTENT[用户意图<br/>发送文本消息] --> COMMAND[客户端请求<br/>SendTextMessage]
    COMMAND --> RESPONSE{命令响应<br/>判断服务器是否接受请求}
    RESPONSE -- 失败 --> FAILED[请求失败<br/>保留原事实并展示原因]
    RESPONSE -- 成功 --> WAITFACT[等待事实事件<br/>适用于有对应推送的操作]
    WAITFACT --> EVENT[服务端推送事件<br/>OnTextMessage]
    EVENT --> COMMIT[提交服务器事实<br/>归档消息实体]

    RESPONSE -- 无对应事实事件 --> LOCALDONE[完成本次调用<br/>仅记录调用结果]

关键区分:

  • TsClient.sendTextMessage 返回成功:发送命令成功;如果服务器会向自己回推消息,可再用 onTextMessage 归档权威消息。
  • 消息归档必须依据 targetModetarget,不能使用当前页面频道代替真实目标。

权威性划分

数据 推荐权威来源 原因
文本消息 onTextMessage 来源是 notifytextmessage