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 lastMessageSeq int32
//lastMessageSeqTmp sync.Map //lastMessageSeqTmp sync.Map
msgSvcCache *utils.Cache msgSvcCache *utils.Cache
transCache *utils.Cache
lastLostMsg string lastLostMsg string
groupMsgBuilders sync.Map groupMsgBuilders sync.Map
onlinePushCache []int16 // reset on reconnect onlinePushCache []int16 // reset on reconnect
@ -143,7 +144,8 @@ func NewClientMd5(uin int64, passwordMd5 [16]byte) *QQClient {
ksid: []byte("|454001228437590|A8.2.7.27f6ea96"), ksid: []byte("|454001228437590|A8.2.7.27f6ea96"),
eventHandlers: &eventHandlers{}, eventHandlers: &eventHandlers{},
groupListLock: new(sync.Mutex), 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) rand.Read(cli.RandomKey)
return cli return cli
@ -905,7 +907,7 @@ func (c *QQClient) sendAndWait(seq uint16, pkt []byte) (interface{}, error) {
select { select {
case rsp := <-ch: case rsp := <-ch:
return rsp.Response, rsp.Error return rsp.Response, rsp.Error
case <-time.After(time.Second * 15): case <-time.After(time.Second * 30):
retry++ retry++
if retry < 2 { if retry < 2 {
_ = c.send(pkt) _ = c.send(pkt)

View File

@ -592,6 +592,11 @@ func decodeOnlinePushTransPacket(c *QQClient, _ uint16, payload []byte) (interfa
return nil, err return nil, err
} }
data := binary.NewReader(info.MsgData) 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 { if info.MsgType == 34 {
data.ReadInt32() data.ReadInt32()
data.ReadByte() data.ReadByte()
@ -599,28 +604,33 @@ func decodeOnlinePushTransPacket(c *QQClient, _ uint16, payload []byte) (interfa
typ := int32(data.ReadByte()) typ := int32(data.ReadByte())
operator := int64(uint32(data.ReadInt32())) operator := int64(uint32(data.ReadInt32()))
if g := c.FindGroupByUin(info.FromUin); g != nil { if g := c.FindGroupByUin(info.FromUin); g != nil {
switch typ {
case 0x03:
groupLeaveLock.Lock() groupLeaveLock.Lock()
defer groupLeaveLock.Unlock() 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:
if err = c.ReloadGroupList(); err != nil { if err = c.ReloadGroupList(); err != nil {
return nil, err return nil, err
} }
if target == c.Uin {
c.dispatchLeaveGroupEvent(&GroupLeaveEvent{ c.dispatchLeaveGroupEvent(&GroupLeaveEvent{
Group: g, Group: g,
Operator: g.FindMember(operator), Operator: g.FindMember(operator),
}) })
case 0x82: } else {
if m := g.FindMember(target); m != nil { if m := g.FindMember(target); m != nil {
g.removeMember(m.Uin) g.removeMember(target)
c.dispatchMemberLeaveEvent(&MemberLeaveGroupEvent{
Group: g,
Member: m,
})
}
case 0x83:
if m := g.FindMember(target); m != nil {
g.removeMember(m.Uin)
c.dispatchMemberLeaveEvent(&MemberLeaveGroupEvent{ c.dispatchMemberLeaveEvent(&MemberLeaveGroupEvent{
Group: g, Group: g,
Member: m, Member: m,
@ -629,7 +639,7 @@ func decodeOnlinePushTransPacket(c *QQClient, _ uint16, payload []byte) (interfa
} }
} }
} }
}
} }
if info.MsgType == 44 { if info.MsgType == 44 {
data.ReadBytes(5) data.ReadBytes(5)