From ff7a387d9d4dfe8f08e994608e782c8ac0522df2 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 23 Sep 2020 18:00:55 +0800 Subject: [PATCH] 1 --- server/rankserver/guildmgr.cc | 61 +++++++++++++++++++++++++++++++++++ server/rankserver/guildmgr.h | 4 +++ 2 files changed, 65 insertions(+) diff --git a/server/rankserver/guildmgr.cc b/server/rankserver/guildmgr.cc index 0465a6c..fb04088 100644 --- a/server/rankserver/guildmgr.cc +++ b/server/rankserver/guildmgr.cc @@ -10,6 +10,8 @@ #include "app.h" #include "jsondatamgr.h" +const size_t MAX_RANK_HUMAN_NUM = 50; + void GuildMgr::Init() { auto mysql_cluster_conf = JsonDataMgr::Instance()->GetMysqlClusterConf(); @@ -322,6 +324,7 @@ void GuildMgr::OnOneDBDone(int instance_id) a8::UdpLog::Instance()->Debug("%d db done", {instance_id}); if (load_done_) { a8::UdpLog::Instance()->Debug("all db done", {}); + GenGuildRank(); } } @@ -364,3 +367,61 @@ void GuildMgr::RefreshGuild(long long guild_id) }, guild_id); } + +void GuildMgr::GenGuildRank() +{ + auto force_rank_list = + [this] (int gameid) -> std::vector& + { + auto itr = sorted_game_guild_list_.find(gameid); + if (itr != sorted_game_guild_list_.end()) { + return itr->second; + } + sorted_game_guild_list_[gameid] = std::vector(); + return sorted_game_guild_list_[gameid]; + }; + sorted_game_guild_list_.clear(); + for (auto& pair : guild_hash_) { + auto guild = pair.second; + std::vector& rank_list = force_rank_list(guild->_gameid()); + UpdateRank(rank_list, guild); + } +} + +void GuildMgr::ResortRank(std::vector& rank_list) +{ + std::sort(rank_list.begin(), + rank_list.end(), + [] (cs::MFGuildBasic* a, cs::MFGuildBasic* b) -> bool + { + return GuildMgr::Instance()->CmpGuild(a, b); + }); +} + +void GuildMgr::UpdateRank(std::vector& rank_list, cs::MFGuildBasic* guild) +{ + if (rank_list.size() < MAX_RANK_HUMAN_NUM) { + if (std::find(rank_list.begin(), rank_list.end(), guild) == rank_list.end()) { + rank_list.push_back(guild); + ResortRank(rank_list); + } + } else { + if (CmpGuild(guild, rank_list[rank_list.size() - 1])) { + if (std::find(rank_list.begin(), rank_list.end(), guild) == rank_list.end()) { + rank_list[rank_list.size() - 1] = guild; + ResortRank(rank_list); + } + } + } +} + +bool GuildMgr::CmpGuild(cs::MFGuildBasic* a, cs::MFGuildBasic* b) +{ + if (a->guild_lv() > b->guild_lv()) { + return true; + } + if (a->guild_exp() > b->guild_exp()) { + return true; + } + return a->guild_id() > b->guild_id(); +} diff --git a/server/rankserver/guildmgr.h b/server/rankserver/guildmgr.h index 80708ef..cc8000e 100644 --- a/server/rankserver/guildmgr.h +++ b/server/rankserver/guildmgr.h @@ -27,6 +27,10 @@ class GuildMgr : public a8::Singleton void LoadGuild(int instance_id, long long last_idx); void OnOneDBDone(int instance_id); void RefreshGuild(long long guild_id); + void GenGuildRank(); + void ResortRank(std::vector& rank_list); + void UpdateRank(std::vector& rank_list, cs::MFGuildBasic* guild); + bool CmpGuild(cs::MFGuildBasic* a, cs::MFGuildBasic* b); private: bool load_done_ = false;