From b87fc53213542681bddf70b0bc104e6c528e0d44 Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Thu, 10 Dec 2020 01:57:34 +0800 Subject: [PATCH] fix group member join event. --- client/decoders.go | 31 ++++++++++++++++--------------- client/global.go | 24 ++++++++++++++++-------- 2 files changed, 32 insertions(+), 23 deletions(-) diff --git a/client/decoders.go b/client/decoders.go index d48afb81..5339ff1f 100644 --- a/client/decoders.go +++ b/client/decoders.go @@ -758,23 +758,25 @@ func decodeOnlinePushReqPacket(c *QQClient, seq uint16, payload []byte) (interfa if s44.GroupSyncMsg.GetGrpCode() != 0 { // member sync c.Debug("syncing members.") if group := c.FindGroup(s44.GroupSyncMsg.GetGrpCode()); group != nil { - var lastJoinTime int64 = 0 - for _, m := range group.Members { - if lastJoinTime < m.JoinTime { - lastJoinTime = m.JoinTime - } - } - if newMem, err := c.GetGroupMembers(group); err == nil { - group.Members = newMem - for _, m := range newMem { + group.Update(func(_ *GroupInfo) { + var lastJoinTime int64 = 0 + for _, m := range group.Members { if lastJoinTime < m.JoinTime { - c.dispatchNewMemberEvent(&MemberJoinGroupEvent{ - Group: group, - Member: m, - }) + lastJoinTime = m.JoinTime } } - } + if newMem, err := c.GetGroupMembers(group); err == nil { + group.Members = newMem + for _, m := range newMem { + if lastJoinTime < m.JoinTime { + go c.dispatchNewMemberEvent(&MemberJoinGroupEvent{ + Group: group, + Member: m, + }) + } + } + } + }) } } }() @@ -782,7 +784,6 @@ func decodeOnlinePushReqPacket(c *QQClient, seq uint16, payload []byte) (interfa } } } - return nil, nil } diff --git a/client/global.go b/client/global.go index 778e6edf..21e1cc0e 100644 --- a/client/global.go +++ b/client/global.go @@ -450,16 +450,24 @@ func (c *QQClient) parseGroupMessage(m *msg.Message) *message.GroupMessage { } else { mem := group.FindMember(m.Head.GetFromUin()) if mem == nil { - info, _ := c.getMemberInfo(group.Code, m.Head.GetFromUin()) - if info == nil { + group.Update(func(_ *GroupInfo) { + if mem = group.FindMember(m.Head.GetFromUin()); mem != nil { + return + } + info, _ := c.getMemberInfo(group.Code, m.Head.GetFromUin()) + if info == nil { + return + } + mem = info + group.Members = append(group.Members, mem) + go c.dispatchNewMemberEvent(&MemberJoinGroupEvent{ + Group: group, + Member: info, + }) + }) + if mem == nil { return nil } - mem = info - group.Members = append(group.Members, mem) - go c.dispatchNewMemberEvent(&MemberJoinGroupEvent{ - Group: group, - Member: info, - }) } sender = &message.Sender{ Uin: mem.Uin,