Bridge 层 API 文档
本文档是 go/teamspeak/bridge.go + go/teamspeak/kotlin_api.go 的完整 API 参考。
两个文件共同构成 gomobile 导出的 teamspeak 包,供 Kotlin 侧通过 TSBridge 调用。
gomobile 导出约定:
- 返回
string:空字符串 "" = 成功,非空 = 错误信息
- 返回 JSON
string:查询结果以 JSON 编码,"[]" / "{}" 表示空或错误
- 不支持
[]string、[]*T、error 等 Go 类型,复杂数据一律通过 JSON 传递
- 回调通过
EventCallback 接口定义,所有 JNI 回调在同一线程顺序执行
一、客户端构造
NewClient
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
NewClient |
本地调用 |
NewClient() *TSClient |
创建客户端实例 |
创建一个空的 TSClient 实例。不建立网络连接,不生成 Identity。需要随后调用 Connect 或 ConnectWithIdentity 发起连接。 |
二、Identity 管理
GenerateIdentity
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
GenerateIdentity |
本地调用 |
GenerateIdentity(securityLevel int) string |
生成加密身份 |
生成 TeamSpeak 加密身份(ECDSA P-256 密钥对),返回序列化字符串 "base64PrivateKey:offset"。securityLevel 推荐值 8(2048-bit RSA challenge),值越大生成越慢。Kotlin 侧应将返回值持久化到 SharedPreferences / DataStore,后续通过 ConnectWithIdentity 复用。返回空字符串表示生成失败。 |
ConnectWithIdentity
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
ConnectWithIdentity |
客户端请求 |
(c *TSClient) ConnectWithIdentity(identityStr, host, nickname, password, defaultChannel, defaultChannelPassword string, cb EventCallback) string |
用已有身份连接 |
使用 GenerateIdentity 生成并持久化的 identity 字符串连接服务器。与 Connect 行为相同(注册事件 → 发起 UDP 连接 → 等待握手完成,30 秒超时),但复用已有身份而非每次生成新的。password、defaultChannel、defaultChannelPassword 为空时忽略。返回空字符串表示连接成功。 |
三、连接管理
Connect
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
Connect |
客户端请求 |
(c *TSClient) Connect(host, nickname, password, defaultChannel, defaultChannelPassword string, cb EventCallback) string |
连接服务器 |
每次生成新 Identity,注册全部事件回调,发起 UDP 连接并等待握手完成(30 秒超时)。host 支持域名/IP/TSDNS,可带端口号(默认 9987)。password 为服务器密码(可选)。defaultChannel 为连接后自动加入的频道名(可选)。defaultChannelPassword 为默认频道密码(可选)。返回空字符串表示连接成功。 |
Disconnect
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
Disconnect |
客户端请求 |
(c *TSClient) Disconnect() |
断开连接 |
停止事件消费协程,发送 disconnect 命令通知服务器,清理客户端状态。断开后触发 OnDisconnected 回调。可安全重复调用。 |
IsConnected
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
IsConnected |
本地调用 |
(c *TSClient) IsConnected() bool |
查询连接状态 |
返回当前是否已连接且客户端实例有效。线程安全。 |
GetClientID
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
GetClientID |
本地调用 |
(c *TSClient) GetClientID() int |
获取自身客户端 ID |
返回服务器分配的当前客户端 ID(clid)。未连接时返回 0。ID 由 SDK 本地缓存,不产生网络请求。 |
GetChannelID
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
GetChannelID |
客户端请求 |
(c *TSClient) GetChannelID() string |
获取自身所在频道 ID |
通过 clientinfo clid=self 查询当前客户端所在频道 ID。返回频道 ID 字符串,未连接或查询失败返回 "0"。 |
四、频道查询
GetChannelsJSON
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
GetChannelsJSON |
客户端请求 |
(c *TSClient) GetChannelsJSON() string |
获取基础频道列表 |
调用 channellist 协议命令,返回 JSON 数组。每个元素包含 id、name、parentId、description 四个字段。ID 和 ParentID 均为字符串格式的 uint64。未连接返回 "[]"。 |
返回示例:
GetChannelsDetailedJSON
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
GetChannelsDetailedJSON |
客户端请求 |
(c *TSClient) GetChannelsDetailedJSON() string |
获取详细频道列表 |
调用 channellist -topic -flags -voice -limits -icon 协议命令,返回 JSON 数组。比 GetChannelsJSON 多出 14 个字段:topic、order、codec、codecQuality、neededTalkPower、maxClients、maxFamilyClients、isMaxClientsUnlimited、isMaxFamilyClientsUnlimited、isPermanent、isSemiPermanent、isDefault、isPassword、isOrdered、iconId、neededModifyPower。用于频道列表页 UI 渲染(密码图标🔒、永久标记📌、人数限制👥等)。未连接返回 "[]"。 |
返回示例:
ListChannelsSortedJSON
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
ListChannelsSortedJSON |
客户端请求 |
(c *TSClient) ListChannelsSortedJSON() string |
获取去重+排序的详细频道列表 |
底层同样调用 channellist -topic -flags -voice -limits -icon,但额外处理:①按 ID 去重(保留最后出现的条目);②按 channel_order 排序,先顶层频道再子频道(树形扁平化:顶层频道按 order 排序,每个频道的子频道紧跟其后并按 order 排序)。返回 JSON 数组,字段与 GetChannelsDetailedJSON 完全一致。适合频道列表页直接展示,无需客户端侧再做排序和去重。未连接返回 "[]"。 |
GetChannelDetailInfoJSON
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
GetChannelDetailInfoJSON |
客户端请求 |
(c *TSClient) GetChannelDetailInfoJSON(channelIDStr string) string |
获取单频道详情 |
调用 channelinfo cid=X 协议命令,返回 JSON 对象。与 GetChannelsDetailedJSON 的区别:本方法返回单个频道的完整信息(含 description 完整描述和 bannerGfxUrl),适合频道详情面板展示。channelIDStr 为频道 ID 字符串。未连接或无效 ID 返回 "{}"。 |
返回示例:
FindChannelsJSON
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
FindChannelsJSON |
客户端请求 |
(c *TSClient) FindChannelsJSON(pattern string) string |
按名称搜索频道 |
调用 channelfind pattern=X 协议命令,返回 JSON 数组。每个元素包含 id 和 name。pattern 支持通配符。用于频道搜索/快速跳转功能。未连接或无匹配返回 "[]"。 |
返回示例:
五、客户端查询
GetClientsJSON
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
GetClientsJSON |
客户端请求 |
(c *TSClient) GetClientsJSON() string |
获取在线客户端列表 |
调用 clientlist -uid -away -voice -groups 协议命令,返回 JSON 数组。每个元素包含 id(clid)、nickname、uid、channelId、serverGroups(字符串数组)、isSelf(是否是当前用户)。自动比对 ClientID() 标记 isSelf 字段。未连接返回 "[]"。 |
返回示例:
GetClientDetailInfoJSON
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
GetClientDetailInfoJSON |
客户端请求 |
(c *TSClient) GetClientDetailInfoJSON(clid int) string |
获取单客户端详情 |
调用 clientinfo clid=X 协议命令,返回 JSON 对象。比 GetClientsJSON 的列表项多出 away、awayMessage、inputMuted、outputMuted、platform、version、ip、created、lastConnected、totalConnections、description、iconId 等字段。用于点击客户端后的详情弹窗。clid 为客户端 ID。未连接返回 "{}"。 |
返回示例:
FindClientByNameJSON
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
FindClientByNameJSON |
客户端请求 |
(c *TSClient) FindClientByNameJSON(nickname string) string |
按昵称搜索数据库客户端 |
调用 clientdbfind pattern=X -uid 协议命令,返回 JSON 对象 {"uid":"xxx","dbid":"123"}。搜索服务器数据库中注册过的客户端(不要求在线)。未连接或无匹配返回 "{}"。 |
FindClientByDBIDJSON
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
FindClientByDBIDJSON |
客户端请求 |
(c *TSClient) FindClientByDBIDJSON(dbidStr string) string |
按 DBID 查找客户端 UID |
调用 clientdbfind -uid cldbid=X 协议命令,返回 JSON 对象 {"uid":"xxx"}。通过数据库 ID 反查唯一标识。dbidStr 为数据库 ID 字符串。未连接或无匹配返回 "{}"。 |
ListDBClientsJSON
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
ListDBClientsJSON |
客户端请求 |
(c *TSClient) ListDBClientsJSON(start, duration int) string |
获取数据库客户端列表 |
调用 clientdblist start=X duration=X 协议命令,返回 JSON 数组。每个元素包含 dbid、uid、nickname、created、lastConnected、totalConnections、description。start 为起始位置,duration 为返回数量(0=全部)。用于管理功能中的用户数据库浏览。未连接返回 "[]"。 |
六、服务器信息
GetServerInfoJSON
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
GetServerInfoJSON |
客户端请求 |
(c *TSClient) GetServerInfoJSON() string |
获取服务器信息 |
调用 serverinfo 协议命令,返回 JSON 对象。包含 name(服务器名)、welcomeMessage、maxClients、clientsOnline、channelsOnline、uptime(运行秒数)、version、platform、created(创建时间戳)、iconId、defaultServerGroup、defaultChannelGroup。用于服务器详情展示。未连接返回 "{}"。 |
返回示例:
七、文本消息与 Poke
SendTextMessage
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
SendTextMessage |
客户端请求 |
(c *TSClient) SendTextMessage(targetMode int, targetIDStr string, message string) string |
发送文字消息 |
发送文本消息到指定目标。targetMode: 1=私聊(target 为客户端 ID)、2=频道消息(target 为频道 ID)、3=服务器消息(target 忽略)。targetIDStr 为目标 ID 字符串。message 为消息内容。返回空字符串表示发送成功。 |
SendChannelMessage
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
SendChannelMessage |
客户端请求 |
(c *TSClient) SendChannelMessage(channelIDStr, message string) string |
发送频道消息 |
SendTextMessage(targetMode=2, ...) 的快捷方式。channelIDStr 为频道 ID 字符串。返回空字符串表示发送成功。 |
Poke
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
Poke |
客户端请求 |
(c *TSClient) Poke(clidStr string, message string) string |
发送 Poke |
向指定客户端发送 Poke(戳一戳)消息。clidStr 为目标客户端 ID 字符串。message 为 Poke 文本。对方会收到弹窗通知。返回空字符串表示发送成功。 |
八、频道切换与客户端移动
MoveToChannel
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
MoveToChannel |
客户端请求 |
(c *TSClient) MoveToChannel(channelIDStr, password string) string |
移动自己到目标频道 |
将当前客户端移动到指定频道。channelIDStr 为目标频道 ID 字符串。password 为频道密码(无密码传空字符串)。调用 ClientMove(selfID, channelID, password)。返回空字符串表示命令已发送,实际移动需等待 OnClientMoved 事件确认。 |
MoveClient
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
MoveClient |
客户端请求 |
(c *TSClient) MoveClient(clientID int, channelIDStr, password string) string |
移动指定客户端到目标频道 |
将任意客户端移动到指定频道(需要权限)。clientID 为要移动的客户端 ID(clid)。channelIDStr 为目标频道 ID 字符串。password 为频道密码(可选)。返回空字符串表示命令已发送。 |
MoveChannel
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
MoveChannel |
客户端请求 |
(c *TSClient) MoveChannel(channelIDStr, parentIDStr, orderStr string) string |
移动频道位置 |
移动频道到新的父频道下或调整排序。channelIDStr 为要移动的频道 ID。parentIDStr 为新的父频道 ID("0" = 顶层)。orderStr 为排序位置("0" = 最顶部)。返回空字符串表示成功。 |
九、频道管理
CreateChannelJSON
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
CreateChannelJSON |
客户端请求 |
(c *TSClient) CreateChannelJSON(name, propertiesJSON string) string |
创建频道 |
调用 channelcreate channel_name=X [params...]。name 为频道名。propertiesJSON 为 JSON 对象,包含可选属性如 {"channel_topic":"主题","channel_flag_permanent":"1","cpid":"父频道ID","channel_password":"密码","channel_maxclients":"10","channel_codec":"4"}。返回新频道 ID 字符串,空字符串表示失败。 |
EditChannelJSON
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
EditChannelJSON |
客户端请求 |
(c *TSClient) EditChannelJSON(channelIDStr, propertiesJSON string) string |
编辑频道属性 |
调用 channeledit cid=X [params...]。channelIDStr 为频道 ID 字符串。propertiesJSON 为 JSON 对象,包含要修改的属性。返回空字符串表示成功。 |
DeleteChannel
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
DeleteChannel |
客户端请求 |
(c *TSClient) DeleteChannel(channelIDStr string, force bool) string |
删除频道 |
调用 channeldelete cid=X force=X。channelIDStr 为频道 ID 字符串。force=true 强制删除(含子频道),false 仅在频道为空时删除。返回空字符串表示成功。 |
十、客户端管理
UpdateSelfJSON
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
UpdateSelfJSON |
客户端请求 |
(c *TSClient) UpdateSelfJSON(propertiesJSON string) string |
更新自身属性 |
调用 clientupdate [params...]。propertiesJSON 为 JSON 对象。常用参数:client_nickname(新昵称)、client_away("1"/"0" 离开状态)、client_away_message(离开消息)、client_input_muted("1"/"0" 输入静音)、client_output_muted("1"/"0" 输出静音)、client_phonetic_nickname(语音昵称)。返回空字符串表示成功。 |
用法示例:
KickClient
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
KickClient |
客户端请求 |
(c *TSClient) KickClient(clid int, reasonID int, reasonMsg string) string |
踢出客户端 |
调用 clientkick clid=X reasonid=X reasonmsg=X。clid 为客户端 ID。reasonID: 4=从频道踢出,5=从服务器踢出。reasonMsg 为踢出原因文本。返回空字符串表示成功。 |
十一、语音
SendVoice
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
SendVoice |
客户端请求 |
(c *TSClient) SendVoice(data []byte, codec int64) string |
发送语音帧 |
发送原始 Opus 编码的语音帧到当前频道。data 为 Opus 编码的音频数据(20ms 帧)。codec: 4=Opus Voice(语音通话,默认),5=Opus Music(高保真音频)。通过 UDP 传输。返回空字符串表示发送成功。 |
十二、Ban 管理
ListBansJSON
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
ListBansJSON |
客户端请求 |
(c *TSClient) ListBansJSON() string |
获取封禁列表 |
调用 banlist 协议命令,返回 JSON 数组。每个元素包含 banId、ip、name、uid、created(时间戳)、invokerName(操作者)、invokerUid、reason、enforcement(是否立即执行)。未连接返回 "[]"。 |
AddBan
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
AddBan |
客户端请求 |
(c *TSClient) AddBan(ip, name, uid string, timeSeconds int, reason string) string |
添加封禁 |
调用 banadd ip=X name=X uid=X time=X banreason=X。ip/name/uid 至少指定一个,可组合使用。timeSeconds 为封禁时长(秒),0=永久。reason 为封禁原因(可选)。返回空字符串表示成功。 |
DeleteBan
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
DeleteBan |
客户端请求 |
(c *TSClient) DeleteBan(banIDStr string) string |
删除封禁 |
调用 bandel banid=X。banIDStr 为封禁 ID 字符串(从 ListBansJSON 获取)。返回空字符串表示成功。 |
DeleteAllBans
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
DeleteAllBans |
客户端请求 |
(c *TSClient) DeleteAllBans() string |
清除所有封禁 |
调用 bandelall 协议命令,删除服务器上的全部封禁记录。返回空字符串表示成功。 |
十三、Token 管理
ListTokensJSON
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
ListTokensJSON |
客户端请求 |
(c *TSClient) ListTokensJSON() string |
获取权限密钥列表 |
调用 tokenlist 协议命令,返回 JSON 数组。每个元素包含 token(密钥字符串)、tokenType(0=服务器组, 1=频道组)、tokenId1(组 ID)、tokenId2(频道 ID,仅 tokenType=1)、created(创建时间戳)、description。未连接返回 "[]"。 |
UseToken
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
UseToken |
客户端请求 |
(c *TSClient) UseToken(token string) string |
激活权限密钥 |
调用 tokenuse token=X。token 为权限密钥字符串。激活后自动获得对应的服务器组或频道组权限。返回空字符串表示成功。 |
十四、投诉管理
ListComplaintsJSON
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
ListComplaintsJSON |
客户端请求 |
(c *TSClient) ListComplaintsJSON(targetDBIDStr string) string |
获取投诉列表 |
调用 complainlist [tcldbid=X] 协议命令,返回 JSON 数组。每个元素包含 fromDbid(投诉者 DBID)、toDbid(被投诉者 DBID)、message(投诉内容)、timestamp(投诉时间戳)。targetDBIDStr 为 "0" 或空字符串时返回全部投诉。未连接返回 "[]"。 |
AddComplaint
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
AddComplaint |
客户端请求 |
(c *TSClient) AddComplaint(targetDBIDStr, message string) string |
提交投诉 |
调用 complainadd tcldbid=X message=X。targetDBIDStr 为被投诉者的数据库 ID 字符串。message 为投诉内容。返回空字符串表示成功。 |
DeleteComplaint
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
DeleteComplaint |
客户端请求 |
(c *TSClient) DeleteComplaint(targetDBIDStr, fromDBIDStr string) string |
删除投诉 |
调用 complaindel tcldbid=X fcldbid=X。targetDBIDStr 为被投诉者 DBID,fromDBIDStr 为投诉者 DBID。返回空字符串表示成功。 |
十五、文件传输
ListFilesJSON
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
ListFilesJSON |
客户端请求 |
(c *TSClient) ListFilesJSON(channelIDStr, path string) string |
获取频道文件列表 |
调用 ftgetfilelist cid=X path=X 协议命令,返回 JSON 数组。每个元素包含 name(文件/目录名)、size(字节数,目录为 0)、dateTime(修改时间戳)、isFile(true=文件, false=目录)。channelIDStr 为频道 ID 字符串。path 为虚拟路径,根目录为 "/"。未连接返回 "[]"。 |
FileTransferInitUploadJSON
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
FileTransferInitUploadJSON |
客户端请求 |
(c *TSClient) FileTransferInitUploadJSON(channelIDStr, path string, size int64, overwrite bool) string |
初始化文件上传 |
调用 ftinitupload cid=X path=X size=X overwrite=X,等待服务器返回传输参数。返回 JSON 对象:port(TCP 端口)、key(传输密钥)、clientFileTransferID、serverFileTransferID、seekPosition(断点续传位置)。channelIDStr 为频道 ID。path 为目标路径。size 为文件字节数。overwrite 为是否覆盖。TCP 连接 host 为当前服务器地址。未连接返回 "{}"。 |
FileTransferInitDownloadJSON
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
FileTransferInitDownloadJSON |
客户端请求 |
(c *TSClient) FileTransferInitDownloadJSON(channelIDStr, path string) string |
初始化文件下载 |
调用 ftinitdownload cid=X path=X,等待服务器返回传输参数。返回 JSON 对象:port(TCP 端口)、key(传输密钥)、size(文件字节数)、clientFileTransferID、serverFileTransferID。channelIDStr 为频道 ID。path 为源路径。未连接返回 "{}"。 |
DeleteFile
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
DeleteFile |
客户端请求 |
(c *TSClient) DeleteFile(channelIDStr, pathsJSON string) string |
删除频道文件 |
调用 ftdeletefile cid=X path=X [path2=X ...]。channelIDStr 为频道 ID 字符串。pathsJSON 为要删除的文件路径 JSON 数组,如 ["/file1.txt","/dir/file2.txt"]。返回空字符串表示成功。 |
十六、批量查询
GetInitialSyncJSON
| 名字 |
触发形式 |
用法 |
作用 |
详细描述 |
GetInitialSyncJSON |
客户端请求 |
(c *TSClient) GetInitialSyncJSON() string |
首次同步批量查询 |
一次性返回连接后首次同步所需的全部数据,将 4 次 JNI 调用合并为 1 次。内部依次调用 GetChannelsDetailedJSON、GetClientsJSON、GetClientID、GetChannelID、GetServerInfoJSON,合并为单个 JSON 对象返回。任一子查询失败时对应字段为 null/空,不影响其他字段。未连接返回 "{}"。 |
返回格式:
十七、事件回调接口
EventCallback
所有事件通过 EventCallback 接口回调。Kotlin 侧实现此接口并传入 Connect 或 ConnectWithIdentity。所有回调在同一个 goroutine 中顺序执行(通过内部事件队列保证),无需担心并发问题。
| 回调方法 |
触发时机 |
参数 |
描述 |
OnConnected() |
连接握手完成 |
无 |
服务器握手成功,可以开始发送业务命令。此时应执行首次同步(调用 GetInitialSyncJSON)。 |
OnDisconnected(message string) |
连接断开 |
message: 错误原因 |
网络中断或服务器主动断开。message 为空表示正常断开。此时应清理 UI 状态并提示用户。 |
OnTextMessage(msg *TextMsg) |
收到文本消息 |
msg.TargetMode: 1=私聊/2=频道/3=服务器;msg.TargetID: 目标 ID;msg.InvokerName: 发送者昵称;msg.InvokerUID: 发送者 UID;msg.Message: 消息内容 |
收到其他客户端发送的文本消息。按 TargetMode + Target 归档到正确的会话。 |
OnClientEnter(client *Client) |
用户进入视野 |
client.ID: 客户端 ID;client.Nickname: 昵称;client.UID: UID;client.ChannelID: 所在频道 ID |
新客户端进入服务器。应添加到本地成员表。client.ChannelID 来自 notifycliententerview,可能不准确,需补偿同步。 |
OnClientLeave(id int, reasonMsg string) |
用户离开 |
id: 客户端 ID;reasonMsg: 离开原因 |
客户端离开服务器。应从本地成员表移除。 |
OnClientMoved(id int, targetChannelID string) |
用户移动频道 |
id: 客户端 ID;targetChannelID: 目标频道 ID |
客户端在频道间移动。当 id == GetClientID() 时,表示自己被移动(含密码验证结果)。应更新成员所在频道。 |
OnKicked(reason string) |
被踢出 |
reason: 踢出原因 |
自己被从频道或服务器踢出。应停止语音采集,清理会话状态,显示被踢原因并允许重连。 |
OnVoiceData(clientID int, data []byte, codec int) |
收到语音 |
clientID: 发送者 ID;data: Opus 编码帧;codec: 4=Opus Voice/5=Opus Music |
收到同频道其他客户端的语音数据。data 可直接送入 Opus 解码器。回调中不要做耗时操作,应推入 channel 由独立协程解码播放。 |
OnPoked(event *PokeEvent) |
被 Poke |
event.InvokerID: 发送者 ID;event.InvokerName: 发送者昵称;event.InvokerUID: 发送者 UID;event.Message: Poke 消息 |
收到其他用户的 Poke 消息。应显示 Toast 或弹窗通知。 |
Kotlin 侧事件处理流程
以下三个事件在 Android 端有完整的 UI 处理链路:
被管理员移动到指定频道(OnClientMoved)
日志标识: Client moved: {id} -> channel {channelID}、Self moved by external action to channel {channelID}
收到频道内文本消息(OnTextMessage, targetMode=2)
日志标识: onTextMessage: targetMode=2, targetID={channelID}, invokerName={name}, message={content}
被 Poke 带文本消息(OnPoked)
日志标识: Poked by {name}: {message}
注意: Poke 震动需要 android.permission.VIBRATE 权限(AndroidManifest.xml 中声明即可,无需运行时请求)。
十八、导出数据类型
以下类型通过 gomobile 导出到 Kotlin 侧,可直接在回调参数中使用。
Channel
| 字段 |
类型 |
描述 |
ID |
string |
频道 ID |
Name |
string |
频道名称 |
ParentID |
string |
父频道 ID |
Description |
string |
频道描述 |
Client
| 字段 |
类型 |
描述 |
ID |
int |
客户端 ID(clid) |
Nickname |
string |
昵称 |
UID |
string |
唯一标识 |
ChannelID |
string |
所在频道 ID |
IsSelf |
bool |
是否是当前用户(仅 GetClientsJSON 中自动标记) |
TextMsg
| 字段 |
类型 |
描述 |
InvokerName |
string |
发送者昵称 |
InvokerUID |
string |
发送者唯一标识 |
Message |
string |
消息内容 |
TargetMode |
int |
1=私聊, 2=频道, 3=服务器 |
TargetID |
string |
目标 ID |
PokeEvent
| 字段 |
类型 |
描述 |
InvokerID |
int |
发送者客户端 ID |
InvokerName |
string |
发送者昵称 |
InvokerUID |
string |
发送者唯一标识 |
Message |
string |
Poke 消息内容 |
十九、JSON 数据结构参考
以下 JSON 结构由查询方法返回,供 Kotlin 侧反序列化使用。
channelJSON(GetChannelsJSON / FindChannelsJSON)
| 字段 |
类型 |
描述 |
id |
string |
频道 ID |
name |
string |
频道名称 |
parentId |
string |
父频道 ID(GetChannelsJSON 有,FindChannelsJSON 无) |
description |
string |
频道描述(GetChannelsJSON 有,FindChannelsJSON 无) |
channelDetailedJSON(GetChannelsDetailedJSON)
| 字段 |
类型 |
描述 |
id |
string |
频道 ID |
name |
string |
频道名称 |
parentId |
string |
父频道 ID |
topic |
string |
频道主题 |
order |
string |
排序顺序 |
codec |
int |
编解码器(4=Opus Voice, 5=Opus Music) |
codecQuality |
int |
编解码质量(0-10) |
neededTalkPower |
int |
发言所需权限等级 |
maxClients |
int |
最大客户端数(-1=无限) |
maxFamilyClients |
int |
最大族客户端数(-1=无限) |
isMaxClientsUnlimited |
bool |
是否无限人数 |
isMaxFamilyClientsUnlimited |
bool |
是否无限族人数 |
isPermanent |
bool |
永久频道 |
isSemiPermanent |
bool |
半永久频道 |
isDefault |
bool |
默认频道 |
isPassword |
bool |
有密码 |
isOrdered |
bool |
手动排序 |
iconId |
string |
频道图标 ID |
neededModifyPower |
int |
修改频道所需权限 |
channelDetailedInfoJSON(GetChannelDetailInfoJSON)
| 字段 |
类型 |
描述 |
id |
string |
频道 ID |
parentId |
string |
父频道 ID |
name |
string |
频道名称 |
topic |
string |
频道主题 |
description |
string |
完整描述(可能很长) |
codec |
int |
编解码器 |
codecQuality |
int |
编解码质量 |
maxClients |
int |
最大人数 |
maxFamilyClients |
int |
最大族人数 |
neededTalkPower |
int |
发言权限 |
iconId |
string |
图标 ID |
isPermanent |
bool |
永久 |
isSemiPermanent |
bool |
半永久 |
isDefault |
bool |
默认 |
isPassword |
bool |
有密码 |
order |
string |
排序 |
bannerGfxUrl |
string |
Banner 图片 URL |
clientJSON(GetClientsJSON)
| 字段 |
类型 |
描述 |
id |
int |
客户端 ID |
nickname |
string |
昵称 |
uid |
string |
唯一标识 |
channelId |
string |
所在频道 ID |
serverGroups |
[]string |
所在服务器组 ID 列表 |
isSelf |
bool |
是否是当前用户 |
clientDetailedInfoJSON(GetClientDetailInfoJSON)
| 字段 |
类型 |
描述 |
id |
string |
客户端 ID |
nickname |
string |
昵称 |
uid |
string |
唯一标识 |
channelId |
string |
所在频道 ID |
type |
int |
客户端类型 |
serverGroups |
[]string |
服务器组 |
away |
bool |
是否离开 |
awayMessage |
string |
离开消息 |
inputMuted |
bool |
输入静音 |
outputMuted |
bool |
输出静音 |
platform |
string |
平台 |
version |
string |
版本 |
ip |
string |
IP 地址 |
created |
string |
首次连接时间戳 |
lastConnected |
string |
最近连接时间戳 |
totalConnections |
int |
总连接次数 |
description |
string |
用户描述 |
iconId |
string |
图标 ID |
serverInfoJSON(GetServerInfoJSON)
| 字段 |
类型 |
描述 |
name |
string |
服务器名称 |
welcomeMessage |
string |
欢迎消息 |
maxClients |
int |
最大客户端数 |
clientsOnline |
int |
在线客户端数 |
channelsOnline |
int |
在线频道数 |
uptime |
string |
运行时长(秒) |
version |
string |
服务器版本 |
platform |
string |
服务器平台 |
created |
string |
创建时间戳 |
iconId |
string |
服务器图标 ID |
defaultServerGroup |
int |
默认服务器组 ID |
defaultChannelGroup |
int |
默认频道组 ID |
dbClientJSON(ListDBClientsJSON)
| 字段 |
类型 |
描述 |
dbid |
string |
数据库 ID |
uid |
string |
唯一标识 |
nickname |
string |
昵称 |
created |
string |
首次连接时间戳 |
lastConnected |
string |
最近连接时间戳 |
totalConnections |
int |
总连接次数 |
description |
string |
描述 |
banEntryJSON(ListBansJSON)
| 字段 |
类型 |
描述 |
banId |
string |
封禁 ID |
ip |
string |
IP |
name |
string |
名称 |
uid |
string |
唯一标识 |
created |
string |
封禁时间戳 |
invokerName |
string |
操作者昵称 |
invokerUid |
string |
操作者 UID |
reason |
string |
封禁原因 |
enforcement |
bool |
是否立即执行 |
fileEntryJSON(ListFilesJSON)
| 字段 |
类型 |
描述 |
name |
string |
文件/目录名 |
size |
string |
字节数(目录为 "0") |
dateTime |
string |
修改时间戳 |
isFile |
bool |
true=文件, false=目录 |
tokenEntryJSON(ListTokensJSON)
| 字段 |
类型 |
描述 |
token |
string |
权限密钥字符串 |
tokenType |
int |
0=服务器组, 1=频道组 |
tokenId1 |
string |
组 ID |
tokenId2 |
string |
频道 ID(仅 tokenType=1) |
created |
string |
创建时间戳 |
description |
string |
描述 |
complaintEntryJSON(ListComplaintsJSON)
| 字段 |
类型 |
描述 |
fromDbid |
string |
投诉者 DBID |
toDbid |
string |
被投诉者 DBID |
message |
string |
投诉内容 |
timestamp |
string |
投诉时间戳 |
fileTransferInitJSON(FileTransferInitUploadJSON / FileTransferInitDownloadJSON)
| 字段 |
类型 |
描述 |
port |
int |
TCP 传输端口 |
key |
string |
传输密钥 |
size |
int |
文件字节数(仅下载) |
clientFileTransferID |
int |
客户端传输 ID |
serverFileTransferID |
int |
服务器传输 ID |
seekPosition |
int |
断点续传位置(仅上传) |
initialSyncJSON(GetInitialSyncJSON)
| 字段 |
类型 |
描述 |
channels |
[]channelDetailedJSON |
详细频道列表 |
clients |
[]clientJSON |
在线客户端列表 |
selfId |
int |
自身客户端 ID |
selfChannelId |
string |
自身所在频道 ID |
server |
serverInfoJSON |
服务器信息 |
二十、方法来源标记
标记每个方法的实现文件,便于定位代码。
| 方法 |
来源文件 |
说明 |
NewClient |
bridge.go |
|
GenerateIdentity |
kotlin_api.go |
|
Connect |
bridge.go |
每次生成新 Identity |
ConnectWithIdentity |
kotlin_api.go |
复用已有 Identity |
Disconnect |
bridge.go |
|
IsConnected |
bridge.go |
|
GetClientID |
bridge.go |
|
GetChannelID |
bridge.go |
|
GetChannelsJSON |
bridge.go |
|
GetChannelsDetailedJSON |
bridge.go |
|
ListChannelsSortedJSON |
kotlin_api.go |
去重+排序 |
GetClientsJSON |
bridge.go |
|
GetServerInfoJSON |
bridge.go |
|
GetChannelDetailInfoJSON |
bridge.go |
|
GetClientDetailInfoJSON |
bridge.go |
|
ListDBClientsJSON |
bridge.go |
|
FindChannelsJSON |
kotlin_api.go |
|
FindClientByNameJSON |
kotlin_api.go |
|
FindClientByDBIDJSON |
kotlin_api.go |
|
SendTextMessage |
bridge.go |
|
SendChannelMessage |
bridge.go |
快捷方式 |
Poke |
bridge.go |
|
MoveToChannel |
bridge.go |
移动自己 |
MoveClient |
kotlin_api.go |
移动指定客户端 |
MoveChannel |
kotlin_api.go |
移动频道位置 |
CreateChannelJSON |
bridge.go |
|
EditChannelJSON |
bridge.go |
|
DeleteChannel |
bridge.go |
|
UpdateSelfJSON |
bridge.go |
|
KickClient |
bridge.go |
|
SendVoice |
bridge.go |
|
ListBansJSON |
bridge.go |
|
AddBan |
bridge.go |
|
DeleteBan |
bridge.go |
|
DeleteAllBans |
kotlin_api.go |
|
ListTokensJSON |
bridge.go |
|
UseToken |
bridge.go |
|
ListComplaintsJSON |
bridge.go |
|
AddComplaint |
bridge.go |
|
DeleteComplaint |
kotlin_api.go |
|
ListFilesJSON |
bridge.go |
|
FileTransferInitUploadJSON |
kotlin_api.go |
|
FileTransferInitDownloadJSON |
kotlin_api.go |
|
DeleteFile |
kotlin_api.go |
|
GetInitialSyncJSON |
kotlin_api.go |
|