diff --git a/coolq/api.go b/coolq/api.go index 020f211..486b543 100644 --- a/coolq/api.go +++ b/coolq/api.go @@ -789,116 +789,120 @@ func (bot *CQBot) CQSendGuildChannelMessage(guildID, channelID uint64, m gjson.R func (bot *CQBot) uploadForwardElement(m gjson.Result, groupID int64) *message.ForwardElement { ts := time.Now().Add(-time.Minute * 5) - fm := message.NewForwardMessage() source := message.Source{SourceType: message.SourceGroup, PrimaryID: groupID} + builder := bot.Client.NewForwardMessageBuilder(groupID) - var w worker - resolveElement := func(elems []message.IMessageElement) []message.IMessageElement { - for i, elem := range elems { - p := &elems[i] - switch o := elem.(type) { - case *LocalVideoElement: - w.do(func() { - gm, err := bot.uploadLocalVideo(source, o) - if err != nil { - log.Warnf(uploadFailedTemplate, "群", groupID, "视频", err) - } else { - *p = gm - } - }) - case *LocalImageElement: - w.do(func() { - gm, err := bot.uploadLocalImage(source, o) - if err != nil { - log.Warnf(uploadFailedTemplate, "群", groupID, "图片", err) - } else { - *p = gm - } - }) - } - } - return elems - } - - convert := func(e gjson.Result) *message.ForwardNode { - if e.Get("type").Str != "node" { - return nil - } - ts.Add(time.Second) - if e.Get("data.id").Exists() { - i := e.Get("data.id").Int() - m, _ := db.GetGroupMessageByGlobalID(int32(i)) - if m != nil { - return &message.ForwardNode{ - SenderId: m.Attribute.SenderUin, - SenderName: m.Attribute.SenderName, - Time: func() int32 { - msgTime := m.Attribute.Timestamp - if msgTime == 0 { - return int32(ts.Unix()) + var convertMessage func(m gjson.Result) *message.ForwardMessage + convertMessage = func(m gjson.Result) *message.ForwardMessage { + fm := message.NewForwardMessage() + var w worker + resolveElement := func(elems []message.IMessageElement) []message.IMessageElement { + for i, elem := range elems { + p := &elems[i] + switch o := elem.(type) { + case *LocalVideoElement: + w.do(func() { + gm, err := bot.uploadLocalVideo(source, o) + if err != nil { + log.Warnf(uploadFailedTemplate, "群", groupID, "视频", err) + } else { + *p = gm } - return int32(msgTime) - }(), - Message: resolveElement(bot.ConvertContentMessage(m.Content, message.SourceGroup)), + }) + case *LocalImageElement: + w.do(func() { + gm, err := bot.uploadLocalImage(source, o) + if err != nil { + log.Warnf(uploadFailedTemplate, "群", groupID, "图片", err) + } else { + *p = gm + } + }) } } - log.Warnf("警告: 引用消息 %v 错误或数据库未开启.", e.Get("data.id").Str) - return nil + return elems } - uin := e.Get("data.[user_id,uin].0").Int() - msgTime := e.Get("data.time").Int() - if msgTime == 0 { - msgTime = ts.Unix() - } - name := e.Get("data.name").Str - c := e.Get("data.content") - if c.IsArray() { - nested := false - c.ForEach(func(_, value gjson.Result) bool { - if value.Get("type").Str == "node" { - nested = true - return false + + convert := func(e gjson.Result) *message.ForwardNode { + if e.Get("type").Str != "node" { + return nil + } + if e.Get("data.id").Exists() { + i := e.Get("data.id").Int() + m, _ := db.GetGroupMessageByGlobalID(int32(i)) + if m != nil { + msgTime := m.Attribute.Timestamp + if msgTime == 0 { + msgTime = ts.Unix() + } + return &message.ForwardNode{ + SenderId: m.Attribute.SenderUin, + SenderName: m.Attribute.SenderName, + Time: int32(msgTime), + Message: resolveElement(bot.ConvertContentMessage(m.Content, message.SourceGroup)), + } } - return true - }) - if nested { // 处理嵌套 - fe := bot.uploadForwardElement(c, groupID) + log.Warnf("警告: 引用消息 %v 错误或数据库未开启.", e.Get("data.id").Str) + return nil + } + uin := e.Get("data.[user_id,uin].0").Int() + msgTime := e.Get("data.time").Int() + if msgTime == 0 { + msgTime = ts.Unix() + } + name := e.Get("data.name").Str + c := e.Get("data.content") + if c.IsArray() { + nested := false + c.ForEach(func(_, value gjson.Result) bool { + if value.Get("type").Str == "node" { + nested = true + return false + } + return true + }) + if nested { // 处理嵌套 + nestedNode := builder.NestedNode() + builder.Link(nestedNode, convertMessage(c)) + return &message.ForwardNode{ + SenderId: uin, + SenderName: name, + Time: int32(msgTime), + Message: []message.IMessageElement{nestedNode}, + } + } + } + content := bot.ConvertObjectMessage(c, message.SourceGroup) + if uin != 0 && name != "" && len(content) > 0 { return &message.ForwardNode{ SenderId: uin, SenderName: name, Time: int32(msgTime), - Message: []message.IMessageElement{fe}, + Message: resolveElement(content), } } + log.Warnf("警告: 非法 Forward node 将跳过. uin: %v name: %v content count: %v", uin, name, len(content)) + return nil } - content := bot.ConvertObjectMessage(c, message.SourceGroup) - if uin != 0 && name != "" && len(content) > 0 { - return &message.ForwardNode{ - SenderId: uin, - SenderName: name, - Time: int32(msgTime), - Message: resolveElement(content), - } - } - log.Warnf("警告: 非法 Forward node 将跳过. uin: %v name: %v content count: %v", uin, name, len(content)) - return nil - } - if m.IsArray() { - for _, item := range m.Array() { - node := convert(item) + if m.IsArray() { + for _, item := range m.Array() { + node := convert(item) + if node != nil { + fm.AddNode(node) + } + } + } else { + node := convert(m) if node != nil { fm.AddNode(node) } } - } else { - node := convert(m) - if node != nil { - fm.AddNode(node) - } + + w.wait() + return fm } - w.wait() - return bot.Client.UploadGroupForwardMessage(groupID, fm) + return builder.Main(convertMessage(m)) } // CQSendGroupForwardMessage 扩展API-发送合并转发(群) @@ -912,17 +916,17 @@ func (bot *CQBot) CQSendGroupForwardMessage(groupID int64, m gjson.Result) globa } fe := bot.uploadForwardElement(m, groupID) - if fe != nil { - ret := bot.Client.SendGroupForwardMessage(groupID, fe) - if ret == nil || ret.Id == -1 { - log.Warnf("合并转发(群)消息发送失败: 账号可能被风控.") - return Failed(100, "SEND_MSG_API_ERROR", "请参考 go-cqhttp 端输出") - } - return OK(global.MSG{ - "message_id": bot.InsertGroupMessage(ret), - }) + if fe == nil { + return Failed(100, "EMPTY_NODES", "未找到任何可发送的合并转发信息") } - return Failed(100, "EMPTY_NODES", "未找到任何可发送的合并转发信息") + ret := bot.Client.SendGroupForwardMessage(groupID, fe) + if ret == nil || ret.Id == -1 { + log.Warnf("合并转发(群)消息发送失败: 账号可能被风控.") + return Failed(100, "SEND_MSG_API_ERROR", "请参考 go-cqhttp 端输出") + } + return OK(global.MSG{ + "message_id": bot.InsertGroupMessage(ret), + }) } // CQSendPrivateMessage 发送私聊消息 diff --git a/go.mod b/go.mod index 43649e2..abf9dc2 100644 --- a/go.mod +++ b/go.mod @@ -4,8 +4,8 @@ go 1.18 require ( github.com/Microsoft/go-winio v0.5.1 - github.com/Mrs4s/MiraiGo v0.0.0-20220320070754-38990f6e1cf9 - github.com/RomiChan/syncx v0.0.0-20220320065321-8d448f958257 + github.com/Mrs4s/MiraiGo v0.0.0-20220321133915-aa657c0f09d0 + github.com/RomiChan/syncx v0.0.0-20220320130821-c88644afda9c github.com/RomiChan/websocket v1.4.3-0.20220123145318-307a86b127bc github.com/fumiama/go-hide-param v0.1.4 github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible diff --git a/go.sum b/go.sum index 2442768..95564b9 100644 --- a/go.sum +++ b/go.sum @@ -1,11 +1,11 @@ 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/Mrs4s/MiraiGo v0.0.0-20220320070754-38990f6e1cf9 h1:YJeHJRNVfpbuC7wSQD3WOcysC7AcILgQf5d8kFPL12Y= -github.com/Mrs4s/MiraiGo v0.0.0-20220320070754-38990f6e1cf9/go.mod h1:qseuVVwl5wxdhphaS29F6CN0gV2J0ojT880Ql5g2MBo= +github.com/Mrs4s/MiraiGo v0.0.0-20220321133915-aa657c0f09d0 h1:RsFAUylRh9T4zIx4iVe8KTbG/XtI/uHw2qhhQfoCetE= +github.com/Mrs4s/MiraiGo v0.0.0-20220321133915-aa657c0f09d0/go.mod h1:APw03y3A3Qp5In9gI/S9m7DBJkWsd6FQMV+fB636bmU= github.com/RomiChan/protobuf v0.0.0-20220318113238-d8a99598f896 h1:UFAqSbH6VqW5mEzQV2HVB7+p3k9JfTbidWJ/9F15yz0= github.com/RomiChan/protobuf v0.0.0-20220318113238-d8a99598f896/go.mod h1:CKKOWC7mBxd36zxsCB1V8DTrwlTNRQvkSVbYqyUiGEE= -github.com/RomiChan/syncx v0.0.0-20220320065321-8d448f958257 h1:fdMod+DEoiICoTtS1Wij/wl1d57FPvKVmretLi2sGD8= -github.com/RomiChan/syncx v0.0.0-20220320065321-8d448f958257/go.mod h1:KqZzu7slNKROh3TSYEH/IUMG6f4M+1qubZ5e52QypsE= +github.com/RomiChan/syncx v0.0.0-20220320130821-c88644afda9c h1:zHWyqx7A71A/+mlzthPVcVrNGuTPyTpCW3meUPtaULU= +github.com/RomiChan/syncx v0.0.0-20220320130821-c88644afda9c/go.mod h1:KqZzu7slNKROh3TSYEH/IUMG6f4M+1qubZ5e52QypsE= 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/go.mod h1:OMmITAib6POA37xCichWM0aRnoVpSMZO1rB/G01wrr0= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=