1
This commit is contained in:
parent
d78b90b9be
commit
8a6de93be5
@ -13,11 +13,82 @@
|
||||
#include "IMListener.h"
|
||||
#include "metamgr.h"
|
||||
|
||||
const size_t MAX_RANK_HUMAN_NUM = 50;
|
||||
const size_t MAX_RANK_LIST_NUM = 50;
|
||||
const size_t MAX_SORTED_LIST_NUM = 5000;
|
||||
const char* const NAME_MAGIC_SYMBOL = "@";
|
||||
|
||||
static bool RankCmpFunc(const cs::MFGuildBasic* a, const cs::MFGuildBasic* b)
|
||||
{
|
||||
if (a->guild_lv() > b->guild_lv()) {
|
||||
return true;
|
||||
}
|
||||
if (a->guild_lv() < b->guild_lv()) {
|
||||
return false;
|
||||
}
|
||||
if (a->guild_exp() > b->guild_exp()) {
|
||||
return true;
|
||||
}
|
||||
if (a->guild_exp() < b->guild_exp()) {
|
||||
return false;
|
||||
}
|
||||
return a->guild_id() > b->guild_id();
|
||||
}
|
||||
|
||||
static bool SortedCmpFunc(const cs::MFGuildBasic* a, const cs::MFGuildBasic* b)
|
||||
{
|
||||
if (a->guild_lv() > b->guild_lv()) {
|
||||
return true;
|
||||
}
|
||||
if (a->guild_lv() < b->guild_lv()) {
|
||||
return false;
|
||||
}
|
||||
if (a->guild_exp() > b->guild_exp()) {
|
||||
return true;
|
||||
}
|
||||
if (a->guild_exp() < b->guild_exp()) {
|
||||
return false;
|
||||
}
|
||||
return a->guild_id() > b->guild_id();
|
||||
}
|
||||
|
||||
static void DbToGuildBasic(const std::vector<std::string>& row, cs::MFGuildBasic* guild)
|
||||
{
|
||||
guild->set_guild_id(a8::XValue(row[2]));
|
||||
guild->set_guild_name(row[3]);
|
||||
guild->set_guild_lv(a8::XValue(row[4]));
|
||||
guild->set_guild_exp(a8::XValue(row[5]));
|
||||
guild->set_guild_badge(a8::XValue(row[6]));
|
||||
guild->set_guild_declaration(row[8]);
|
||||
guild->set_owner_id(row[9]);
|
||||
guild->set_owner_name(row[10]);
|
||||
guild->set_owner_avatar_url(row[11]);
|
||||
guild->set_join_unlimited(a8::XValue(row[16]));
|
||||
guild->set_join_cond1(a8::XValue(row[17]));
|
||||
guild->set_join_cond2(a8::XValue(row[18]));
|
||||
guild->set__gameid(a8::XValue(row[1]));
|
||||
guild->set__channel(a8::XValue(row[21]));
|
||||
guild->set__createtime(a8::XValue(row[19]));
|
||||
guild->set__modifytime(a8::XValue(row[20]));
|
||||
guild->set_member_num(a8::XValue(row[22]));
|
||||
}
|
||||
|
||||
static std::string GenSelectGuildSql(const std::string& where)
|
||||
{
|
||||
std::string sql =
|
||||
"SELECT idx, gameid, guild_id, guild_name, guild_lv, guild_exp, guild_badge, guild_notice, "
|
||||
" guild_declaration, owner_id, owner_name, owner_avatar_url, "
|
||||
" creator_id, creator_name, creator_avatar_url, guild_status, "
|
||||
" join_unlimited, join_cond1, join_cond2, createtime, modifytime, channel, guild_member_num "
|
||||
"FROM `guild` ";
|
||||
sql += where;
|
||||
return sql;
|
||||
}
|
||||
|
||||
void GuildMgr::Init()
|
||||
{
|
||||
rank_cmp_func_ = RankCmpFunc;
|
||||
sorted_cmp_func_ = SortedCmpFunc;
|
||||
|
||||
auto mysql_cluster_conf = JsonDataMgr::Instance()->GetMysqlClusterConf();
|
||||
for (int i = 0; i < mysql_cluster_conf->Size(); ++i) {
|
||||
int instance_id = mysql_cluster_conf->At(i)->At("instance_id")->AsXValue();
|
||||
@ -84,6 +155,8 @@ void GuildMgr::__GuildCreate(f8::JsonHttpRequest* request)
|
||||
request->resp_xobj->SetVal("errmsg", "");
|
||||
a8::XObject conn = DBEngine::Instance()->GetConnInfo(guild_id);
|
||||
guild->set_member_num(1);
|
||||
guild->set__createtime(App::Instance()->nowtime);
|
||||
guild->set__modifytime(App::Instance()->nowtime);
|
||||
DBEngine::Instance()->ExecAsyncScript
|
||||
(
|
||||
conn,
|
||||
@ -223,9 +296,6 @@ void GuildMgr::__GuildUpdate(f8::JsonHttpRequest* request)
|
||||
long long guild_id = request->request.At("guild_id")->AsXValue();
|
||||
cs::MFGuildBasic* guild = GetGuildById(guild_id);
|
||||
if (guild) {
|
||||
#if 0
|
||||
guild->set_guild_name(request->request.At("guild_name")->AsXValue().GetString());
|
||||
#endif
|
||||
guild->set_guild_badge(request->request.At("guild_badge")->AsXValue());
|
||||
guild->set_guild_lv(request->request.At("guild_lv")->AsXValue());
|
||||
guild->set_guild_exp(request->request.At("guild_exp")->AsXValue());
|
||||
@ -350,7 +420,7 @@ void GuildMgr::__GuildRank(f8::JsonHttpRequest* request)
|
||||
}
|
||||
|
||||
int gameid = request->request.At("gameid")->AsXValue();
|
||||
std::vector<cs::MFGuildBasic*>* sorted_guild_list = GetGuildRank(gameid);
|
||||
a8::CommonRank<cs::MFGuildBasic>* sorted_guild_list = GetGuildRank(gameid);
|
||||
|
||||
request->resp_xobj->SetVal("errcode", 0);
|
||||
request->resp_xobj->SetVal("errmsg", "");
|
||||
@ -360,8 +430,8 @@ void GuildMgr::__GuildRank(f8::JsonHttpRequest* request)
|
||||
request->resp_xobj->SetVal("_total_count", 0);
|
||||
a8::MutableXObject* guild_list = a8::MutableXObject::NewArray();
|
||||
if (sorted_guild_list) {
|
||||
request->resp_xobj->SetVal("_total_count", sorted_guild_list->size());
|
||||
for (auto& guild : *sorted_guild_list) {
|
||||
request->resp_xobj->SetVal("_total_count", sorted_guild_list->Size());
|
||||
for (auto& guild : sorted_guild_list->GetList()) {
|
||||
a8::MutableXObject* guild_xobj = a8::MutableXObject::NewObject();
|
||||
TypeConvert::Convert(guild, guild_xobj);
|
||||
guild_list->Push(*guild_xobj);
|
||||
@ -447,7 +517,7 @@ cs::MFGuildBasic* GuildMgr::GetGuildByName(int gameid, int channel, const std::s
|
||||
return itr != name_hash_.end() ? itr->second : nullptr;
|
||||
}
|
||||
|
||||
std::vector<cs::MFGuildBasic*>* GuildMgr::GetGuildRank(int gameid)
|
||||
a8::CommonRank<cs::MFGuildBasic>* GuildMgr::GetGuildRank(int gameid)
|
||||
{
|
||||
auto itr = rank_list_.find(gameid);
|
||||
return itr != rank_list_.end() ? &itr->second : nullptr;
|
||||
@ -464,11 +534,7 @@ void GuildMgr::LoadGuild(int instance_id, long long last_idx)
|
||||
DBEngine::Instance()->ExecAsyncQuery
|
||||
(
|
||||
*JsonDataMgr::Instance()->GetMysqlConf(instance_id),
|
||||
"SELECT idx, gameid, guild_id, guild_name, guild_lv, guild_exp, guild_badge, guild_notice, "
|
||||
" guild_declaration, owner_id, owner_name, owner_avatar_url, "
|
||||
" creator_id, creator_name, creator_avatar_url, guild_status, "
|
||||
" join_unlimited, join_cond1, join_cond2, createtime, modifytime, channel, guild_member_num "
|
||||
"FROM `guild` WHERE idx > %d;",
|
||||
GenSelectGuildSql("WHERE idx > %d;").c_str(),
|
||||
{
|
||||
last_idx
|
||||
},
|
||||
@ -482,21 +548,7 @@ void GuildMgr::LoadGuild(int instance_id, long long last_idx)
|
||||
if (data_set && !data_set->empty()) {
|
||||
for (auto& row : *data_set) {
|
||||
cs::MFGuildBasic* guild = new cs::MFGuildBasic;
|
||||
guild->set_guild_id(a8::XValue(row[2]));
|
||||
guild->set_guild_name(row[3]);
|
||||
guild->set_guild_lv(a8::XValue(row[4]));
|
||||
guild->set_guild_exp(a8::XValue(row[5]));
|
||||
guild->set_guild_badge(a8::XValue(row[6]));
|
||||
guild->set_guild_declaration(row[8]);
|
||||
guild->set_owner_id(row[9]);
|
||||
guild->set_owner_name(row[10]);
|
||||
guild->set_owner_avatar_url(row[11]);
|
||||
guild->set_join_unlimited(a8::XValue(row[16]));
|
||||
guild->set_join_cond1(a8::XValue(row[17]));
|
||||
guild->set_join_cond2(a8::XValue(row[18]));
|
||||
guild->set__gameid(a8::XValue(row[1]));
|
||||
guild->set__channel(a8::XValue(row[21]));
|
||||
guild->set_member_num(a8::XValue(row[22]));
|
||||
DbToGuildBasic(row, guild);
|
||||
GuildMgr::Instance()->AddGuild(guild);
|
||||
if (a8::XValue(row[0]).GetInt64() > last_idx) {
|
||||
last_idx = a8::XValue(row[0]);
|
||||
@ -519,11 +571,7 @@ void GuildMgr::SyncGuild(int instance_id)
|
||||
DBEngine::Instance()->ExecAsyncQuery
|
||||
(
|
||||
*JsonDataMgr::Instance()->GetMysqlConf(instance_id),
|
||||
"SELECT idx, gameid, guild_id, guild_name, guild_lv, guild_exp, guild_badge, guild_notice, "
|
||||
" guild_declaration, owner_id, owner_name, owner_avatar_url, "
|
||||
" creator_id, creator_name, creator_avatar_url, guild_status, "
|
||||
" join_unlimited, join_cond1, join_cond2, createtime, modifytime, channel, guild_member_num "
|
||||
"FROM `guild` WHERE modifytime > %d;",
|
||||
GenSelectGuildSql("WHERE modifytime > %d;").c_str(),
|
||||
{
|
||||
sync_db_hash_[instance_id]
|
||||
},
|
||||
@ -536,25 +584,11 @@ void GuildMgr::SyncGuild(int instance_id)
|
||||
int last_sync_time = GuildMgr::Instance()->sync_db_hash_[instance_id];
|
||||
for (auto& row : *data_set) {
|
||||
cs::MFGuildBasic* guild = new cs::MFGuildBasic;
|
||||
guild->set_guild_id(a8::XValue(row[2]));
|
||||
guild->set_guild_name(row[3]);
|
||||
guild->set_guild_lv(a8::XValue(row[4]));
|
||||
guild->set_guild_exp(a8::XValue(row[5]));
|
||||
guild->set_guild_badge(a8::XValue(row[6]));
|
||||
guild->set_guild_declaration(row[8]);
|
||||
guild->set_owner_id(row[9]);
|
||||
guild->set_owner_name(row[10]);
|
||||
guild->set_owner_avatar_url(row[11]);
|
||||
guild->set_join_unlimited(a8::XValue(row[16]));
|
||||
guild->set_join_cond1(a8::XValue(row[17]));
|
||||
guild->set_join_cond2(a8::XValue(row[18]));
|
||||
guild->set__gameid(a8::XValue(row[1]));
|
||||
guild->set__channel(a8::XValue(row[21]));
|
||||
guild->set_member_num(a8::XValue(row[22]));
|
||||
if (a8::XValue(row[20]).GetInt64() > last_sync_time) {
|
||||
last_sync_time = a8::XValue(row[20]);
|
||||
}
|
||||
DbToGuildBasic(row, guild);
|
||||
GuildMgr::Instance()->UpdateGuild(guild);
|
||||
if (guild->_modifytime() > last_sync_time) {
|
||||
last_sync_time = guild->_modifytime();
|
||||
}
|
||||
delete guild;
|
||||
}
|
||||
if (last_sync_time > GuildMgr::Instance()->sync_db_hash_[instance_id]) {
|
||||
@ -597,11 +631,7 @@ void GuildMgr::RefreshGuild(long long guild_id)
|
||||
DBEngine::Instance()->ExecAsyncQuery
|
||||
(
|
||||
conn,
|
||||
"SELECT idx, gameid, guild_id, guild_name, guild_lv, guild_exp, guild_badge, guild_notice, "
|
||||
" guild_declaration, owner_id, owner_name, owner_avatar_url, "
|
||||
" creator_id, creator_name, creator_avatar_url, guild_status, "
|
||||
" join_unlimited, join_cond1, join_cond2, createtime, modifytime "
|
||||
"FROM `guild` WHERE guild_id = %d;",
|
||||
GenSelectGuildSql("WHERE guild_id = %d;").c_str(),
|
||||
{
|
||||
guild_id
|
||||
},
|
||||
@ -611,22 +641,10 @@ void GuildMgr::RefreshGuild(long long guild_id)
|
||||
{
|
||||
if (data_set && !data_set->empty()) {
|
||||
for (auto& row : *data_set) {
|
||||
cs::MFGuildBasic* guild = GuildMgr::Instance()->GetGuildById(a8::XValue(row[2]));
|
||||
if (guild) {
|
||||
#if 0
|
||||
guild->set_guild_name(row[3]);
|
||||
#endif
|
||||
guild->set_guild_lv(a8::XValue(row[4]));
|
||||
guild->set_guild_exp(a8::XValue(row[5]));
|
||||
guild->set_guild_badge(a8::XValue(row[6]));
|
||||
guild->set_guild_declaration(row[8]);
|
||||
guild->set_owner_id(row[9]);
|
||||
guild->set_owner_name(row[10]);
|
||||
guild->set_owner_avatar_url(row[11]);
|
||||
guild->set_join_unlimited(a8::XValue(row[13]));
|
||||
guild->set_join_cond1(a8::XValue(row[14]));
|
||||
guild->set_join_cond2(a8::XValue(row[15]));
|
||||
}
|
||||
cs::MFGuildBasic* guild = new cs::MFGuildBasic;
|
||||
DbToGuildBasic(row, guild);
|
||||
GuildMgr::Instance()->UpdateGuild(guild);
|
||||
delete guild;
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -639,48 +657,9 @@ void GuildMgr::RefreshGuild(long long guild_id)
|
||||
|
||||
void GuildMgr::GenGuildRank()
|
||||
{
|
||||
auto force_rank_list =
|
||||
[this] (int gameid) -> std::vector<cs::MFGuildBasic*>&
|
||||
{
|
||||
auto itr = rank_list_.find(gameid);
|
||||
if (itr != rank_list_.end()) {
|
||||
return itr->second;
|
||||
}
|
||||
rank_list_[gameid] = std::vector<cs::MFGuildBasic*>();
|
||||
return rank_list_[gameid];
|
||||
};
|
||||
rank_list_.clear();
|
||||
for (auto& pair : id_hash_) {
|
||||
auto guild = pair.second;
|
||||
std::vector<cs::MFGuildBasic*>& rank_list = force_rank_list(guild->_gameid());
|
||||
UpdateRank(rank_list, guild);
|
||||
}
|
||||
}
|
||||
|
||||
void GuildMgr::ResortRank(std::vector<cs::MFGuildBasic*>& 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<cs::MFGuildBasic*>& 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);
|
||||
}
|
||||
}
|
||||
UpdateRank(pair.second);
|
||||
}
|
||||
}
|
||||
|
||||
@ -688,9 +667,6 @@ void GuildMgr::UpdateGuild(cs::MFGuildBasic* new_guild)
|
||||
{
|
||||
auto guild = GetGuildById(new_guild->guild_id());
|
||||
if (guild) {
|
||||
#if 0
|
||||
guild->set_guild_name(new_guild->guild_name());
|
||||
#endif
|
||||
guild->set_guild_lv(new_guild->guild_lv());
|
||||
guild->set_guild_exp(new_guild->guild_exp());
|
||||
guild->set_guild_badge(new_guild->guild_badge());
|
||||
@ -702,24 +678,30 @@ void GuildMgr::UpdateGuild(cs::MFGuildBasic* new_guild)
|
||||
guild->set_join_unlimited((new_guild->join_unlimited()));
|
||||
guild->set_join_cond1((new_guild->join_cond1()));
|
||||
guild->set_join_cond2((new_guild->join_cond2()));
|
||||
UpdateRank(guild);
|
||||
}
|
||||
}
|
||||
|
||||
bool GuildMgr::CmpGuild(cs::MFGuildBasic* a, cs::MFGuildBasic* b)
|
||||
void GuildMgr::UpdateRank(cs::MFGuildBasic* guild)
|
||||
{
|
||||
if (a->guild_lv() > b->guild_lv()) {
|
||||
return true;
|
||||
{
|
||||
auto rank_list = a8::ForceCreateCommonRankList
|
||||
(
|
||||
rank_list_,
|
||||
guild->_gameid(),
|
||||
rank_cmp_func_,
|
||||
MAX_RANK_LIST_NUM);
|
||||
rank_list.Update(guild);
|
||||
}
|
||||
if (a->guild_lv() < b->guild_lv()) {
|
||||
return false;
|
||||
{
|
||||
auto rank_list = a8::ForceCreateCommonRankList
|
||||
(
|
||||
sorted_list_,
|
||||
guild->_gameid(),
|
||||
sorted_cmp_func_,
|
||||
MAX_SORTED_LIST_NUM);
|
||||
rank_list.Update(guild);
|
||||
}
|
||||
if (a->guild_exp() > b->guild_exp()) {
|
||||
return true;
|
||||
}
|
||||
if (a->guild_exp() < b->guild_exp()) {
|
||||
return false;
|
||||
}
|
||||
return a->guild_id() > b->guild_id();
|
||||
}
|
||||
|
||||
void GuildMgr::InstallSyncGuildTimer()
|
||||
|
@ -1,5 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include <a8/commonrank.h>
|
||||
#include <a8/timer_attacher.h>
|
||||
|
||||
namespace cs
|
||||
@ -29,17 +30,15 @@ class GuildMgr : public a8::Singleton<GuildMgr>
|
||||
private:
|
||||
cs::MFGuildBasic* GetGuildById(long long guild_id);
|
||||
cs::MFGuildBasic* GetGuildByName(int gameid, int channel, const std::string& guild_name);
|
||||
std::vector<cs::MFGuildBasic*>* GetGuildRank(int gameid);
|
||||
a8::CommonRank<cs::MFGuildBasic>* GetGuildRank(int gameid);
|
||||
void AddGuild(cs::MFGuildBasic* guild);
|
||||
void LoadGuild(int instance_id, long long last_idx);
|
||||
void SyncGuild(int instance_id);
|
||||
void OnOneDBDone(int instance_id);
|
||||
void RefreshGuild(long long guild_id);
|
||||
void GenGuildRank();
|
||||
void ResortRank(std::vector<cs::MFGuildBasic*>& rank_list);
|
||||
void UpdateRank(std::vector<cs::MFGuildBasic*>& rank_list, cs::MFGuildBasic* guild);
|
||||
void UpdateGuild(cs::MFGuildBasic* new_guild);
|
||||
bool CmpGuild(cs::MFGuildBasic* a, cs::MFGuildBasic* b);
|
||||
void UpdateRank(cs::MFGuildBasic* guild);
|
||||
void InstallSyncGuildTimer();
|
||||
std::string GenGuildName(int gameid, int channel, const std::string& raw_name);
|
||||
void GuildRename(cs::MFGuildBasic* guild, const std::string& new_name);
|
||||
@ -51,7 +50,9 @@ class GuildMgr : public a8::Singleton<GuildMgr>
|
||||
std::map<int, int> sync_db_hash_;
|
||||
std::map<long long, cs::MFGuildBasic*> id_hash_;
|
||||
std::map<std::string, cs::MFGuildBasic*> name_hash_;
|
||||
std::map<int, std::vector<cs::MFGuildBasic*>> rank_list_;
|
||||
std::map<int, std::vector<cs::MFGuildBasic*>> sorted_list_;
|
||||
std::map<long long, a8::CommonRank<cs::MFGuildBasic>> rank_list_;
|
||||
std::map<long long, a8::CommonRank<cs::MFGuildBasic>> sorted_list_;
|
||||
std::function<bool(const cs::MFGuildBasic*, const cs::MFGuildBasic*)> rank_cmp_func_;
|
||||
std::function<bool(const cs::MFGuildBasic*, const cs::MFGuildBasic*)> sorted_cmp_func_;
|
||||
std::map<std::string, std::tuple<timer_list*, std::set<long long>>> search_cache_;
|
||||
};
|
||||
|
@ -115,6 +115,8 @@ message MFGuildBasic
|
||||
|
||||
optional int32 _gameid = 100; //gameid
|
||||
optional int32 _channel = 101; //channel
|
||||
optional int32 _createtime = 102; //createtime
|
||||
optional int32 _modifytime = 103; //modifytime
|
||||
}
|
||||
|
||||
//登录好友服
|
||||
|
2
third_party/a8engine
vendored
2
third_party/a8engine
vendored
@ -1 +1 @@
|
||||
Subproject commit a25550d418277048506bb2815a192e15802dd19e
|
||||
Subproject commit 3a005b95f4569756f525358f7fa9c116177d264c
|
Loading…
x
Reference in New Issue
Block a user