From 9fca2495b1e55618a5ec9c49e048b9d70f187428 Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Wed, 2 Dec 2020 20:16:33 +0800 Subject: [PATCH] fix fragmented msg recall. --- client/global.go | 13 +++++++------ client/recall.go | 23 +++++++++++++++++++++++ message/message.go | 15 ++++++++------- 3 files changed, 38 insertions(+), 13 deletions(-) diff --git a/client/global.go b/client/global.go index 038992f0..2b3838fb 100644 --- a/client/global.go +++ b/client/global.go @@ -470,12 +470,13 @@ func (c *QQClient) parseGroupMessage(m *msg.Message) *message.GroupMessage { } var g *message.GroupMessage g = &message.GroupMessage{ - Id: m.Head.GetMsgSeq(), - GroupCode: group.Code, - GroupName: string(m.Head.GroupInfo.GroupName), - Sender: sender, - Time: m.Head.GetMsgTime(), - Elements: message.ParseMessageElems(m.Body.RichText.Elems), + Id: m.Head.GetMsgSeq(), + GroupCode: group.Code, + GroupName: string(m.Head.GroupInfo.GroupName), + Sender: sender, + Time: m.Head.GetMsgTime(), + Elements: message.ParseMessageElems(m.Body.RichText.Elems), + OriginalObject: m, } var extInfo *msg.ExtraInfo // pre parse diff --git a/client/recall.go b/client/recall.go index 354e62d2..e1db8b86 100644 --- a/client/recall.go +++ b/client/recall.go @@ -2,6 +2,7 @@ package client import ( "github.com/Mrs4s/MiraiGo/client/pb/msg" + "github.com/Mrs4s/MiraiGo/message" "github.com/Mrs4s/MiraiGo/protocol/packets" "github.com/pkg/errors" "google.golang.org/protobuf/proto" @@ -10,10 +11,32 @@ import ( // 撤回相关处理逻辑 func (c *QQClient) RecallGroupMessage(groupCode int64, msgId, msgInternalId int32) error { + if m, _ := c.GetGroupMessages(groupCode, int64(msgId), int64(msgId)); len(m) > 0 { + content := m[0].OriginalObject.Content + if content.GetPkgNum() > 1 { + if m, err := c.GetGroupMessages(groupCode, int64(msgId-content.GetPkgIndex()-1), int64(msgId+(content.GetPkgNum()-content.GetPkgIndex()+1))); err == nil { + if flag, _ := c.internalGroupRecall(groupCode, msgInternalId, m); flag { + return nil + } + } + } + } _, err := c.sendAndWait(c.buildGroupRecallPacket(groupCode, msgId, msgInternalId)) return err } +func (c *QQClient) internalGroupRecall(groupCode int64, msgInternalId int32, m []*message.GroupMessage) (flag bool, err error) { + for _, item := range m { + if item.InternalId == msgInternalId { + flag = true + if _, err := c.sendAndWait(c.buildGroupRecallPacket(groupCode, item.Id, item.InternalId)); err != nil { + return false, err + } + } + } + return flag, nil +} + func (c *QQClient) RecallPrivateMessage(uin, ts int64, msgId, msgInternalId int32) error { _, err := c.sendAndWait(c.buildPrivateRecallPacket(uin, ts, msgId, msgInternalId)) return err diff --git a/message/message.go b/message/message.go index ab7b1b13..f419e0b9 100644 --- a/message/message.go +++ b/message/message.go @@ -34,13 +34,14 @@ type ( } GroupMessage struct { - Id int32 - InternalId int32 - GroupCode int64 - GroupName string - Sender *Sender - Time int32 - Elements []IMessageElement + Id int32 + InternalId int32 + GroupCode int64 + GroupName string + Sender *Sender + Time int32 + Elements []IMessageElement + OriginalObject *msg.Message //OriginalElements []*msg.Elem }