From a7001bb2c96357f4fe4d171ab39dcc85dc0596d5 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 28 Jan 2021 15:39:23 +0800 Subject: [PATCH] 1 --- server/rankserver/guildmgr.cc | 9 +++++++ server/rankserver/guildmgr.h | 1 + server/rankserver/handlermgr.cc | 5 ++++ server/rankserver/metamgr.cc | 43 +++++++++++++++++++++++++++++++++ server/rankserver/metamgr.h | 1 + 5 files changed, 59 insertions(+) diff --git a/server/rankserver/guildmgr.cc b/server/rankserver/guildmgr.cc index 1158eed..b93ae60 100644 --- a/server/rankserver/guildmgr.cc +++ b/server/rankserver/guildmgr.cc @@ -552,6 +552,15 @@ void GuildMgr::__GuildDirtyWordCheck(f8::JsonHttpRequest* request) } } +void GuildMgr::__GuildDirtyWordReplace(f8::JsonHttpRequest* request) +{ + std::string text = request->request.At("text")->AsXValue(); + std::string new_text = MetaMgr::Instance()->ReplaceDirtyWord(text, '*'); + request->resp_xobj->SetVal("errcode", 0); + request->resp_xobj->SetVal("errmsg", ""); + request->resp_xobj->SetVal("new_text", new_text); +} + void GuildMgr::__GenTestData(f8::JsonHttpRequest* request) { } diff --git a/server/rankserver/guildmgr.h b/server/rankserver/guildmgr.h index 8215bbf..c29036c 100644 --- a/server/rankserver/guildmgr.h +++ b/server/rankserver/guildmgr.h @@ -26,6 +26,7 @@ class GuildMgr : public a8::Singleton void __GuildRank(f8::JsonHttpRequest* request); void __GuildConfirmed(f8::JsonHttpRequest* request); void __GuildDirtyWordCheck(f8::JsonHttpRequest* request); + void __GuildDirtyWordReplace(f8::JsonHttpRequest* request); void __GenTestData(f8::JsonHttpRequest* request); private: diff --git a/server/rankserver/handlermgr.cc b/server/rankserver/handlermgr.cc index 3bf2582..99c9030 100644 --- a/server/rankserver/handlermgr.cc +++ b/server/rankserver/handlermgr.cc @@ -65,6 +65,11 @@ void HandlerMgr::Init() { GuildMgr::Instance()->__GuildDirtyWordCheck(request); }); + RegisterGMMsgHandler("Guild@dirtyWordReplace", + [] (f8::JsonHttpRequest* request) + { + GuildMgr::Instance()->__GuildDirtyWordReplace(request); + }); RegisterGMMsgHandler("Guild@genTestData", [] (f8::JsonHttpRequest* request) { diff --git a/server/rankserver/metamgr.cc b/server/rankserver/metamgr.cc index 25da49f..b8f83a4 100644 --- a/server/rankserver/metamgr.cc +++ b/server/rankserver/metamgr.cc @@ -17,6 +17,18 @@ #define METAMGR_READ_STR(field_name, def_val) MetaMgr::Instance()->field_name = \ a8::XValue(MetaMgr::Instance()->GetSysParamAsString(#field_name, def_val)).GetString(); +static bool PureEnglishName(const std::string& role_name) +{ + for (size_t i = 0; i < role_name.size(); i++) { + if (role_name[i] >= 0 && role_name[i] <= 127) { + continue; + } else { + return false; + } + } + return true; +} + class MetaDataLoader { public: @@ -130,6 +142,37 @@ bool MetaMgr::HasDirtyWord(const std::string& text) return false; } +std::string MetaMgr::ReplaceDirtyWord(const std::string& text, char c) +{ + std::string result; + result.reserve(text.size()); + for (size_t i = 0; i < text.size(); i++) { + bool found = false; + for (auto itr = loader_->dirty_words.begin(); itr != loader_->dirty_words.end(); ++itr) { + if (itr->first <= text.size() - i) { + std::string substr = text.substr(i, itr->first); + // 如果是纯英文,则先转为小写,根据策划说明,屏蔽字大小写不敏感 + if (PureEnglishName(substr)) { + transform(substr.begin(), substr.end(), substr.begin(), ::tolower); + } + if (substr.size() > 0 && itr->second.find(substr) != itr->second.end()) { + int str_len = a8::GetUtf8Length(substr.c_str()); + for (int j = 0; j < str_len; j++) { + result.push_back(c); + } + i += substr.size() - 1; + found = true; + break; + } + } + }//endfor map + if (!found) { + result.push_back(text[i]); + } + } + return result; +} + std::string MetaMgr::GetText(const std::string& textid, const std::string& def_text) { auto itr = loader_->text_hash.find(textid); diff --git a/server/rankserver/metamgr.h b/server/rankserver/metamgr.h index 805e757..b24120e 100644 --- a/server/rankserver/metamgr.h +++ b/server/rankserver/metamgr.h @@ -19,6 +19,7 @@ class MetaMgr : public a8::Singleton void Reload(); bool HasDirtyWord(const std::string& text); + std::string ReplaceDirtyWord(const std::string& text, char c); std::string GetText(const std::string& textid, const std::string& def_text=""); private: