1
0
mirror of https://github.com/Mrs4s/MiraiGo.git synced 2025-05-04 11:07:40 +08:00

fix group fragmented message parse error.

This commit is contained in:
Mrs4s 2020-07-16 20:03:13 +08:00
parent 90633fd3e7
commit 6b4afcf5d7
5 changed files with 682 additions and 632 deletions

View File

@ -54,6 +54,7 @@ type QQClient struct {
lastMessageSeq int32
lastMessageSeqTmp sync.Map
groupMsgBuilders sync.Map
onlinePushCache []int16 // reset on reconnect
requestPacketRequestId int32
messageSeq int32

View File

@ -229,7 +229,7 @@ func decodeMessageSvcPacket(c *QQClient, _ uint16, payload []byte) (interface{},
return nil, err
}
func decodeGroupMessagePacket(c *QQClient, _ uint16, payload []byte) (interface{}, error) {
func decodeGroupMessagePacket(c *QQClient, seq uint16, payload []byte) (interface{}, error) {
pkt := msg.PushMessagePacket{}
err := proto.Unmarshal(payload, &pkt)
if err != nil {
@ -242,6 +242,25 @@ func decodeGroupMessagePacket(c *QQClient, _ uint16, payload []byte) (interface{
})
return nil, nil
}
if pkt.Message.Content.PkgNum > 1 {
var builder *groupMessageBuilder
i, ok := c.groupMsgBuilders.Load(pkt.Message.Content.DivSeq)
if !ok {
builder = &groupMessageBuilder{
MessageSeq: pkt.Message.Content.DivSeq,
MessageCount: pkt.Message.Content.PkgNum,
}
c.groupMsgBuilders.Store(pkt.Message.Content.DivSeq, builder)
} else {
builder = i.(*groupMessageBuilder)
}
builder.MessageSlices = append(builder.MessageSlices, pkt.Message)
if int32(len(builder.MessageSlices)) >= builder.MessageCount {
c.groupMsgBuilders.Delete(pkt.Message.Content.DivSeq)
c.dispatchGroupMessage(c.parseGroupMessage(builder.build()))
}
return nil, nil
}
c.dispatchGroupMessage(c.parseGroupMessage(pkt.Message))
return nil, nil
}

View File

@ -8,6 +8,7 @@ import (
"github.com/Mrs4s/MiraiGo/message"
"google.golang.org/protobuf/proto"
"math/rand"
"sort"
)
type DeviceInfo struct {
@ -44,6 +45,12 @@ type Version struct {
Sdk uint32
}
type groupMessageBuilder struct {
MessageSeq int32
MessageCount int32
MessageSlices []*msg.Message
}
var SystemDeviceInfo = &DeviceInfo{
Display: []byte("MIRAI.123456.001"),
Product: []byte("mirai"),
@ -227,3 +234,14 @@ func parseMessageElems(elems []*msg.Elem) []message.IMessageElement {
}
return res
}
func (b *groupMessageBuilder) build() *msg.Message {
sort.Slice(b.MessageSlices, func(i, j int) bool {
return b.MessageSlices[i].Content.PkgIndex < b.MessageSlices[i].Content.PkgIndex
})
base := b.MessageSlices[0]
for _, m := range b.MessageSlices[1:] {
base.Body.RichText.Elems = append(base.Body.RichText.Elems, m.Body.RichText.Elems...)
}
return base
}

File diff suppressed because it is too large Load Diff

View File

@ -109,6 +109,7 @@ message UinPairMessage {
message Message {
MessageHead head = 1;
ContentHead content = 2;
MessageBody body = 3;
}