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

fix group sync.

This commit is contained in:
Mrs4s 2020-08-20 02:55:37 +08:00
parent 3561e5f156
commit 8d1e5fb04c
2 changed files with 34 additions and 22 deletions

View File

@ -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)

View File

@ -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)