Files
cellbot/internal/protocol/message.go

134 lines
3.7 KiB
Go
Raw Normal View History

package protocol
import "fmt"
// MessageSegment 消息段(基于 OneBot12 设计)
// 通用消息段结构,适配器负责转换为具体协议格式
type MessageSegment struct {
Type string `json:"type"` // 消息段类型
Data map[string]interface{} `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]interface{}{
"text": text,
},
}
}
// NewMentionSegment 创建@提及消息段OneBot12 标准)
func NewMentionSegment(userID interface{}) MessageSegment {
return MessageSegment{
Type: SegmentTypeMention,
Data: map[string]interface{}{
"user_id": userID,
},
}
}
// NewImageSegment 创建图片消息段
func NewImageSegment(fileID string) MessageSegment {
return MessageSegment{
Type: SegmentTypeImage,
Data: map[string]interface{}{
"file_id": fileID,
},
}
}
// NewImageSegmentFromBase64 从base64字符串创建图片消息段
func NewImageSegmentFromBase64(base64Data string) MessageSegment {
return MessageSegment{
Type: SegmentTypeImage,
Data: map[string]interface{}{
"file": fmt.Sprintf("base64://%s", base64Data),
},
}
}
// NewReplySegment 创建回复消息段
func NewReplySegment(messageID interface{}) MessageSegment {
return MessageSegment{
Type: SegmentTypeReply,
Data: map[string]interface{}{
"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 interface{}) 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
}