From 6a8b071308ab046153c958d6737f9755d40d1656 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 10 Dec 2020 11:39:22 +0800 Subject: [PATCH] 1 --- server/imserver/metamgr.cc | 66 ++++++++++++++++++++++++++++++++++++++ server/imserver/metamgr.h | 1 + 2 files changed, 67 insertions(+) diff --git a/server/imserver/metamgr.cc b/server/imserver/metamgr.cc index 8bf1baf..274bbdd 100644 --- a/server/imserver/metamgr.cc +++ b/server/imserver/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: @@ -25,6 +37,8 @@ public: std::map guild_hash; + std::map > dirty_words; + void Load() { if (!f8::IsOnlineEnv()) { @@ -49,12 +63,33 @@ public: res_path = "../res/"; } f8::ReadCsvMetaFile(res_path + "Clan@Clan.csv", guild_meta_list); + LoadDirtyWordTable(); BindToMetaData(); Check(); } private: + void LoadDirtyWordTable() + { + a8::CsvReader reader; + reader.Load(res_path + "dirtyWord@dirtyWord.csv"); + while (reader.NextLine()) { + std::string strword = reader.GetValue("word").GetString(); + if (strword == " " || strword.empty()) { //忽略空格 + continue; + } + auto itr = dirty_words.find(strword.size()); + if (dirty_words.find(strword.size()) != dirty_words.end()) { + itr->second[strword] = strword; + } else { + std::map words; + words[strword] = strword; + dirty_words[strword.size()] = words; + } + } + } + void Check() { } @@ -103,3 +138,34 @@ MetaData::Guild* MetaMgr::GetGuild(int guild_lv) return nullptr; } } + +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; +} diff --git a/server/imserver/metamgr.h b/server/imserver/metamgr.h index 6683349..b1c1024 100644 --- a/server/imserver/metamgr.h +++ b/server/imserver/metamgr.h @@ -17,6 +17,7 @@ class MetaMgr : public a8::Singleton void Reload(); MetaData::Guild* GetGuild(int guild_lv); + std::string ReplaceDirtyWord(const std::string& text, char c); private: MetaDataLoader* loader_ = nullptr;