@@ -789,116 +789,120 @@ func (bot *CQBot) CQSendGuildChannelMessage(guildID, channelID uint64, m gjson.R
789789
790790func (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 发送私聊消息
0 commit comments