From 47d4fdde60aca39dfbcbf8861d5e5baabbd77c70 Mon Sep 17 00:00:00 2001 From: Mrs4s <1844812067@qq.com> Date: Mon, 17 Aug 2020 22:21:35 +0800 Subject: [PATCH] fix Mrs4s/go-cqhttp#125 --- client/client.go | 6 ++++-- client/decoders.go | 17 ++++++++--------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/client/client.go b/client/client.go index 170b3222..1aaea009 100644 --- a/client/client.go +++ b/client/client.go @@ -59,11 +59,12 @@ type QQClient struct { sigInfo *loginSigInfo pwdFlag bool - lastMessageSeq int32 - lastMessageSeqTmp sync.Map + lastMessageSeq int32 + //lastMessageSeqTmp sync.Map lastLostMsg string groupMsgBuilders sync.Map onlinePushCache []int16 // reset on reconnect + msgSvcCache *utils.Cache requestPacketRequestId int32 groupSeq int32 friendSeq int32 @@ -139,6 +140,7 @@ func NewClientMd5(uin int64, passwordMd5 [16]byte) *QQClient { ksid: []byte("|454001228437590|A8.2.7.27f6ea96"), eventHandlers: &eventHandlers{}, groupListLock: new(sync.Mutex), + msgSvcCache: utils.NewCache(time.Second * 5), } rand.Read(cli.RandomKey) return cli diff --git a/client/decoders.go b/client/decoders.go index c18242a3..bceb087b 100644 --- a/client/decoders.go +++ b/client/decoders.go @@ -165,6 +165,13 @@ func decodeMessageSvcPacket(c *QQClient, _ uint16, payload []byte) (interface{}, if message.Head.ToUin != c.Uin { continue } + if message.Head.MsgType != 166 { + strSeq := strconv.FormatInt(int64(message.Head.MsgSeq), 10) + if _, ok := c.msgSvcCache.Get(strSeq); ok { + continue + } + c.msgSvcCache.Add(strSeq, 0, time.Minute*15) + } switch message.Head.MsgType { case 33: // 加群同步 groupJoinLock.Lock() @@ -210,15 +217,7 @@ func decodeMessageSvcPacket(c *QQClient, _ uint16, payload []byte) (interface{}, if mem == nil || message.Head.FromUin == c.Uin { continue } - lastSeq, ok := c.lastMessageSeqTmp.Load(mem.Uin) - if !ok { - c.lastMessageSeqTmp.Store(mem.Uin, int32(-1)) - lastSeq = int32(-1) - } - if message.Head.MsgSeq > lastSeq.(int32) { - c.lastMessageSeqTmp.Store(mem.Uin, message.Head.MsgSeq) - c.dispatchTempMessage(c.parseTempMessage(message)) - } + c.dispatchTempMessage(c.parseTempMessage(message)) case 166: // 好友消息 if message.Head.FromUin == c.Uin { for {