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:
parent
3561e5f156
commit
8d1e5fb04c
@ -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)
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user