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:
parent
5ec6c651b7
commit
cde0aab5ab
@ -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,
|
||||||
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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)) {
|
||||||
|
@ -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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user