diff --git a/server/imserver/constant.go b/server/imserver/constant.go index 0667578f..8b1b203c 100644 --- a/server/imserver/constant.go +++ b/server/imserver/constant.go @@ -105,6 +105,7 @@ const ( ERR_CODE_SEARCH_USERS_DB_FAIL = 11013 ERR_CODE_SEARCH_USER_DB_RESULT_IS_NULL = 11014 ERR_CODE_SEARCH_USER_DB_FAIL = 11015 + ERR_CODE_SEARCH_NO_RESULT = 11016 // Guild ERR_CODE_GUILD_NO_EXISTS = 10001 diff --git a/server/imserver/friendsdbmgr.go b/server/imserver/friendsdbmgr.go index 017c1efc..182deaf1 100644 --- a/server/imserver/friendsdbmgr.go +++ b/server/imserver/friendsdbmgr.go @@ -141,7 +141,7 @@ func (fm *FriendsMgr) findUsersByUsername(username string, sinceId int64, cb fun return } lastId := sinceId - profiles := make([]*PlayerProfile, 0, 20) + profiles := make([]*PlayerProfile, 0, MaxSearchResults) for rows.Next() { autoId := q5.ToInt64(*rows.GetByIndex(0)) if autoId > lastId { diff --git a/server/imserver/guilddbmgr.go b/server/imserver/guilddbmgr.go index e729abe4..82543513 100644 --- a/server/imserver/guilddbmgr.go +++ b/server/imserver/guilddbmgr.go @@ -393,3 +393,38 @@ func (gm *GuildMgr) insertGuildLog(log *GuildLog) { f5.GetSysLog().Info("rowsAffected:%d\n", rowsAffected) }) } + +func (gm *GuildMgr) findGuildIdsByName(sinceId int64, name string, cb func(err error, lastId int64, guildIds []int64)) { + fields := []string{"idx", "guild_id"} + var where [][]string + nameLike := fmt.Sprintf("%%%s%%", name) + likeWhere := [][]string{ + {"name", nameLike}, + } + f5.GetJsStyleDb().SelectLike( + FRIEND_DB, + "t_guild", + fields, + where, + likeWhere, + sinceId, + MaxSearchResults, + func(err error, rows *f5.DataSet) { + if err != nil { + cb(err, 0, nil) + return + } + lastId := sinceId + ids := make([]int64, 0, MaxSearchResults) + for rows.Next() { + autoId := q5.ToInt64(*rows.GetByIndex(0)) + if lastId < autoId { + lastId = autoId + } + guildId := q5.ToInt64(*rows.GetByIndex(1)) + ids = append(ids, guildId) + } + cb(nil, lastId, ids) + }, + ) +} diff --git a/server/imserver/guildmgr.go b/server/imserver/guildmgr.go index bb07da69..5c815ef0 100644 --- a/server/imserver/guildmgr.go +++ b/server/imserver/guildmgr.go @@ -884,15 +884,18 @@ func (gm *GuildMgr) GetLogs(guildID int64) []*GuildLog { return gm.guildLogs[guildID] } -// SearchGuilds 根据关键字搜索公会 -func (gm *GuildMgr) SearchGuilds(sinceId int64, name string) []*Guild { - var results []*Guild - for _, guild := range gm.guilds { - if containsSubstring(guild.Name, name) { - results = append(results, guild) +// SearchGuild 根据关键字搜索公会 +func (gm *GuildMgr) SearchGuild(sinceId int64, name string, cb func(errCode int32, errMsg string, lastId int64, guildIds []int64)) { + gm.findGuildIdsByName(sinceId, name, func(err error, lastId int64, guildIds []int64) { + if err != nil { + cb(ERR_CODE_SEARCH_USERS_DB_FAIL, "SearchUsers username db error", sinceId, guildIds) + return } - } - return results + if len(guildIds) <= 0 { + cb(ERR_CODE_SEARCH_NO_RESULT, "SearchGuilds result is empty", lastId, guildIds) + } + cb(0, "OK", lastId, guildIds) + }) } // RandomGuilds 随机10个公会 @@ -1001,7 +1004,3 @@ func (gm *GuildMgr) GetGuildLogs(guildId int64) []*GuildLog { } return nil } - -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 b59caa14..7868873d 100644 --- a/server/imserver/player.go +++ b/server/imserver/player.go @@ -343,7 +343,7 @@ func (p *Player) CMGuildInfo(hdr *f5.MsgHdr, msg *cs.CMGuildInfo) { guild := guildMgr.GetGuildByAccountId(p.accountId) if guild == nil { rspMsg.Guild = nil - rspMsg.RandomGuilds = p.FillGuilds(guildMgr.RandomGuilds()) + rspMsg.RandomGuilds = p.FillMFGuilds(guildMgr.RandomGuilds()) wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg) return } @@ -628,7 +628,6 @@ func (p *Player) CMGuildMembersList(hdr *f5.MsgHdr, msg *cs.CMGuildMembersList) } } } - wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg) } @@ -636,10 +635,22 @@ func (p *Player) CMGuildMembersList(hdr *f5.MsgHdr, msg *cs.CMGuildMembersList) func (p *Player) CMSearchGuilds(hdr *f5.MsgHdr, msg *cs.CMSearchGuilds) { sinceId := msg.GetSinceId() name := msg.GetName() - rspMsg := new(cs.SMSearchGuilds) - rspMsg.Guilds = p.FillGuilds(guildMgr.SearchGuilds(sinceId, name)) - f5.GetSysLog().Info("CMSearchGuilds name[%s], result:%d \n", msg.GetName(), len(rspMsg.Guilds)) - wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg) + guildMgr.SearchGuild(sinceId, name, func(errCode int32, errMsg string, lastId int64, guildIds []int64) { + rspMsg := new(cs.SMSearchGuilds) + if errCode != 0 { + rspMsg.Errcode = &errCode + rspMsg.Errmsg = &errMsg + } else { + for _, guildId := range guildIds { + guild := guildMgr.GetGuild(guildId) + if guild != nil { + rspMsg.Guilds = append(rspMsg.Guilds, p.FillMFGuild(guild)) + } + } + } + f5.GetSysLog().Info("CMSearchGuilds since:%, name[%s], result:%d \n", sinceId, msg.GetName(), len(rspMsg.Guilds)) + wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg) + }) } // CMGuildLogs 请求公会日志 @@ -710,8 +721,8 @@ func (p *Player) FillMFGuild(guild *Guild) *cs.MFGuild { return resGuild } -// FillGuilds 填充公会列表 -func (p *Player) FillGuilds(guilds []*Guild) []*cs.MFGuild { +// FillMFGuilds 填充公会列表 +func (p *Player) FillMFGuilds(guilds []*Guild) []*cs.MFGuild { var resGuilds []*cs.MFGuild for _, g := range guilds { guild := p.FillMFGuild(g)