diff --git a/server/imserver/guildmgr.go b/server/imserver/guildmgr.go index b78fd239..464fd114 100644 --- a/server/imserver/guildmgr.go +++ b/server/imserver/guildmgr.go @@ -21,6 +21,8 @@ type GuildMgr struct { pendingReqs map[int64]map[string]bool // 公会ID -> 申请者账户ID -> bool Logs map[int64][]*GuildLog // 公会ID -> 公会日志 loadedFlags int64 + guildIds []int64 // 公会ids + //RandGuildIds []int64 // 随机公会ids } func NewGuildMgr() *GuildMgr { @@ -45,11 +47,12 @@ func (gm *GuildMgr) loadFromDB() { gm.loadGuildFromDB() // 加载公会成员 gm.loadGuildMemberFromDB() - //// 加载公会申请者列表 + // 加载公会申请者列表 gm.loadPendingReqsFromDB() - //// 加载公会日志 + // 加载公会日志 gm.loadGuildLogsFromDB() - + // 加载公会ids + gm.loadGuildIds() //for gm.loadedFlags != 0 { // time.Sleep(time.Millisecond * 1000) //} @@ -82,8 +85,8 @@ func (gm *GuildMgr) CreateGuild(name string, leaderId string) (int64, error) { gm.createGuildDB(guild) gm.upsertGuildMember(guildId, &newMember) - gm.Guilds[guildId] = guild + gm.addGuildIds(guildId) return guildId, nil } @@ -422,37 +425,35 @@ func (gm *GuildMgr) GetLogs(guildID int64) []*GuildLog { } // SearchGuilds 根据关键字搜索公会 -func (gm *GuildMgr) SearchGuilds(keyword string) []Guild { - var results []Guild +func (gm *GuildMgr) SearchGuilds(keyword string) []*Guild { + var results []*Guild for _, guild := range gm.Guilds { if containsSubstring(guild.Name, keyword) { - results = append(results, *guild) + results = append(results, guild) } } return results } // RandomGuilds 随机10个公会 -func (gm *GuildMgr) RandomGuilds() []Guild { - guildCount := RandomGuildCount +func (gm *GuildMgr) RandomGuilds() []*Guild { count := len(gm.Guilds) - if count <= guildCount { - guildCount = count + + var results []*Guild + if count <= RandomGuildCount { + for _, guildId := range gm.guildIds { + results = append(results, gm.Guilds[guildId]) + } + return results } - guildSlice := make([]*Guild, 0, count) - for _, guild := range gm.Guilds { - guildSlice = append(guildSlice, guild) + for i := 0; i < RandomGuildCount; i++ { + j := rand.Intn(len(gm.guildIds)) + gm.guildIds[i], gm.guildIds[j] = gm.guildIds[j], gm.guildIds[i] } - - for i := 0; i < guildCount; i++ { - j := rand.Intn(len(guildSlice)) - guildSlice[i], guildSlice[j] = guildSlice[j], guildSlice[i] - } - - var results []Guild - for i := 0; i < guildCount; i++ { - results = append(results, *guildSlice[i]) + for i := 0; i < RandomGuildCount; i++ { + randGuildId := gm.guildIds[i] + results = append(results, gm.Guilds[randGuildId]) } return results } @@ -514,6 +515,17 @@ func (gm *GuildMgr) GetGuildIdByAccountId(accountId string) int64 { return 0 } +func (gm *GuildMgr) loadGuildIds() { + gm.guildIds = make([]int64, 0, len(gm.Guilds)) + for guildId, _ := range gm.Guilds { + gm.guildIds = append(gm.guildIds, guildId) + } +} + +func (gm *GuildMgr) addGuildIds(guildId int64) { + gm.guildIds = append(gm.guildIds, guildId) +} + func containsSubstring(s, substr string) bool { return len(s) >= len(substr) && s[len(s)-len(substr):] == substr } diff --git a/server/imserver/player.go b/server/imserver/player.go index 421ed124..b4edade2 100644 --- a/server/imserver/player.go +++ b/server/imserver/player.go @@ -472,7 +472,7 @@ func (p *Player) CMSearchGuilds(hdr *f5.MsgHdr, msg *cs.CMSearchGuilds) { } // FillGuild 填充公共列表 -func (p *Player) FillGuild(guilds []Guild) []*cs.MFGuild { +func (p *Player) FillGuild(guilds []*Guild) []*cs.MFGuild { var resGuilds []*cs.MFGuild for _, g := range guilds { members := q5.ToInt32(len(g.Members))