- 只翻注释/文档字符串:剥掉注释后代码行逐字节不变(机械校验只剩允许的行尾注释形态) - 术语对齐既有译法(owner→主人、persona→角色、engage→参与度判定、quiet hours→安静时段、backoff→退避) - 复核:go build 绿 + channelbridge 包测试绿;gofmt 干净
63 lines
1.8 KiB
Go
63 lines
1.8 KiB
Go
package channelbridge
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"git.yeij.top/AskaEth/Cyrene_v2/internal/channel/adapter"
|
|
)
|
|
|
|
// 本文件承载桥接器各文件共用的小型包级辅助函数:
|
|
// 平台/账号命名、发送者标签,以及通用切片读取。
|
|
|
|
// basePlatform 返回(可能多账号的)适配器名称的裸平台名,
|
|
// 如 "telegram:conf0" → "telegram",使凭据闸门与
|
|
// 回复路由回退把同一平台的每个账号一视同仁。
|
|
func basePlatform(name string) string {
|
|
if base, _, ok := strings.Cut(name, ":"); ok {
|
|
return base
|
|
}
|
|
return name
|
|
}
|
|
|
|
// adapterName 返回接收消息的账号适配器注册名(如 "kook:3bef..."),
|
|
// a 为 nil 时返回 ""。单账号
|
|
// 便捷路径(process)以及没有已注册适配器的平台都可能传入 nil
|
|
// 适配器,因此持久化钩子容忍它,存空 adapter_id,而不是
|
|
// 解引用 nil 适配器。
|
|
func adapterName(a adapter.PlatformAdapter) string {
|
|
if a == nil {
|
|
return ""
|
|
}
|
|
return a.Name()
|
|
}
|
|
|
|
// senderDisplayName 返回用于标注第三方消息的
|
|
// 人类可读发送者名。它优先取已解析 actor 的显示名(由
|
|
// 渠道层依据渠道元数据 + 原始 SenderName 推导),回退到
|
|
// 消息自身的 SenderName,因此空的 SenderName 始终表示
|
|
// 「主人/未标注」,而不是解析不出结果的昵称。
|
|
func senderDisplayName(msg adapter.UnifiedMessage, actor adapter.Actor) string {
|
|
if actor.DisplayName != "" {
|
|
return actor.DisplayName
|
|
}
|
|
return msg.SenderName
|
|
}
|
|
|
|
// sliceContains 报告 s 是否存在于 list 中。
|
|
func sliceContains(list []string, s string) bool {
|
|
for _, v := range list {
|
|
if v == s {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// firstNonEmptyStr 在 a 非空时返回 a,否则返回 b。
|
|
func firstNonEmptyStr(a, b string) string {
|
|
if a != "" {
|
|
return a
|
|
}
|
|
return b
|
|
}
|