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
|
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)
|
||||||
|
@ -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,37 +604,42 @@ 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 {
|
||||||
|
groupLeaveLock.Lock()
|
||||||
|
defer groupLeaveLock.Unlock()
|
||||||
switch typ {
|
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:
|
case 0x03:
|
||||||
groupLeaveLock.Lock()
|
|
||||||
defer groupLeaveLock.Unlock()
|
|
||||||
if err = c.ReloadGroupList(); err != nil {
|
if err = c.ReloadGroupList(); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
c.dispatchLeaveGroupEvent(&GroupLeaveEvent{
|
if target == c.Uin {
|
||||||
Group: g,
|
c.dispatchLeaveGroupEvent(&GroupLeaveEvent{
|
||||||
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{
|
|
||||||
Group: g,
|
Group: g,
|
||||||
Member: m,
|
|
||||||
Operator: g.FindMember(operator),
|
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 {
|
if info.MsgType == 44 {
|
||||||
data.ReadBytes(5)
|
data.ReadBytes(5)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user