From f584f21b8139ff3ae34897d4451648c337bf3002 Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Fri, 12 Mar 2021 17:06:31 +0800 Subject: [PATCH] feat: GetGroupMessages support fragmented message building. --- client/global.go | 11 +++++++++++ client/group_msg.go | 33 +++++++++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/client/global.go b/client/global.go index 24f717cb..05c46ead 100644 --- a/client/global.go +++ b/client/global.go @@ -598,6 +598,17 @@ func (p requestParams) bool(k string) bool { return i.(bool) } +func (p requestParams) int32(k string) int32 { + if p == nil { + return 0 + } + i, ok := p[k] + if !ok { + return 0 + } + return i.(int32) +} + func (c *QQClient) packOIDBPackage(cmd, serviceType int32, body []byte) []byte { pkg := &oidb.OIDBSSOPkg{ Command: cmd, diff --git a/client/group_msg.go b/client/group_msg.go index baf58b8a..e2162011 100644 --- a/client/group_msg.go +++ b/client/group_msg.go @@ -82,7 +82,8 @@ func (c *QQClient) SendGroupForwardMessage(groupCode int64, m *message.ForwardMe // GetGroupMessages 从服务器获取历史信息 func (c *QQClient) GetGroupMessages(groupCode, beginSeq, endSeq int64) ([]*message.GroupMessage, error) { - i, err := c.sendAndWait(c.buildGetGroupMsgRequest(groupCode, beginSeq, endSeq)) + seq, pkt := c.buildGetGroupMsgRequest(groupCode, beginSeq, endSeq) + i, err := c.sendAndWait(seq, pkt, requestParams{"raw": false}) if err != nil { return nil, err } @@ -356,7 +357,7 @@ func decodeMsgSendResponse(c *QQClient, _ *incomingPacketInfo, payload []byte) ( return nil, nil } -func decodeGetGroupMsgResponse(c *QQClient, _ *incomingPacketInfo, payload []byte) (interface{}, error) { +func decodeGetGroupMsgResponse(c *QQClient, info *incomingPacketInfo, payload []byte) (interface{}, error) { rsp := msg.GetGroupMsgResp{} if err := proto.Unmarshal(payload, &rsp); err != nil { return nil, errors.Wrap(err, "failed to unmarshal protobuf message") @@ -370,6 +371,34 @@ func decodeGetGroupMsgResponse(c *QQClient, _ *incomingPacketInfo, payload []byt if m.Head.FromUin == nil { continue } + if m.Content != nil && m.Content.GetPkgNum() > 1 && !info.Params.bool("raw") { + if m.Content.GetPkgIndex() == 0 { + c.Debug("build fragmented message from history") + i := m.Head.GetMsgSeq() - m.Content.GetPkgNum() + builder := &groupMessageBuilder{} + for { + end := int32(math.Min(float64(i+19), float64(m.Head.GetMsgSeq()+m.Content.GetPkgNum()))) + seq, pkt := c.buildGetGroupMsgRequest(m.Head.GroupInfo.GetGroupCode(), int64(i), int64(end)) + data, err := c.sendAndWait(seq, pkt, requestParams{"raw": true}) + if err != nil { + return nil, errors.Wrap(err, "build fragmented message error") + } + for _, fm := range data.([]*message.GroupMessage) { + if fm.OriginalObject.Content != nil && fm.OriginalObject.Content.GetDivSeq() == m.Content.GetDivSeq() { + builder.MessageSlices = append(builder.MessageSlices, fm.OriginalObject) + } + } + if len(builder.MessageSlices) >= int(m.Content.GetPkgNum()) || data == nil { + break + } + i = end + } + if elem := c.parseGroupMessage(builder.build()); elem != nil { + ret = append(ret, elem) + } + } + continue + } if elem := c.parseGroupMessage(m); elem != nil { ret = append(ret, elem) }