From cc2ce301a364590e9ae3f1781f86ba993bc323b1 Mon Sep 17 00:00:00 2001 From: Mrs4s <1844812067@qq.com> Date: Tue, 14 Jul 2020 03:12:20 +0800 Subject: [PATCH] fix issue of repeatedly trigger for LeaveGroupEvent. --- client/client.go | 4 ++-- client/decoders.go | 8 +++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/client/client.go b/client/client.go index 5c48c064..7adcdcbf 100644 --- a/client/client.go +++ b/client/client.go @@ -262,6 +262,8 @@ func (c *QQClient) UploadGroupImage(groupUin int64, img []byte) (*message.GroupI } func (c *QQClient) ReloadGroupList() error { + c.groupListLock.Lock() + defer c.groupListLock.Unlock() list, err := c.GetGroupList() if err != nil { return err @@ -271,8 +273,6 @@ func (c *QQClient) ReloadGroupList() error { } func (c *QQClient) GetGroupList() ([]*GroupInfo, error) { - c.groupListLock.Lock() - defer c.groupListLock.Unlock() rsp, err := c.sendAndWait(c.buildGroupListRequestPacket()) if err != nil { return nil, err diff --git a/client/decoders.go b/client/decoders.go index 49ded81c..6d904b45 100644 --- a/client/decoders.go +++ b/client/decoders.go @@ -12,7 +12,8 @@ import ( ) var ( - groupJoinLock = new(sync.Mutex) + groupJoinLock = new(sync.Mutex) + groupLeaveLock = new(sync.Mutex) ) func decodeLoginResponse(c *QQClient, seq uint16, payload []byte) (interface{}, error) { @@ -395,12 +396,15 @@ func decodeOnlinePushReqPacket(c *QQClient, seq uint16, payload []byte) (interfa if err := proto.Unmarshal(probuf, &d4); err != nil { return nil, err } + groupLeaveLock.Lock() if g := c.FindGroup(d4.Uin); g != nil { if err := c.ReloadGroupList(); err != nil { + groupLeaveLock.Unlock() return nil, err } c.dispatchLeaveGroupEvent(&GroupLeaveEvent{Group: g}) } + groupLeaveLock.Unlock() } } } @@ -423,6 +427,8 @@ func decodeOnlinePushTransPacket(c *QQClient, seq uint16, payload []byte) (inter operator := int64(uint32(data.ReadInt32())) switch typ { case 0x03: + groupLeaveLock.Lock() + defer groupLeaveLock.Unlock() if g := c.FindGroup(info.FromUin); g != nil { if err = c.ReloadGroupList(); err != nil { return nil, err