From c3d5aafe5d14253de2fb98fb866d093ec32b25e2 Mon Sep 17 00:00:00 2001 From: Mrs4s <1844812067@qq.com> Date: Tue, 25 Aug 2020 00:42:23 +0800 Subject: [PATCH] update group msg sending. --- client/builders.go | 17 ++++++++--------- client/client.go | 45 +++++++++++++++++++++++++++++---------------- message/message.go | 15 +++++++++++++++ 3 files changed, 52 insertions(+), 25 deletions(-) diff --git a/client/builders.go b/client/builders.go index 16a2507d..8d837fab 100644 --- a/client/builders.go +++ b/client/builders.go @@ -386,22 +386,21 @@ func (c *QQClient) buildDeleteOnlinePushPacket(uin int64, seq uint16, delMsg []j } // MessageSvc.PbSendMsg -func (c *QQClient) buildGroupSendingPacket(groupCode int64, r int32, forward bool, m *message.SendingMessage) (uint16, []byte) { +func (c *QQClient) buildGroupSendingPacket(groupCode int64, r, pkgNum, pkgIndex, pkgDiv int32, forward bool, m []message.IMessageElement) (uint16, []byte) { seq := c.nextSeq() var ptt *message.GroupVoiceElement - if i := m.FirstOrNil(func(e message.IMessageElement) bool { - _, ok := e.(*message.GroupVoiceElement) - return ok - }); i != nil { - ptt = i.(*message.GroupVoiceElement) - m.Elements = []message.IMessageElement{} + if len(m) > 0 { + if p, ok := m[0].(*message.GroupVoiceElement); ok { + ptt = p + m = []message.IMessageElement{} + } } req := &msg.SendMessageRequest{ RoutingHead: &msg.RoutingHead{Grp: &msg.Grp{GroupCode: groupCode}}, - ContentHead: &msg.ContentHead{PkgNum: 1}, + ContentHead: &msg.ContentHead{PkgNum: pkgNum, PkgIndex: pkgIndex, DivSeq: pkgDiv}, MsgBody: &msg.MessageBody{ RichText: &msg.RichText{ - Elems: message.ToProtoElems(m.Elements, true), + Elems: message.ToProtoElems(m, true), Ptt: func() *msg.Ptt { if ptt != nil { return ptt.Ptt diff --git a/client/client.go b/client/client.go index 708edd0f..ce5c101a 100644 --- a/client/client.go +++ b/client/client.go @@ -255,14 +255,18 @@ func (c *QQClient) GetGroupFileUrl(groupCode int64, fileId string, busId int32) return url } -func (c *QQClient) SendGroupMessage(groupCode int64, m *message.SendingMessage) *message.GroupMessage { +func (c *QQClient) SendGroupMessage(groupCode int64, m *message.SendingMessage, f ...bool) *message.GroupMessage { + useFram := false + if len(f) > 0 { + useFram = f[0] + } imgCount := m.Count(func(e message.IMessageElement) bool { return e.Type() == message.Image }) msgLen := message.EstimateLength(m.Elements, 703) if msgLen > 5000 || imgCount > 50 { return nil } - if msgLen > 300 || imgCount > 2 { - return c.sendGroupLongOrForwardMessage(groupCode, true, &message.ForwardMessage{Nodes: []*message.ForwardNode{ + if (msgLen > 300 || imgCount > 2) && !useFram { + ret := c.sendGroupLongOrForwardMessage(groupCode, true, &message.ForwardMessage{Nodes: []*message.ForwardNode{ { SenderId: c.Uin, SenderName: c.Nickname, @@ -270,6 +274,10 @@ func (c *QQClient) SendGroupMessage(groupCode int64, m *message.SendingMessage) Message: m.Elements, }, }}) + if ret != nil && ret.Id == -1 { + return c.SendGroupMessage(groupCode, m, true) + } + return ret } return c.sendGroupMessage(groupCode, false, m) } @@ -284,8 +292,23 @@ func (c *QQClient) sendGroupMessage(groupCode int64, forward bool, m *message.Se } }) defer c.onGroupMessageReceipt(eid) - _, pkt := c.buildGroupSendingPacket(groupCode, mr, forward, m) - _ = c.send(pkt) + imgCount := m.Count(func(e message.IMessageElement) bool { return e.Type() == message.Image }) + msgLen := message.EstimateLength(m.Elements, 703) + if (msgLen > 300 || imgCount > 2) && !forward && !m.Any(func(e message.IMessageElement) bool { + _, ok := e.(*message.GroupVoiceElement) + _, ok2 := e.(*message.ServiceElement) + return ok || ok2 + }) { + div := int32(rand.Uint32()) + fragmented := m.ToFragmented() + for i, elems := range fragmented { + _, pkt := c.buildGroupSendingPacket(groupCode, mr, int32(len(fragmented)), int32(i), div, forward, elems) + _ = c.send(pkt) + } + } else { + _, pkt := c.buildGroupSendingPacket(groupCode, mr, 1, 0, 0, forward, m.Elements) + _ = c.send(pkt) + } var mid int32 ret := &message.GroupMessage{ Id: -1, @@ -319,17 +342,7 @@ func (c *QQClient) SendPrivateMessage(target int64, m *message.SendingMessage) * } if msgLen > 300 || imgCount > 2 { div := int32(rand.Uint32()) - var fragmented [][]message.IMessageElement - for _, elem := range m.Elements { - switch o := elem.(type) { - case *message.TextElement: - for _, text := range utils.ChunkString(o.Content, 220) { - fragmented = append(fragmented, []message.IMessageElement{message.NewText(text)}) - } - default: - fragmented = append(fragmented, []message.IMessageElement{o}) - } - } + fragmented := m.ToFragmented() for i, elems := range fragmented { _, pkt := c.buildFriendSendingPacket(target, c.nextFriendSeq(), mr, int32(len(fragmented)), int32(i), div, t, elems) _ = c.send(pkt) diff --git a/message/message.go b/message/message.go index f1103ae2..a8388b00 100644 --- a/message/message.go +++ b/message/message.go @@ -179,6 +179,21 @@ func (msg *SendingMessage) Count(filter func(e IMessageElement) bool) (c int) { return } +func (msg *SendingMessage) ToFragmented() [][]IMessageElement { + var fragmented [][]IMessageElement + for _, elem := range msg.Elements { + switch o := elem.(type) { + case *TextElement: + for _, text := range utils.ChunkString(o.Content, 220) { + fragmented = append(fragmented, []IMessageElement{NewText(text)}) + } + default: + fragmented = append(fragmented, []IMessageElement{o}) + } + } + return fragmented +} + func EstimateLength(elems []IMessageElement, limit int) int { sum := 0 for _, elem := range elems {