1
0
mirror of https://github.com/Mrs4s/MiraiGo.git synced 2025-05-04 19:17:38 +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) { group.Update(func(info *GroupInfo) {
info.Members = append(info.Members, mem) info.Members = append(info.Members, mem)
info.sort()
}) })
c.dispatchNewMemberEvent(&MemberJoinGroupEvent{ c.dispatchNewMemberEvent(&MemberJoinGroupEvent{
Group: group, Group: group,

View File

@ -675,6 +675,9 @@ func (c *QQClient) GetGroupMembers(group *GroupInfo) ([]*GroupMemberInfo, error)
} }
list = append(list, rsp.list...) list = append(list, rsp.list...)
if nextUin == 0 { if nextUin == 0 {
sort.Slice(list, func(i, j int) bool {
return list[i].Uin < list[j].Uin
})
return list, nil return list, nil
} }
} }
@ -813,12 +816,13 @@ func (c *QQClient) kickGroupMember(groupCode, memberUin int64, msg string, block
func (g *GroupInfo) removeMember(uin int64) { func (g *GroupInfo) removeMember(uin int64) {
g.Update(func(info *GroupInfo) { g.Update(func(info *GroupInfo) {
for i, m := range info.Members { i := sort.Search(len(info.Members), func(i int) bool {
if m.Uin == uin { 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:]...) info.Members = append(info.Members[:i], info.Members[i+1:]...)
break
}
}
}) })
} }

View File

@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"math/rand" "math/rand"
"net/url" "net/url"
"sort"
"strings" "strings"
"sync" "sync"
@ -329,13 +330,20 @@ func (g *GroupInfo) FindMember(uin int64) *GroupMemberInfo {
} }
func (g *GroupInfo) FindMemberWithoutLock(uin int64) *GroupMemberInfo { func (g *GroupInfo) FindMemberWithoutLock(uin int64) *GroupMemberInfo {
for _, m := range g.Members { i := sort.Search(len(g.Members), func(i int) bool {
f := m return g.Members[i].Uin >= uin
if f.Uin == uin { })
return f 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)) { func (g *GroupInfo) Update(f func(*GroupInfo)) {

View File

@ -472,6 +472,7 @@ func (c *QQClient) parseGroupMessage(m *msg.Message) *message.GroupMessage {
} }
mem = info mem = info
group.Members = append(group.Members, mem) group.Members = append(group.Members, mem)
group.sort()
go c.dispatchNewMemberEvent(&MemberJoinGroupEvent{ go c.dispatchNewMemberEvent(&MemberJoinGroupEvent{
Group: group, Group: group,
Member: info, Member: info,