1
0
mirror of https://github.com/Mrs4s/MiraiGo.git synced 2025-05-04 11:07:40 +08:00

feat: get group member with binary search

This commit is contained in:
wdvxdr 2021-04-07 22:12:52 +08:00
parent 5ec6c651b7
commit cde0aab5ab
No known key found for this signature in database
GPG Key ID: 55FF1414A69CEBA6
4 changed files with 25 additions and 11 deletions

View File

@ -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,

View File

@ -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:]...)
})
}

View File

@ -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)) {

View File

@ -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,