1
0
mirror of https://github.com/Mrs4s/go-cqhttp.git synced 2025-05-06 12:03:50 +08:00

coolq: move MessageSource to MiraiGo/message

This commit is contained in:
wdvxdr 2022-02-21 17:49:02 +08:00
parent b833193926
commit 19230b1511
No known key found for this signature in database
GPG Key ID: 703F8C071DE7A1B6
8 changed files with 82 additions and 106 deletions

View File

@ -712,7 +712,7 @@ func (bot *CQBot) CQSendGroupMessage(groupID int64, m gjson.Result, autoEscape b
var elem []message.IMessageElement var elem []message.IMessageElement
if m.Type == gjson.JSON { if m.Type == gjson.JSON {
elem = bot.ConvertObjectMessage(m, MessageSourceGroup) elem = bot.ConvertObjectMessage(m, message.SourceGroup)
} else { } else {
str := m.String() str := m.String()
if str == "" { if str == "" {
@ -722,7 +722,7 @@ func (bot *CQBot) CQSendGroupMessage(groupID int64, m gjson.Result, autoEscape b
if autoEscape { if autoEscape {
elem = []message.IMessageElement{message.NewText(str)} elem = []message.IMessageElement{message.NewText(str)}
} else { } else {
elem = bot.ConvertStringMessage(str, MessageSourceGroup) elem = bot.ConvertStringMessage(str, message.SourceGroup)
} }
} }
fixAt(elem) fixAt(elem)
@ -766,7 +766,7 @@ func (bot *CQBot) CQSendGuildChannelMessage(guildID, channelID uint64, m gjson.R
var elem []message.IMessageElement var elem []message.IMessageElement
if m.Type == gjson.JSON { if m.Type == gjson.JSON {
elem = bot.ConvertObjectMessage(m, MessageSourceGuildChannel) elem = bot.ConvertObjectMessage(m, message.SourceGuildChannel)
} else { } else {
str := m.String() str := m.String()
if str == "" { if str == "" {
@ -776,7 +776,7 @@ func (bot *CQBot) CQSendGuildChannelMessage(guildID, channelID uint64, m gjson.R
if autoEscape { if autoEscape {
elem = []message.IMessageElement{message.NewText(str)} elem = []message.IMessageElement{message.NewText(str)}
} else { } else {
elem = bot.ConvertStringMessage(str, MessageSourceGuildChannel) elem = bot.ConvertStringMessage(str, message.SourceGuildChannel)
} }
} }
fixAt(elem) fixAt(elem)
@ -833,7 +833,7 @@ func (bot *CQBot) uploadForwardElement(m gjson.Result, groupID int64) *message.F
} }
return int32(msgTime) return int32(msgTime)
}(), }(),
Message: resolveElement(bot.ConvertContentMessage(m.Content, MessageSourceGroup)), Message: resolveElement(bot.ConvertContentMessage(m.Content, message.SourceGroup)),
} }
} }
log.Warnf("警告: 引用消息 %v 错误或数据库未开启.", e.Get("data.id").Str) log.Warnf("警告: 引用消息 %v 错误或数据库未开启.", e.Get("data.id").Str)
@ -865,7 +865,7 @@ func (bot *CQBot) uploadForwardElement(m gjson.Result, groupID int64) *message.F
} }
} }
} }
content := bot.ConvertObjectMessage(c, MessageSourceGroup) content := bot.ConvertObjectMessage(c, message.SourceGroup)
if uin != 0 && name != "" && len(content) > 0 { if uin != 0 && name != "" && len(content) > 0 {
return &message.ForwardNode{ return &message.ForwardNode{
SenderId: uin, SenderId: uin,
@ -932,7 +932,7 @@ func (bot *CQBot) CQSendGroupForwardMessage(groupID int64, m gjson.Result) globa
func (bot *CQBot) CQSendPrivateMessage(userID int64, groupID int64, m gjson.Result, autoEscape bool) global.MSG { func (bot *CQBot) CQSendPrivateMessage(userID int64, groupID int64, m gjson.Result, autoEscape bool) global.MSG {
var elem []message.IMessageElement var elem []message.IMessageElement
if m.Type == gjson.JSON { if m.Type == gjson.JSON {
elem = bot.ConvertObjectMessage(m, MessageSourcePrivate) elem = bot.ConvertObjectMessage(m, message.SourcePrivate)
} else { } else {
str := m.String() str := m.String()
if str == "" { if str == "" {
@ -941,7 +941,7 @@ func (bot *CQBot) CQSendPrivateMessage(userID int64, groupID int64, m gjson.Resu
if autoEscape { if autoEscape {
elem = []message.IMessageElement{message.NewText(str)} elem = []message.IMessageElement{message.NewText(str)}
} else { } else {
elem = bot.ConvertStringMessage(str, MessageSourcePrivate) elem = bot.ConvertStringMessage(str, message.SourcePrivate)
} }
} }
mid := bot.SendPrivateMessage(userID, groupID, &message.SendingMessage{Elements: elem}) mid := bot.SendPrivateMessage(userID, groupID, &message.SendingMessage{Elements: elem})
@ -1525,7 +1525,7 @@ func (bot *CQBot) CQGetForwardMessage(resID string) global.MSG {
r := make([]global.MSG, len(nodes)) r := make([]global.MSG, len(nodes))
for i, n := range nodes { for i, n := range nodes {
bot.checkMedia(n.Message, 0) bot.checkMedia(n.Message, 0)
content := ToFormattedMessage(n.Message, MessageSource{SourceType: MessageSourceGroup}, false) content := ToFormattedMessage(n.Message, message.Source{SourceType: message.SourceGroup}, false)
if len(n.Message) == 1 { if len(n.Message) == 1 {
if forward, ok := n.Message[0].(*message.ForwardMessage); ok { if forward, ok := n.Message[0].(*message.ForwardMessage); ok {
content = transformNodes(forward.Nodes) content = transformNodes(forward.Nodes)
@ -1573,9 +1573,9 @@ func (bot *CQBot) CQGetMessage(messageID int32) global.MSG {
switch o := msg.(type) { switch o := msg.(type) {
case *db.StoredGroupMessage: case *db.StoredGroupMessage:
m["group_id"] = o.GroupCode m["group_id"] = o.GroupCode
m["message"] = ToFormattedMessage(bot.ConvertContentMessage(o.Content, MessageSourceGroup), MessageSource{SourceType: MessageSourceGroup, PrimaryID: uint64(o.GroupCode)}, false) m["message"] = ToFormattedMessage(bot.ConvertContentMessage(o.Content, message.SourceGroup), message.Source{SourceType: message.SourceGroup, PrimaryID: o.GroupCode}, false)
case *db.StoredPrivateMessage: case *db.StoredPrivateMessage:
m["message"] = ToFormattedMessage(bot.ConvertContentMessage(o.Content, MessageSourcePrivate), MessageSource{SourceType: MessageSourcePrivate}, false) m["message"] = ToFormattedMessage(bot.ConvertContentMessage(o.Content, message.SourcePrivate), message.Source{SourceType: message.SourcePrivate}, false)
} }
return OK(m) return OK(m)
} }
@ -1591,21 +1591,21 @@ func (bot *CQBot) CQGetGuildMessage(messageID string, noCache bool) global.MSG {
m := global.MSG{ m := global.MSG{
"message_id": messageID, "message_id": messageID,
"message_source": func() string { "message_source": func() string {
if source.SourceType == MessageSourceGuildDirect { if source.SourceType == message.SourceGuildDirect {
return "direct" return "direct"
} }
return "channel" return "channel"
}(), }(),
"message_seq": seq, "message_seq": seq,
"guild_id": fU64(source.PrimaryID), "guild_id": fU64(uint64(source.PrimaryID)),
"reactions": []int{}, "reactions": []int{},
} }
// nolint: exhaustive // nolint: exhaustive
switch source.SourceType { switch source.SourceType {
case MessageSourceGuildChannel: case message.SourceGuildChannel:
m["channel_id"] = fU64(source.SubID) m["channel_id"] = fU64(uint64(source.SecondaryID))
if noCache { if noCache {
pull, err := bot.Client.GuildService.PullGuildChannelMessage(source.PrimaryID, source.SubID, seq, seq) pull, err := bot.Client.GuildService.PullGuildChannelMessage(uint64(source.PrimaryID), uint64(source.SecondaryID), seq, seq)
if err != nil { if err != nil {
log.Warnf("获取消息时出现错误: %v", err) log.Warnf("获取消息时出现错误: %v", err)
return Failed(100, "API_ERROR", err.Error()) return Failed(100, "API_ERROR", err.Error())
@ -1635,11 +1635,11 @@ func (bot *CQBot) CQGetGuildMessage(messageID string, noCache bool) global.MSG {
"tiny_id": fU64(channelMsgByDB.Attribute.SenderTinyID), "tiny_id": fU64(channelMsgByDB.Attribute.SenderTinyID),
"nickname": channelMsgByDB.Attribute.SenderName, "nickname": channelMsgByDB.Attribute.SenderName,
} }
m["message"] = ToFormattedMessage(bot.ConvertContentMessage(channelMsgByDB.Content, MessageSourceGuildChannel), *source) m["message"] = ToFormattedMessage(bot.ConvertContentMessage(channelMsgByDB.Content, message.SourceGuildChannel), *source)
} }
case MessageSourceGuildDirect: case message.SourceGuildDirect:
// todo(mrs4s): 支持 direct 消息 // todo(mrs4s): 支持 direct 消息
m["tiny_id"] = fU64(source.SubID) m["tiny_id"] = fU64(uint64(source.SecondaryID))
} }
return OK(m) return OK(m)
} }
@ -1737,7 +1737,7 @@ func (bot *CQBot) CQCanSendRecord() global.MSG {
// @route(ocr_image,".ocr_image") // @route(ocr_image,".ocr_image")
// @rename(image_id->image) // @rename(image_id->image)
func (bot *CQBot) CQOcrImage(imageID string) global.MSG { func (bot *CQBot) CQOcrImage(imageID string) global.MSG {
img, err := bot.makeImageOrVideoElem(map[string]string{"file": imageID}, false, MessageSourceGroup) img, err := bot.makeImageOrVideoElem(map[string]string{"file": imageID}, false, message.SourceGroup)
if err != nil { if err != nil {
log.Warnf("load image error: %v", err) log.Warnf("load image error: %v", err)
return Failed(100, "LOAD_FILE_ERROR", err.Error()) return Failed(100, "LOAD_FILE_ERROR", err.Error())

View File

@ -5,7 +5,6 @@ import (
"encoding/hex" "encoding/hex"
"encoding/json" "encoding/json"
"fmt" "fmt"
"io"
"os" "os"
"runtime/debug" "runtime/debug"
"sync" "sync"
@ -152,13 +151,13 @@ func (bot *CQBot) UploadLocalImageAsGroup(groupCode int64, img *LocalImageElemen
} }
// UploadLocalVideo 上传本地短视频至群聊 // UploadLocalVideo 上传本地短视频至群聊
func (bot *CQBot) UploadLocalVideo(target int64, v *LocalVideoElement) (*message.ShortVideoElement, error) { func (bot *CQBot) UploadLocalVideo(target message.Source, v *LocalVideoElement) (*message.ShortVideoElement, error) {
video, err := os.Open(v.File) video, err := os.Open(v.File)
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer func() { _ = video.Close() }() defer func() { _ = video.Close() }()
return bot.Client.UploadGroupShortVideo(target, video, v.thumb, 4) return bot.Client.UploadShortVideo(target, video, v.thumb, 4)
} }
// UploadLocalImageAsPrivate 上传本地图片至私聊 // UploadLocalImageAsPrivate 上传本地图片至私聊
@ -197,18 +196,6 @@ func (bot *CQBot) UploadLocalImageAsGuildChannel(guildID, channelID uint64, img
return bot.Client.GuildService.UploadGuildImage(guildID, channelID, img.Stream) return bot.Client.GuildService.UploadGuildImage(guildID, channelID, img.Stream)
} }
func (bot *CQBot) uploadGuildVideo(i *LocalVideoElement, guildID, channelID uint64) (*message.ShortVideoElement, error) {
video, err := os.Open(i.File)
if err != nil {
return nil, err
}
defer func() { _ = video.Close() }()
_, _ = video.Seek(0, io.SeekStart)
_, _ = i.thumb.Seek(0, io.SeekStart)
n, err := bot.Client.UploadGuildShortVideo(guildID, channelID, video, i.thumb)
return n, err
}
// SendGroupMessage 发送群消息 // SendGroupMessage 发送群消息
func (bot *CQBot) SendGroupMessage(groupID int64, m *message.SendingMessage) int32 { func (bot *CQBot) SendGroupMessage(groupID int64, m *message.SendingMessage) int32 {
newElem := make([]message.IMessageElement, 0, len(m.Elements)) newElem := make([]message.IMessageElement, 0, len(m.Elements))
@ -368,7 +355,11 @@ func (bot *CQBot) SendGuildChannelMessage(guildID, channelID uint64, m *message.
e = n e = n
case *LocalVideoElement: case *LocalVideoElement:
n, err := bot.uploadGuildVideo(i, guildID, channelID) n, err := bot.UploadLocalVideo(message.Source{
SourceType: message.SourceGuildChannel,
PrimaryID: int64(guildID),
SecondaryID: int64(channelID),
}, i)
if err != nil { if err != nil {
log.Warnf("警告: 频道 %d 消息%s上传失败: %v", channelID, e.Type().String(), err) log.Warnf("警告: 频道 %d 消息%s上传失败: %v", channelID, e.Type().String(), err)
continue continue
@ -518,7 +509,7 @@ func (bot *CQBot) InsertTempMessage(target int64, m *message.TempMessage) int32
// InsertGuildChannelMessage 频道消息入数据库 // InsertGuildChannelMessage 频道消息入数据库
func (bot *CQBot) InsertGuildChannelMessage(m *message.GuildChannelMessage) string { func (bot *CQBot) InsertGuildChannelMessage(m *message.GuildChannelMessage) string {
id := encodeGuildMessageID(m.GuildId, m.ChannelId, m.Id, MessageSourceGuildChannel) id := encodeGuildMessageID(m.GuildId, m.ChannelId, m.Id, message.SourceGuildChannel)
msg := &db.StoredGuildChannelMessage{ msg := &db.StoredGuildChannelMessage{
ID: id, ID: id,
Attribute: &db.StoredGuildMessageAttribute{ Attribute: &db.StoredGuildMessageAttribute{
@ -597,7 +588,11 @@ func (bot *CQBot) uploadMedia(raw message.IMessageElement, target int64, group b
} }
return bot.Client.UploadPrivatePtt(target, bytes.NewReader(m.Data)) return bot.Client.UploadPrivatePtt(target, bytes.NewReader(m.Data))
case *LocalVideoElement: case *LocalVideoElement:
return bot.UploadLocalVideo(target, m) source := message.Source{
SourceType: message.SourceGroup,
PrimaryID: target,
}
return bot.UploadLocalVideo(source, m)
} }
return nil, errors.New("unsupported message element type") return nil, errors.New("unsupported message element type")
} }
@ -613,7 +608,7 @@ func encodeMessageID(target int64, seq int32) string {
// encodeGuildMessageID 将频道信息编码为字符串 // encodeGuildMessageID 将频道信息编码为字符串
// 当信息来源为 Channel 时 primaryID 为 guildID , subID 为 channelID // 当信息来源为 Channel 时 primaryID 为 guildID , subID 为 channelID
// 当信息来源为 Direct 时 primaryID 为 guildID , subID 为 tinyID // 当信息来源为 Direct 时 primaryID 为 guildID , subID 为 tinyID
func encodeGuildMessageID(primaryID, subID, seq uint64, source MessageSourceType) string { func encodeGuildMessageID(primaryID, subID, seq uint64, source message.SourceType) string {
return base64.StdEncoding.EncodeToString(binary.NewWriterF(func(w *binary.Writer) { return base64.StdEncoding.EncodeToString(binary.NewWriterF(func(w *binary.Writer) {
w.WriteByte(byte(source)) w.WriteByte(byte(source))
w.WriteUInt64(primaryID) w.WriteUInt64(primaryID)
@ -622,16 +617,16 @@ func encodeGuildMessageID(primaryID, subID, seq uint64, source MessageSourceType
})) }))
} }
func decodeGuildMessageID(id string) (source *MessageSource, seq uint64) { func decodeGuildMessageID(id string) (source *message.Source, seq uint64) {
b, _ := base64.StdEncoding.DecodeString(id) b, _ := base64.StdEncoding.DecodeString(id)
if len(b) < 25 { if len(b) < 25 {
return return
} }
r := binary.NewReader(b) r := binary.NewReader(b)
source = &MessageSource{ source = &message.Source{
SourceType: MessageSourceType(r.ReadByte()), SourceType: message.SourceType(r.ReadByte()),
PrimaryID: uint64(r.ReadInt64()), PrimaryID: r.ReadInt64(),
SubID: uint64(r.ReadInt64()), SecondaryID: r.ReadInt64(),
} }
seq = uint64(r.ReadInt64()) seq = uint64(r.ReadInt64())
return return

View File

@ -60,9 +60,9 @@ func convertGuildMemberInfo(m []*client.GuildMemberInfo) (r []global.MSG) {
} }
func (bot *CQBot) formatGroupMessage(m *message.GroupMessage) global.MSG { func (bot *CQBot) formatGroupMessage(m *message.GroupMessage) global.MSG {
source := MessageSource{ source := message.Source{
SourceType: MessageSourceGroup, SourceType: message.SourceGroup,
PrimaryID: uint64(m.GroupCode), PrimaryID: m.GroupCode,
} }
cqm := ToStringMessage(m.Elements, source, true) cqm := ToStringMessage(m.Elements, source, true)
postType := "message" postType := "message"

View File

@ -63,26 +63,6 @@ type LocalVideoElement struct {
thumb io.ReadSeeker thumb io.ReadSeeker
} }
// MessageSource 消息来源
// 如果为私聊或者群聊, PrimaryID 将代表群号/QQ号
// 如果为频道, PrimaryID 为 GuildID, SubID 为 ChannelID
type MessageSource struct {
SourceType MessageSourceType
PrimaryID uint64
SubID uint64
}
// MessageSourceType 消息来源类型
type MessageSourceType byte
// MessageSourceType 常量
const (
MessageSourcePrivate MessageSourceType = 1 << iota
MessageSourceGroup
MessageSourceGuildChannel
MessageSourceGuildDirect
)
const ( const (
maxImageSize = 1024 * 1024 * 30 // 30MB maxImageSize = 1024 * 1024 * 30 // 30MB
maxVideoSize = 1024 * 1024 * 100 // 100MB maxVideoSize = 1024 * 1024 * 100 // 100MB
@ -104,10 +84,10 @@ func (e *PokeElement) Type() message.ElementType {
return message.At return message.At
} }
func replyID(r *message.ReplyElement, source MessageSource) int32 { func replyID(r *message.ReplyElement, source message.Source) int32 {
id := int64(source.PrimaryID) id := int64(source.PrimaryID)
seq := r.ReplySeq seq := r.ReplySeq
if source.SourceType == MessageSourcePrivate { if source.SourceType == message.SourcePrivate {
// 私聊似乎腾讯服务器有bug? // 私聊似乎腾讯服务器有bug?
seq = int32(uint16(seq)) seq = int32(uint16(seq))
id = r.Sender id = r.Sender
@ -119,14 +99,14 @@ func replyID(r *message.ReplyElement, source MessageSource) int32 {
} }
// ToArrayMessage 将消息元素数组转为MSG数组以用于消息上报 // ToArrayMessage 将消息元素数组转为MSG数组以用于消息上报
func ToArrayMessage(e []message.IMessageElement, source MessageSource) (r []global.MSG) { func ToArrayMessage(e []message.IMessageElement, source message.Source) (r []global.MSG) {
r = make([]global.MSG, 0, len(e)) r = make([]global.MSG, 0, len(e))
m := &message.SendingMessage{Elements: e} m := &message.SendingMessage{Elements: e}
reply := m.FirstOrNil(func(e message.IMessageElement) bool { reply := m.FirstOrNil(func(e message.IMessageElement) bool {
_, ok := e.(*message.ReplyElement) _, ok := e.(*message.ReplyElement)
return ok return ok
}) })
if reply != nil && source.SourceType&(MessageSourceGroup|MessageSourcePrivate) != 0 { if reply != nil && source.SourceType&(message.SourceGroup|message.SourcePrivate) != 0 {
replyElem := reply.(*message.ReplyElement) replyElem := reply.(*message.ReplyElement)
id := replyID(replyElem, source) id := replyID(replyElem, source)
if base.ExtraReplyData { if base.ExtraReplyData {
@ -270,7 +250,7 @@ func ToArrayMessage(e []message.IMessageElement, source MessageSource) (r []glob
} }
// ToStringMessage 将消息元素数组转为字符串以用于消息上报 // ToStringMessage 将消息元素数组转为字符串以用于消息上报
func ToStringMessage(e []message.IMessageElement, source MessageSource, isRaw ...bool) (r string) { func ToStringMessage(e []message.IMessageElement, source message.Source, isRaw ...bool) (r string) {
sb := global.NewBuffer() sb := global.NewBuffer()
sb.Reset() sb.Reset()
write := func(format string, a ...interface{}) { write := func(format string, a ...interface{}) {
@ -286,7 +266,7 @@ func ToStringMessage(e []message.IMessageElement, source MessageSource, isRaw ..
_, ok := e.(*message.ReplyElement) _, ok := e.(*message.ReplyElement)
return ok return ok
}) })
if reply != nil && source.SourceType&(MessageSourceGroup|MessageSourcePrivate) != 0 { if reply != nil && source.SourceType&(message.SourceGroup|message.SourcePrivate) != 0 {
replyElem := reply.(*message.ReplyElement) replyElem := reply.(*message.ReplyElement)
id := replyID(replyElem, source) id := replyID(replyElem, source)
if base.ExtraReplyData { if base.ExtraReplyData {
@ -511,7 +491,7 @@ func ToMessageContent(e []message.IMessageElement) (r []global.MSG) {
} }
// ConvertStringMessage 将消息字符串转为消息元素数组 // ConvertStringMessage 将消息字符串转为消息元素数组
func (bot *CQBot) ConvertStringMessage(raw string, sourceType MessageSourceType) (r []message.IMessageElement) { func (bot *CQBot) ConvertStringMessage(raw string, sourceType message.SourceType) (r []message.IMessageElement) {
var t, key string var t, key string
d := map[string]string{} d := map[string]string{}
@ -684,11 +664,11 @@ func (bot *CQBot) ConvertStringMessage(raw string, sourceType MessageSourceType)
} }
// ConvertObjectMessage 将消息JSON对象转为消息元素数组 // ConvertObjectMessage 将消息JSON对象转为消息元素数组
func (bot *CQBot) ConvertObjectMessage(m gjson.Result, sourceType MessageSourceType) (r []message.IMessageElement) { func (bot *CQBot) ConvertObjectMessage(m gjson.Result, sourceType message.SourceType) (r []message.IMessageElement) {
d := make(map[string]string) d := make(map[string]string)
convertElem := func(e gjson.Result) { convertElem := func(e gjson.Result) {
t := e.Get("type").Str t := e.Get("type").Str
if t == "reply" && sourceType&(MessageSourceGroup|MessageSourcePrivate) != 0 { if t == "reply" && sourceType&(message.SourceGroup|message.SourcePrivate) != 0 {
if len(r) > 0 { if len(r) > 0 {
if _, ok := r[0].(*message.ReplyElement); ok { if _, ok := r[0].(*message.ReplyElement); ok {
log.Warnf("警告: 一条信息只能包含一个 Reply 元素.") log.Warnf("警告: 一条信息只能包含一个 Reply 元素.")
@ -804,7 +784,7 @@ func (bot *CQBot) ConvertObjectMessage(m gjson.Result, sourceType MessageSourceT
} }
// ConvertContentMessage 将数据库用的 content 转换为消息元素数组 // ConvertContentMessage 将数据库用的 content 转换为消息元素数组
func (bot *CQBot) ConvertContentMessage(content []global.MSG, sourceType MessageSourceType) (r []message.IMessageElement) { func (bot *CQBot) ConvertContentMessage(content []global.MSG, sourceType message.SourceType) (r []message.IMessageElement) {
for _, c := range content { for _, c := range content {
data := c["data"].(global.MSG) data := c["data"].(global.MSG)
switch c["type"] { switch c["type"] {
@ -883,7 +863,7 @@ func (bot *CQBot) ConvertContentMessage(content []global.MSG, sourceType Message
// 返回 interface{} 存在三种类型 // 返回 interface{} 存在三种类型
// //
// message.IMessageElement []message.IMessageElement nil // message.IMessageElement []message.IMessageElement nil
func (bot *CQBot) ToElement(t string, d map[string]string, sourceType MessageSourceType) (m interface{}, err error) { func (bot *CQBot) ToElement(t string, d map[string]string, sourceType message.SourceType) (m interface{}, err error) {
switch t { switch t {
case "text": case "text":
if base.SplitURL { if base.SplitURL {
@ -1117,7 +1097,7 @@ func (bot *CQBot) ToElement(t string, d map[string]string, sourceType MessageSou
if err != nil { if err != nil {
return nil, errors.New("send cardimage faild") return nil, errors.New("send cardimage faild")
} }
return bot.makeShowPic(img, source, brief, icon, minWidth, minHeight, maxWidth, maxHeight, sourceType == MessageSourceGroup) return bot.makeShowPic(img, source, brief, icon, minWidth, minHeight, maxWidth, maxHeight, sourceType == message.SourceGroup)
case "video": case "video":
file, err := bot.makeImageOrVideoElem(d, true, sourceType) file, err := bot.makeImageOrVideoElem(d, true, sourceType)
if err != nil { if err != nil {
@ -1170,7 +1150,7 @@ func (bot *CQBot) ToElement(t string, d map[string]string, sourceType MessageSou
} }
// makeImageOrVideoElem 图片 elem 生成器,单独拎出来,用于公用 // makeImageOrVideoElem 图片 elem 生成器,单独拎出来,用于公用
func (bot *CQBot) makeImageOrVideoElem(d map[string]string, video bool, sourceType MessageSourceType) (message.IMessageElement, error) { func (bot *CQBot) makeImageOrVideoElem(d map[string]string, video bool, sourceType message.SourceType) (message.IMessageElement, error) {
f := d["file"] f := d["file"]
u, ok := d["url"] u, ok := d["url"]
if !ok { if !ok {
@ -1254,7 +1234,7 @@ func (bot *CQBot) makeImageOrVideoElem(d map[string]string, video bool, sourceTy
return bot.readVideoCache(b), nil return bot.readVideoCache(b), nil
} }
// 目前频道内上传的图片均无法被查询到, 需要单独处理 // 目前频道内上传的图片均无法被查询到, 需要单独处理
if sourceType == MessageSourceGuildChannel { if sourceType == message.SourceGuildChannel {
cacheFile := path.Join(global.ImagePath, "guild-images", f) cacheFile := path.Join(global.ImagePath, "guild-images", f)
if global.PathExists(cacheFile) { if global.PathExists(cacheFile) {
return &LocalImageElement{File: cacheFile}, nil return &LocalImageElement{File: cacheFile}, nil
@ -1289,7 +1269,7 @@ func (bot *CQBot) makeImageOrVideoElem(d map[string]string, video bool, sourceTy
return bot.readImageCache(b, sourceType) return bot.readImageCache(b, sourceType)
} }
func (bot *CQBot) readImageCache(b []byte, sourceType MessageSourceType) (message.IMessageElement, error) { func (bot *CQBot) readImageCache(b []byte, sourceType message.SourceType) (message.IMessageElement, error) {
var err error var err error
if len(b) < 20 { if len(b) < 20 {
return nil, errors.New("invalid cache") return nil, errors.New("invalid cache")
@ -1304,9 +1284,9 @@ func (bot *CQBot) readImageCache(b []byte, sourceType MessageSourceType) (messag
} }
var rsp message.IMessageElement var rsp message.IMessageElement
switch sourceType { // nolint:exhaustive switch sourceType { // nolint:exhaustive
case MessageSourceGroup: case message.SourceGroup:
rsp, err = bot.Client.QueryGroupImage(int64(rand.Uint32()), hash, size) rsp, err = bot.Client.QueryGroupImage(int64(rand.Uint32()), hash, size)
case MessageSourceGuildChannel: case message.SourceGuildChannel:
if len(bot.Client.GuildService.Guilds) == 0 { if len(bot.Client.GuildService.Guilds) == 0 {
err = errors.New("cannot query guild image: not any joined guild") err = errors.New("cannot query guild image: not any joined guild")
break break

View File

@ -5,6 +5,7 @@ import (
"strings" "strings"
"testing" "testing"
"github.com/Mrs4s/MiraiGo/message"
"github.com/Mrs4s/MiraiGo/utils" "github.com/Mrs4s/MiraiGo/utils"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/tidwall/gjson" "github.com/tidwall/gjson"
@ -15,7 +16,7 @@ import (
var bot = CQBot{} var bot = CQBot{}
func TestCQBot_ConvertStringMessage(t *testing.T) { func TestCQBot_ConvertStringMessage(t *testing.T) {
for _, v := range bot.ConvertStringMessage(`[CQ:face,id=115,text=111][CQ:face,id=217]] [CQ:text,text=123] [`, MessageSourcePrivate) { for _, v := range bot.ConvertStringMessage(`[CQ:face,id=115,text=111][CQ:face,id=217]] [CQ:text,text=123] [`, message.SourcePrivate) {
fmt.Println(v) fmt.Println(v)
} }
} }
@ -27,14 +28,14 @@ var (
func BenchmarkCQBot_ConvertStringMessage(b *testing.B) { func BenchmarkCQBot_ConvertStringMessage(b *testing.B) {
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
bot.ConvertStringMessage(bench, MessageSourcePrivate) bot.ConvertStringMessage(bench, message.SourcePrivate)
} }
b.SetBytes(int64(len(bench))) b.SetBytes(int64(len(bench)))
} }
func BenchmarkCQBot_ConvertObjectMessage(b *testing.B) { func BenchmarkCQBot_ConvertObjectMessage(b *testing.B) {
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
bot.ConvertObjectMessage(benchArray, MessageSourcePrivate) bot.ConvertObjectMessage(benchArray, message.SourcePrivate)
} }
} }

View File

@ -21,7 +21,7 @@ import (
) )
// ToFormattedMessage 将给定[]message.IMessageElement转换为通过coolq.SetMessageFormat所定义的消息上报格式 // ToFormattedMessage 将给定[]message.IMessageElement转换为通过coolq.SetMessageFormat所定义的消息上报格式
func ToFormattedMessage(e []message.IMessageElement, source MessageSource, isRaw ...bool) (r interface{}) { func ToFormattedMessage(e []message.IMessageElement, source message.Source, isRaw ...bool) (r interface{}) {
if base.PostFormat == "string" { if base.PostFormat == "string" {
r = ToStringMessage(e, source, isRaw...) r = ToStringMessage(e, source, isRaw...)
} else if base.PostFormat == "array" { } else if base.PostFormat == "array" {
@ -32,9 +32,9 @@ func ToFormattedMessage(e []message.IMessageElement, source MessageSource, isRaw
func (bot *CQBot) privateMessageEvent(c *client.QQClient, m *message.PrivateMessage) { func (bot *CQBot) privateMessageEvent(c *client.QQClient, m *message.PrivateMessage) {
bot.checkMedia(m.Elements, m.Sender.Uin) bot.checkMedia(m.Elements, m.Sender.Uin)
source := MessageSource{ source := message.Source{
SourceType: MessageSourcePrivate, SourceType: message.SourcePrivate,
PrimaryID: uint64(m.Sender.Uin), PrimaryID: m.Sender.Uin,
} }
cqm := ToStringMessage(m.Elements, source, true) cqm := ToStringMessage(m.Elements, source, true)
id := bot.InsertPrivateMessage(m) id := bot.InsertPrivateMessage(m)
@ -89,9 +89,9 @@ func (bot *CQBot) groupMessageEvent(c *client.QQClient, m *message.GroupMessage)
return return
} }
} }
source := MessageSource{ source := message.Source{
SourceType: MessageSourceGroup, SourceType: message.SourceGroup,
PrimaryID: uint64(m.GroupCode), PrimaryID: m.GroupCode,
} }
cqm := ToStringMessage(m.Elements, source, true) cqm := ToStringMessage(m.Elements, source, true)
id := bot.InsertGroupMessage(m) id := bot.InsertGroupMessage(m)
@ -107,9 +107,9 @@ func (bot *CQBot) groupMessageEvent(c *client.QQClient, m *message.GroupMessage)
func (bot *CQBot) tempMessageEvent(c *client.QQClient, e *client.TempMessageEvent) { func (bot *CQBot) tempMessageEvent(c *client.QQClient, e *client.TempMessageEvent) {
m := e.Message m := e.Message
bot.checkMedia(m.Elements, m.Sender.Uin) bot.checkMedia(m.Elements, m.Sender.Uin)
source := MessageSource{ source := message.Source{
SourceType: MessageSourcePrivate, SourceType: message.SourcePrivate,
PrimaryID: uint64(e.Session.Sender), PrimaryID: e.Session.Sender,
} }
cqm := ToStringMessage(m.Elements, source, true) cqm := ToStringMessage(m.Elements, source, true)
bot.tempSessionCache.Store(m.Sender.Uin, e.Session) bot.tempSessionCache.Store(m.Sender.Uin, e.Session)
@ -149,10 +149,10 @@ func (bot *CQBot) guildChannelMessageEvent(c *client.QQClient, m *message.GuildC
return return
} }
channel := guild.FindChannel(m.ChannelId) channel := guild.FindChannel(m.ChannelId)
source := MessageSource{ source := message.Source{
SourceType: MessageSourceGuildChannel, SourceType: message.SourceGuildChannel,
PrimaryID: m.GuildId, PrimaryID: int64(m.GuildId),
SubID: m.ChannelId, SecondaryID: int64(m.ChannelId),
} }
log.Infof("收到来自频道 %v(%v) 子频道 %v(%v) 内 %v(%v) 的消息: %v", guild.GuildName, guild.GuildId, channel.ChannelName, m.ChannelId, m.Sender.Nickname, m.Sender.TinyId, ToStringMessage(m.Elements, source, true)) log.Infof("收到来自频道 %v(%v) 子频道 %v(%v) 内 %v(%v) 的消息: %v", guild.GuildName, guild.GuildId, channel.ChannelName, m.ChannelId, m.Sender.Nickname, m.Sender.TinyId, ToStringMessage(m.Elements, source, true))
id := bot.InsertGuildChannelMessage(m) id := bot.InsertGuildChannelMessage(m)
@ -181,7 +181,7 @@ func (bot *CQBot) guildMessageReactionsUpdatedEvent(c *client.QQClient, e *clien
if guild == nil { if guild == nil {
return return
} }
msgID := encodeGuildMessageID(e.GuildId, e.ChannelId, e.MessageId, MessageSourceGuildChannel) msgID := encodeGuildMessageID(e.GuildId, e.ChannelId, e.MessageId, message.SourceGuildChannel)
str := fmt.Sprintf("频道 %v(%v) 消息 %v 表情贴片已更新: ", guild.GuildName, guild.GuildId, msgID) str := fmt.Sprintf("频道 %v(%v) 消息 %v 表情贴片已更新: ", guild.GuildName, guild.GuildId, msgID)
currentReactions := make([]global.MSG, len(e.CurrentReactions)) currentReactions := make([]global.MSG, len(e.CurrentReactions))
for i, r := range e.CurrentReactions { for i, r := range e.CurrentReactions {
@ -228,7 +228,7 @@ func (bot *CQBot) guildChannelMessageRecalledEvent(c *client.QQClient, e *client
log.Errorf("处理频道撤回事件时出现错误: 获取操作者资料时出现错误 %v", err) log.Errorf("处理频道撤回事件时出现错误: 获取操作者资料时出现错误 %v", err)
return return
} }
msgID := encodeGuildMessageID(e.GuildId, e.ChannelId, e.MessageId, MessageSourceGuildChannel) msgID := encodeGuildMessageID(e.GuildId, e.ChannelId, e.MessageId, message.SourceGuildChannel)
log.Infof("用户 %v(%v) 撤回了频道 %v(%v) 子频道 %v(%v) 的消息 %v", operator.Nickname, operator.TinyId, guild.GuildName, guild.GuildId, channel.ChannelName, channel.ChannelId, msgID) log.Infof("用户 %v(%v) 撤回了频道 %v(%v) 子频道 %v(%v) 的消息 %v", operator.Nickname, operator.TinyId, guild.GuildName, guild.GuildId, channel.ChannelName, channel.ChannelId, msgID)
bot.dispatchEventMessage(global.MSG{ bot.dispatchEventMessage(global.MSG{
"post_type": "notice", "post_type": "notice",

2
go.mod
View File

@ -4,7 +4,7 @@ go 1.17
require ( require (
github.com/Microsoft/go-winio v0.5.1 github.com/Microsoft/go-winio v0.5.1
github.com/Mrs4s/MiraiGo v0.0.0-20220220152607-5e8a5126989d github.com/Mrs4s/MiraiGo v0.0.0-20220221093105-1e32793eef06
github.com/RomiChan/websocket v1.4.3-0.20220123145318-307a86b127bc github.com/RomiChan/websocket v1.4.3-0.20220123145318-307a86b127bc
github.com/fumiama/go-hide-param v0.1.4 github.com/fumiama/go-hide-param v0.1.4
github.com/gabriel-vasile/mimetype v1.4.0 github.com/gabriel-vasile/mimetype v1.4.0

4
go.sum
View File

@ -1,7 +1,7 @@
github.com/Microsoft/go-winio v0.5.1 h1:aPJp2QD7OOrhO5tQXqQoGSJc+DjDtWTGLOmNyAm6FgY= github.com/Microsoft/go-winio v0.5.1 h1:aPJp2QD7OOrhO5tQXqQoGSJc+DjDtWTGLOmNyAm6FgY=
github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
github.com/Mrs4s/MiraiGo v0.0.0-20220220152607-5e8a5126989d h1:Og/CXvf7cNq+GFpIe3Tjll500qD8L8wunTXC6bQRUxI= github.com/Mrs4s/MiraiGo v0.0.0-20220221093105-1e32793eef06 h1:9V7AhNUPJ1vqLAoXjwLdpv06hJWs15UdgYbKaHww60s=
github.com/Mrs4s/MiraiGo v0.0.0-20220220152607-5e8a5126989d/go.mod h1:T66Ua3SOfpJMx+DcfQxk95MeR8RmvAVmjYSkoQQ8nwI= github.com/Mrs4s/MiraiGo v0.0.0-20220221093105-1e32793eef06/go.mod h1:T66Ua3SOfpJMx+DcfQxk95MeR8RmvAVmjYSkoQQ8nwI=
github.com/RomiChan/protobuf v0.0.0-20220213164748-44b69c8bdec0 h1:8CK7Hg+CRGTFhpjvp5V+7wd8/TkuZ6fSuztLVV3bwoQ= github.com/RomiChan/protobuf v0.0.0-20220213164748-44b69c8bdec0 h1:8CK7Hg+CRGTFhpjvp5V+7wd8/TkuZ6fSuztLVV3bwoQ=
github.com/RomiChan/protobuf v0.0.0-20220213164748-44b69c8bdec0/go.mod h1:CKKOWC7mBxd36zxsCB1V8DTrwlTNRQvkSVbYqyUiGEE= github.com/RomiChan/protobuf v0.0.0-20220213164748-44b69c8bdec0/go.mod h1:CKKOWC7mBxd36zxsCB1V8DTrwlTNRQvkSVbYqyUiGEE=
github.com/RomiChan/websocket v1.4.3-0.20220123145318-307a86b127bc h1:AAx50/fb/xS4lvsdQg+bFbGvqSDhyV1MF+p2PLCamZ0= github.com/RomiChan/websocket v1.4.3-0.20220123145318-307a86b127bc h1:AAx50/fb/xS4lvsdQg+bFbGvqSDhyV1MF+p2PLCamZ0=