From c0fadc3a4c5afc53ab64805f57dac73f13732e48 Mon Sep 17 00:00:00 2001 From: Mrs4s <1844812067@qq.com> Date: Sun, 16 Aug 2020 19:15:33 +0800 Subject: [PATCH] private long message supported. --- client/builders.go | 6 +++--- client/client.go | 28 ++++++++++++++++++++++++++-- utils/string.go | 18 ++++++++++++++++++ 3 files changed, 47 insertions(+), 5 deletions(-) diff --git a/client/builders.go b/client/builders.go index ed0b8dc8..dce2e7a3 100644 --- a/client/builders.go +++ b/client/builders.go @@ -425,14 +425,14 @@ func (c *QQClient) buildGroupSendingPacket(groupCode int64, r int32, forward boo } // MessageSvc.PbSendMsg -func (c *QQClient) buildFriendSendingPacket(target int64, msgSeq, r int32, time int64, m *message.SendingMessage) (uint16, []byte) { +func (c *QQClient) buildFriendSendingPacket(target int64, msgSeq, r, pkgNum, pkgIndex, pkgDiv int32, time int64, m []message.IMessageElement) (uint16, []byte) { seq := c.nextSeq() req := &msg.SendMessageRequest{ RoutingHead: &msg.RoutingHead{C2C: &msg.C2C{ToUin: target}}, - 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, false), + Elems: message.ToProtoElems(m, false), }, }, MsgSeq: msgSeq, diff --git a/client/client.go b/client/client.go index 5d92fdba..0e783d2b 100644 --- a/client/client.go +++ b/client/client.go @@ -285,8 +285,32 @@ func (c *QQClient) SendPrivateMessage(target int64, m *message.SendingMessage) * mr := int32(rand.Uint32()) seq := c.nextFriendSeq() t := time.Now().Unix() - _, pkt := c.buildFriendSendingPacket(target, seq, mr, t, 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 > 5000 || imgCount > 50 { + return nil + } + 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, 300) { + fragmented = append(fragmented, []message.IMessageElement{message.NewText(text)}) + } + default: + fragmented = append(fragmented, []message.IMessageElement{o}) + } + } + for i, elems := range fragmented { + _, pkt := c.buildFriendSendingPacket(target, c.nextFriendSeq(), mr, int32(len(fragmented)), int32(i), div, t, elems) + _ = c.send(pkt) + } + } else { + _, pkt := c.buildFriendSendingPacket(target, seq, mr, 1, 0, 0, t, m.Elements) + _ = c.send(pkt) + } return &message.PrivateMessage{ Id: seq, InternalId: mr, diff --git a/utils/string.go b/utils/string.go index fcddd1db..b792d1d6 100644 --- a/utils/string.go +++ b/utils/string.go @@ -22,6 +22,24 @@ func RandomStringRange(len int, str string) string { return res } +func ChunkString(s string, chunkSize int) []string { + var chunks []string + runes := []rune(s) + + if len(runes) == 0 { + return []string{s} + } + + for i := 0; i < len(runes); i += chunkSize { + nn := i + chunkSize + if nn > len(runes) { + nn = len(runes) + } + chunks = append(chunks, string(runes[i:nn])) + } + return chunks +} + func ChineseLength(str string, limit int) int { sum := 0 for _, r := range []rune(str) {