From cde0aab5abe1f889bd89538540708c3da294ab82 Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Wed, 7 Apr 2021 22:12:52 +0800 Subject: [PATCH] feat: get group member with binary search --- client/c2c_processor.go | 1 + client/client.go | 14 +++++++++----- client/group_info.go | 20 ++++++++++++++------ client/group_msg.go | 1 + 4 files changed, 25 insertions(+), 11 deletions(-) diff --git a/client/c2c_processor.go b/client/c2c_processor.go index d0073bc8..fe8e06dd 100644 --- a/client/c2c_processor.go +++ b/client/c2c_processor.go @@ -225,6 +225,7 @@ func troopAddMemberBroadcastDecoder(c *QQClient, pMsg *msg.Message, _ *incomingP } group.Update(func(info *GroupInfo) { info.Members = append(info.Members, mem) + info.sort() }) c.dispatchNewMemberEvent(&MemberJoinGroupEvent{ Group: group, diff --git a/client/client.go b/client/client.go index 8bded8d0..f0817d4e 100644 --- a/client/client.go +++ b/client/client.go @@ -675,6 +675,9 @@ func (c *QQClient) GetGroupMembers(group *GroupInfo) ([]*GroupMemberInfo, error) } list = append(list, rsp.list...) if nextUin == 0 { + sort.Slice(list, func(i, j int) bool { + return list[i].Uin < list[j].Uin + }) return list, nil } } @@ -813,12 +816,13 @@ func (c *QQClient) kickGroupMember(groupCode, memberUin int64, msg string, block func (g *GroupInfo) removeMember(uin int64) { g.Update(func(info *GroupInfo) { - for i, m := range info.Members { - if m.Uin == uin { - info.Members = append(info.Members[:i], info.Members[i+1:]...) - break - } + i := sort.Search(len(info.Members), func(i int) bool { + return info.Members[i].Uin >= uin + }) + if i >= len(info.Members) || info.Members[i].Uin != uin { // not found + return } + info.Members = append(info.Members[:i], info.Members[i+1:]...) }) } diff --git a/client/group_info.go b/client/group_info.go index 504ea274..572662a7 100644 --- a/client/group_info.go +++ b/client/group_info.go @@ -4,6 +4,7 @@ import ( "fmt" "math/rand" "net/url" + "sort" "strings" "sync" @@ -329,13 +330,20 @@ func (g *GroupInfo) FindMember(uin int64) *GroupMemberInfo { } func (g *GroupInfo) FindMemberWithoutLock(uin int64) *GroupMemberInfo { - for _, m := range g.Members { - f := m - if f.Uin == uin { - return f - } + i := sort.Search(len(g.Members), func(i int) bool { + return g.Members[i].Uin >= uin + }) + if i >= len(g.Members) || g.Members[i].Uin != uin { + return nil } - return nil + return g.Members[i] +} + +// sort call this method must hold the lock +func (g *GroupInfo) sort() { + sort.Slice(g.Members, func(i, j int) bool { + return g.Members[i].Uin < g.Members[j].Uin + }) } func (g *GroupInfo) Update(f func(*GroupInfo)) { diff --git a/client/group_msg.go b/client/group_msg.go index baefd7ef..7214fda5 100644 --- a/client/group_msg.go +++ b/client/group_msg.go @@ -472,6 +472,7 @@ func (c *QQClient) parseGroupMessage(m *msg.Message) *message.GroupMessage { } mem = info group.Members = append(group.Members, mem) + group.sort() go c.dispatchNewMemberEvent(&MemberJoinGroupEvent{ Group: group, Member: info,