Files
cellbot/internal/protocol/message.go
lafay f3220a2381 refactor: modernize codebase for Go 1.26 and fix adapter issues
- Upgrade Go version from 1.24 to 1.26.1 with updated dependencies
- Replace interface{} with any type throughout codebase
- Add message deduplication in OneBot11 adapter to prevent duplicate event processing
- URL-encode access token in WebSocket connections to handle special characters
- Remove duplicate bot startup hooks in DI providers (now handled by botManager.StartAll)
- Use slices.Clone and errgroup.Go patterns for cleaner concurrent code
- Apply omitzero JSON tags for optional fields (Go 1.24+ feature)
2026-03-18 01:22:49 +08:00

134 lines
3.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package protocol
import "fmt"
// MessageSegment 消息段(基于 OneBot12 设计)
// 通用消息段结构,适配器负责转换为具体协议格式
type MessageSegment struct {
Type string `json:"type"` // 消息段类型
Data map[string]any `json:"data"` // 消息段数据
}
// MessageChain 消息链(基于 OneBot12 设计)
// 消息由多个消息段组成
type MessageChain []MessageSegment
// 消息段类型常量(基于 OneBot12
const (
SegmentTypeText = "text" // 文本
SegmentTypeMention = "mention" // @提及OneBot12
SegmentTypeImage = "image" // 图片
SegmentTypeVoice = "voice" // 语音
SegmentTypeVideo = "video" // 视频
SegmentTypeFile = "file" // 文件
SegmentTypeLocation = "location" // 位置
SegmentTypeReply = "reply" // 回复
SegmentTypeForward = "forward" // 转发
SegmentTypeFace = "face" // 表情QQ
SegmentTypeAt = "at" // @提及OneBot11 兼容)
SegmentTypeRecord = "record" // 语音OneBot11 兼容)
)
// NewTextSegment 创建文本消息段
func NewTextSegment(text string) MessageSegment {
return MessageSegment{
Type: SegmentTypeText,
Data: map[string]any{
"text": text,
},
}
}
// NewMentionSegment 创建@提及消息段OneBot12 标准)
func NewMentionSegment(userID any) MessageSegment {
return MessageSegment{
Type: SegmentTypeMention,
Data: map[string]any{
"user_id": userID,
},
}
}
// NewImageSegment 创建图片消息段
func NewImageSegment(fileID string) MessageSegment {
return MessageSegment{
Type: SegmentTypeImage,
Data: map[string]any{
"file_id": fileID,
},
}
}
// NewImageSegmentFromBase64 从base64字符串创建图片消息段
func NewImageSegmentFromBase64(base64Data string) MessageSegment {
return MessageSegment{
Type: SegmentTypeImage,
Data: map[string]any{
"file": fmt.Sprintf("base64://%s", base64Data),
},
}
}
// NewReplySegment 创建回复消息段
func NewReplySegment(messageID any) MessageSegment {
return MessageSegment{
Type: SegmentTypeReply,
Data: map[string]any{
"message_id": messageID,
},
}
}
// NewMessageChain 创建消息链
func NewMessageChain(segments ...MessageSegment) MessageChain {
return MessageChain(segments)
}
// Append 追加消息段到消息链
func (mc MessageChain) Append(segments ...MessageSegment) MessageChain {
return append(mc, segments...)
}
// AppendText 追加文本到消息链
func (mc MessageChain) AppendText(text string) MessageChain {
return mc.Append(NewTextSegment(text))
}
// AppendMention 追加@提及到消息链
func (mc MessageChain) AppendMention(userID any) MessageChain {
return mc.Append(NewMentionSegment(userID))
}
// AppendImage 追加图片到消息链
func (mc MessageChain) AppendImage(fileID string) MessageChain {
return mc.Append(NewImageSegment(fileID))
}
// AppendImageFromBase64 从base64追加图片到消息链
func (mc MessageChain) AppendImageFromBase64(base64Data string) MessageChain {
return mc.Append(NewImageSegmentFromBase64(base64Data))
}
// ToString 将消息链转换为字符串(用于调试)
func (mc MessageChain) ToString() string {
result := ""
for _, seg := range mc {
switch seg.Type {
case SegmentTypeText:
if text, ok := seg.Data["text"].(string); ok {
result += text
}
case SegmentTypeMention, SegmentTypeAt:
if userID, ok := seg.Data["user_id"]; ok {
result += fmt.Sprintf("@%v", userID)
} else if qq, ok := seg.Data["qq"]; ok {
// OneBot11 兼容
result += fmt.Sprintf("@%v", qq)
}
default:
result += fmt.Sprintf("[%s]", seg.Type)
}
}
return result
}