Skip to content

Commit 112441d

Browse files
committed
coolq: refactor send forward message
1 parent 062eea6 commit 112441d

3 files changed

Lines changed: 110 additions & 106 deletions

File tree

‎coolq/api.go‎

Lines changed: 104 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -789,116 +789,120 @@ func (bot *CQBot) CQSendGuildChannelMessage(guildID, channelID uint64, m gjson.R
789789

790790
func (bot *CQBot) uploadForwardElement(m gjson.Result, groupID int64) *message.ForwardElement {
791791
ts := time.Now().Add(-time.Minute * 5)
792-
fm := message.NewForwardMessage()
793792
source := message.Source{SourceType: message.SourceGroup, PrimaryID: groupID}
794-
795-
var w worker
796-
resolveElement := func(elems []message.IMessageElement) []message.IMessageElement {
797-
for i, elem := range elems {
798-
p := &elems[i]
799-
switch o := elem.(type) {
800-
case *LocalVideoElement:
801-
w.do(func() {
802-
gm, err := bot.uploadLocalVideo(source, o)
803-
if err != nil {
804-
log.Warnf(uploadFailedTemplate, "群", groupID, "视频", err)
805-
} else {
806-
*p = gm
807-
}
808-
})
809-
case *LocalImageElement:
810-
w.do(func() {
811-
gm, err := bot.uploadLocalImage(source, o)
812-
if err != nil {
813-
log.Warnf(uploadFailedTemplate, "群", groupID, "图片", err)
814-
} else {
815-
*p = gm
816-
}
817-
})
793+
builder := bot.Client.NewForwardMessageBuilder(groupID)
794+
795+
var convertMessage func(m gjson.Result) *message.ForwardMessage
796+
convertMessage = func(m gjson.Result) *message.ForwardMessage {
797+
fm := message.NewForwardMessage()
798+
var w worker
799+
resolveElement := func(elems []message.IMessageElement) []message.IMessageElement {
800+
for i, elem := range elems {
801+
p := &elems[i]
802+
switch o := elem.(type) {
803+
case *LocalVideoElement:
804+
w.do(func() {
805+
gm, err := bot.uploadLocalVideo(source, o)
806+
if err != nil {
807+
log.Warnf(uploadFailedTemplate, "群", groupID, "视频", err)
808+
} else {
809+
*p = gm
810+
}
811+
})
812+
case *LocalImageElement:
813+
w.do(func() {
814+
gm, err := bot.uploadLocalImage(source, o)
815+
if err != nil {
816+
log.Warnf(uploadFailedTemplate, "群", groupID, "图片", err)
817+
} else {
818+
*p = gm
819+
}
820+
})
821+
}
818822
}
823+
return elems
819824
}
820-
return elems
821-
}
822825

823-
convert := func(e gjson.Result) *message.ForwardNode {
824-
if e.Get("type").Str != "node" {
825-
return nil
826-
}
827-
ts.Add(time.Second)
828-
if e.Get("data.id").Exists() {
829-
i := e.Get("data.id").Int()
830-
m, _ := db.GetGroupMessageByGlobalID(int32(i))
831-
if m != nil {
832-
return &message.ForwardNode{
833-
SenderId: m.Attribute.SenderUin,
834-
SenderName: m.Attribute.SenderName,
835-
Time: func() int32 {
836-
msgTime := m.Attribute.Timestamp
837-
if msgTime == 0 {
838-
return int32(ts.Unix())
839-
}
840-
return int32(msgTime)
841-
}(),
842-
Message: resolveElement(bot.ConvertContentMessage(m.Content, message.SourceGroup)),
826+
convert := func(e gjson.Result) *message.ForwardNode {
827+
if e.Get("type").Str != "node" {
828+
return nil
829+
}
830+
if e.Get("data.id").Exists() {
831+
i := e.Get("data.id").Int()
832+
m, _ := db.GetGroupMessageByGlobalID(int32(i))
833+
if m != nil {
834+
msgTime := m.Attribute.Timestamp
835+
if msgTime == 0 {
836+
msgTime = ts.Unix()
837+
}
838+
return &message.ForwardNode{
839+
SenderId: m.Attribute.SenderUin,
840+
SenderName: m.Attribute.SenderName,
841+
Time: int32(msgTime),
842+
Message: resolveElement(bot.ConvertContentMessage(m.Content, message.SourceGroup)),
843+
}
843844
}
845+
log.Warnf("警告: 引用消息 %v 错误或数据库未开启.", e.Get("data.id").Str)
846+
return nil
844847
}
845-
log.Warnf("警告: 引用消息 %v 错误或数据库未开启.", e.Get("data.id").Str)
846-
return nil
847-
}
848-
uin := e.Get("data.[user_id,uin].0").Int()
849-
msgTime := e.Get("data.time").Int()
850-
if msgTime == 0 {
851-
msgTime = ts.Unix()
852-
}
853-
name := e.Get("data.name").Str
854-
c := e.Get("data.content")
855-
if c.IsArray() {
856-
nested := false
857-
c.ForEach(func(_, value gjson.Result) bool {
858-
if value.Get("type").Str == "node" {
859-
nested = true
860-
return false
848+
uin := e.Get("data.[user_id,uin].0").Int()
849+
msgTime := e.Get("data.time").Int()
850+
if msgTime == 0 {
851+
msgTime = ts.Unix()
852+
}
853+
name := e.Get("data.name").Str
854+
c := e.Get("data.content")
855+
if c.IsArray() {
856+
nested := false
857+
c.ForEach(func(_, value gjson.Result) bool {
858+
if value.Get("type").Str == "node" {
859+
nested = true
860+
return false
861+
}
862+
return true
863+
})
864+
if nested { // 处理嵌套
865+
nestedNode := builder.NestedNode()
866+
builder.Link(nestedNode, convertMessage(c))
867+
return &message.ForwardNode{
868+
SenderId: uin,
869+
SenderName: name,
870+
Time: int32(msgTime),
871+
Message: []message.IMessageElement{nestedNode},
872+
}
861873
}
862-
return true
863-
})
864-
if nested { // 处理嵌套
865-
fe := bot.uploadForwardElement(c, groupID)
874+
}
875+
content := bot.ConvertObjectMessage(c, message.SourceGroup)
876+
if uin != 0 && name != "" && len(content) > 0 {
866877
return &message.ForwardNode{
867878
SenderId: uin,
868879
SenderName: name,
869880
Time: int32(msgTime),
870-
Message: []message.IMessageElement{fe},
881+
Message: resolveElement(content),
871882
}
872883
}
884+
log.Warnf("警告: 非法 Forward node 将跳过. uin: %v name: %v content count: %v", uin, name, len(content))
885+
return nil
873886
}
874-
content := bot.ConvertObjectMessage(c, message.SourceGroup)
875-
if uin != 0 && name != "" && len(content) > 0 {
876-
return &message.ForwardNode{
877-
SenderId: uin,
878-
SenderName: name,
879-
Time: int32(msgTime),
880-
Message: resolveElement(content),
881-
}
882-
}
883-
log.Warnf("警告: 非法 Forward node 将跳过. uin: %v name: %v content count: %v", uin, name, len(content))
884-
return nil
885-
}
886887

887-
if m.IsArray() {
888-
for _, item := range m.Array() {
889-
node := convert(item)
888+
if m.IsArray() {
889+
for _, item := range m.Array() {
890+
node := convert(item)
891+
if node != nil {
892+
fm.AddNode(node)
893+
}
894+
}
895+
} else {
896+
node := convert(m)
890897
if node != nil {
891898
fm.AddNode(node)
892899
}
893900
}
894-
} else {
895-
node := convert(m)
896-
if node != nil {
897-
fm.AddNode(node)
898-
}
901+
902+
w.wait()
903+
return fm
899904
}
900-
w.wait()
901-
return bot.Client.UploadGroupForwardMessage(groupID, fm)
905+
return builder.Main(convertMessage(m))
902906
}
903907

904908
// CQSendGroupForwardMessage 扩展API-发送合并转发(群)
@@ -912,17 +916,17 @@ func (bot *CQBot) CQSendGroupForwardMessage(groupID int64, m gjson.Result) globa
912916
}
913917

914918
fe := bot.uploadForwardElement(m, groupID)
915-
if fe != nil {
916-
ret := bot.Client.SendGroupForwardMessage(groupID, fe)
917-
if ret == nil || ret.Id == -1 {
918-
log.Warnf("合并转发(群)消息发送失败: 账号可能被风控.")
919-
return Failed(100, "SEND_MSG_API_ERROR", "请参考 go-cqhttp 端输出")
920-
}
921-
return OK(global.MSG{
922-
"message_id": bot.InsertGroupMessage(ret),
923-
})
919+
if fe == nil {
920+
return Failed(100, "EMPTY_NODES", "未找到任何可发送的合并转发信息")
921+
}
922+
ret := bot.Client.SendGroupForwardMessage(groupID, fe)
923+
if ret == nil || ret.Id == -1 {
924+
log.Warnf("合并转发(群)消息发送失败: 账号可能被风控.")
925+
return Failed(100, "SEND_MSG_API_ERROR", "请参考 go-cqhttp 端输出")
924926
}
925-
return Failed(100, "EMPTY_NODES", "未找到任何可发送的合并转发信息")
927+
return OK(global.MSG{
928+
"message_id": bot.InsertGroupMessage(ret),
929+
})
926930
}
927931

928932
// CQSendPrivateMessage 发送私聊消息

‎go.mod‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ go 1.18
44

55
require (
66
github.com/Microsoft/go-winio v0.5.1
7-
github.com/Mrs4s/MiraiGo v0.0.0-20220320070754-38990f6e1cf9
8-
github.com/RomiChan/syncx v0.0.0-20220320065321-8d448f958257
7+
github.com/Mrs4s/MiraiGo v0.0.0-20220321133915-aa657c0f09d0
8+
github.com/RomiChan/syncx v0.0.0-20220320130821-c88644afda9c
99
github.com/RomiChan/websocket v1.4.3-0.20220123145318-307a86b127bc
1010
github.com/fumiama/go-hide-param v0.1.4
1111
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible

‎go.sum‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
github.com/Microsoft/go-winio v0.5.1 h1:aPJp2QD7OOrhO5tQXqQoGSJc+DjDtWTGLOmNyAm6FgY=
22
github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
3-
github.com/Mrs4s/MiraiGo v0.0.0-20220320070754-38990f6e1cf9 h1:YJeHJRNVfpbuC7wSQD3WOcysC7AcILgQf5d8kFPL12Y=
4-
github.com/Mrs4s/MiraiGo v0.0.0-20220320070754-38990f6e1cf9/go.mod h1:qseuVVwl5wxdhphaS29F6CN0gV2J0ojT880Ql5g2MBo=
3+
github.com/Mrs4s/MiraiGo v0.0.0-20220321133915-aa657c0f09d0 h1:RsFAUylRh9T4zIx4iVe8KTbG/XtI/uHw2qhhQfoCetE=
4+
github.com/Mrs4s/MiraiGo v0.0.0-20220321133915-aa657c0f09d0/go.mod h1:APw03y3A3Qp5In9gI/S9m7DBJkWsd6FQMV+fB636bmU=
55
github.com/RomiChan/protobuf v0.0.0-20220318113238-d8a99598f896 h1:UFAqSbH6VqW5mEzQV2HVB7+p3k9JfTbidWJ/9F15yz0=
66
github.com/RomiChan/protobuf v0.0.0-20220318113238-d8a99598f896/go.mod h1:CKKOWC7mBxd36zxsCB1V8DTrwlTNRQvkSVbYqyUiGEE=
7-
github.com/RomiChan/syncx v0.0.0-20220320065321-8d448f958257 h1:fdMod+DEoiICoTtS1Wij/wl1d57FPvKVmretLi2sGD8=
8-
github.com/RomiChan/syncx v0.0.0-20220320065321-8d448f958257/go.mod h1:KqZzu7slNKROh3TSYEH/IUMG6f4M+1qubZ5e52QypsE=
7+
github.com/RomiChan/syncx v0.0.0-20220320130821-c88644afda9c h1:zHWyqx7A71A/+mlzthPVcVrNGuTPyTpCW3meUPtaULU=
8+
github.com/RomiChan/syncx v0.0.0-20220320130821-c88644afda9c/go.mod h1:KqZzu7slNKROh3TSYEH/IUMG6f4M+1qubZ5e52QypsE=
99
github.com/RomiChan/websocket v1.4.3-0.20220123145318-307a86b127bc h1:AAx50/fb/xS4lvsdQg+bFbGvqSDhyV1MF+p2PLCamZ0=
1010
github.com/RomiChan/websocket v1.4.3-0.20220123145318-307a86b127bc/go.mod h1:OMmITAib6POA37xCichWM0aRnoVpSMZO1rB/G01wrr0=
1111
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=

0 commit comments

Comments
 (0)