diff --git a/client/client.go b/client/client.go index a6344371..ba1a8123 100644 --- a/client/client.go +++ b/client/client.go @@ -64,6 +64,7 @@ type QQClient struct { lastMessageSeq int32 //lastMessageSeqTmp sync.Map msgSvcCache *utils.Cache + transCache *utils.Cache lastLostMsg string groupMsgBuilders sync.Map onlinePushCache []int16 // reset on reconnect @@ -143,7 +144,8 @@ 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), + msgSvcCache: utils.NewCache(time.Second * 15), + transCache: utils.NewCache(time.Second * 15), } rand.Read(cli.RandomKey) return cli @@ -905,7 +907,7 @@ func (c *QQClient) sendAndWait(seq uint16, pkt []byte) (interface{}, error) { select { case rsp := <-ch: return rsp.Response, rsp.Error - case <-time.After(time.Second * 15): + case <-time.After(time.Second * 30): retry++ if retry < 2 { _ = c.send(pkt) diff --git a/client/decoders.go b/client/decoders.go index d7e93be6..cf505b2c 100644 --- a/client/decoders.go +++ b/client/decoders.go @@ -592,6 +592,11 @@ func decodeOnlinePushTransPacket(c *QQClient, _ uint16, payload []byte) (interfa return nil, err } data := binary.NewReader(info.MsgData) + idStr := strconv.FormatInt(info.MsgUid, 10) + if _, ok := c.transCache.Get(idStr); ok { + return nil, nil + } + c.transCache.Add(idStr, "", time.Second*15) if info.MsgType == 34 { data.ReadInt32() data.ReadByte() @@ -599,37 +604,42 @@ func decodeOnlinePushTransPacket(c *QQClient, _ uint16, payload []byte) (interfa typ := int32(data.ReadByte()) operator := int64(uint32(data.ReadInt32())) if g := c.FindGroupByUin(info.FromUin); g != nil { + groupLeaveLock.Lock() + defer groupLeaveLock.Unlock() switch typ { + case 0x02: + if target == c.Uin { + c.dispatchLeaveGroupEvent(&GroupLeaveEvent{Group: g}) + } else { + if m := g.FindMember(target); m != nil { + g.removeMember(target) + c.dispatchMemberLeaveEvent(&MemberLeaveGroupEvent{ + Group: g, + Member: m, + }) + } + } case 0x03: - groupLeaveLock.Lock() - defer groupLeaveLock.Unlock() if err = c.ReloadGroupList(); err != nil { return nil, err } - c.dispatchLeaveGroupEvent(&GroupLeaveEvent{ - Group: g, - Operator: g.FindMember(operator), - }) - case 0x82: - if m := g.FindMember(target); m != nil { - g.removeMember(m.Uin) - c.dispatchMemberLeaveEvent(&MemberLeaveGroupEvent{ - Group: g, - Member: m, - }) - } - case 0x83: - if m := g.FindMember(target); m != nil { - g.removeMember(m.Uin) - c.dispatchMemberLeaveEvent(&MemberLeaveGroupEvent{ + if target == c.Uin { + c.dispatchLeaveGroupEvent(&GroupLeaveEvent{ Group: g, - Member: m, Operator: g.FindMember(operator), }) + } else { + if m := g.FindMember(target); m != nil { + g.removeMember(target) + c.dispatchMemberLeaveEvent(&MemberLeaveGroupEvent{ + Group: g, + Member: m, + Operator: g.FindMember(operator), + }) + } } } } - } if info.MsgType == 44 { data.ReadBytes(5)