From 1a1fe81447d8fe28dc05338ef78cce827467041d Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 6 Dec 2021 11:42:21 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=90=8D=E5=AD=97=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/textserver/metadata.h | 5 +++ server/textserver/metamgr.cc | 25 ++++++++++++++ server/textserver/metamgr.h | 1 + server/textserver/textmgr.cc | 45 +++++++++++++++++++++++-- server/textserver/textmgr.h | 1 + server/tools/protobuild/metatable.proto | 7 ++++ 6 files changed, 82 insertions(+), 2 deletions(-) diff --git a/server/textserver/metadata.h b/server/textserver/metadata.h index 37e43ee..45fbfc4 100644 --- a/server/textserver/metadata.h +++ b/server/textserver/metadata.h @@ -1,3 +1,8 @@ #pragma once #include "metatable.pb.h" + +namespace MetaData +{ + +} diff --git a/server/textserver/metamgr.cc b/server/textserver/metamgr.cc index c7d0830..0a87c05 100644 --- a/server/textserver/metamgr.cc +++ b/server/textserver/metamgr.cc @@ -34,8 +34,12 @@ class MetaDataLoader public: std::map > dirty_words; std::list text_meta_list; + std::list creator_meta_list; std::map text_hash; + std::vector name1_list; + std::vector name2_list; + std::vector name3_list; void Load() { @@ -59,6 +63,7 @@ public: res_path = "../res/"; } f8::ReadCsvMetaFile(res_path + "text@text.csv", text_meta_list); + f8::ReadCsvMetaFile(res_path + "creator@creator.csv", creator_meta_list); LoadDirtyWordTable(); BindToMetaData(); Check(); @@ -96,6 +101,11 @@ private: for (auto& meta : text_meta_list) { text_hash[meta.textid()] = meta.text(); } + for (auto& meta : creator_meta_list) { + name1_list.push_back(meta.adjective()); + name2_list.push_back(meta.surname()); + name3_list.push_back(meta.name()); + } } private: @@ -176,3 +186,18 @@ std::string MetaMgr::GetText(const std::string& textid, const std::string& def_t auto itr = loader_->text_hash.find(textid); return itr != loader_->text_hash.end() ? itr->second : def_text; } + +std::string MetaMgr::RandName() +{ + std::string name; + if (!loader_->name1_list.empty()) { + name += loader_->name1_list[rand() % loader_->name1_list.size()]; + } + if (!loader_->name2_list.empty()) { + name += loader_->name2_list[rand() % loader_->name2_list.size()]; + } + if (!loader_->name3_list.empty()) { + name += loader_->name3_list[rand() % loader_->name3_list.size()]; + } + return name; +} diff --git a/server/textserver/metamgr.h b/server/textserver/metamgr.h index b24120e..c16f16c 100644 --- a/server/textserver/metamgr.h +++ b/server/textserver/metamgr.h @@ -21,6 +21,7 @@ class MetaMgr : public a8::Singleton 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=""); + std::string RandName(); private: MetaDataLoader* loader_ = nullptr; diff --git a/server/textserver/textmgr.cc b/server/textserver/textmgr.cc index 80d0d9f..c96cbb0 100644 --- a/server/textserver/textmgr.cc +++ b/server/textserver/textmgr.cc @@ -46,16 +46,57 @@ void TextMgr::__DirtyWordReplace(f8::JsonHttpRequest* request) void TextMgr::__RandName(f8::JsonHttpRequest* request) { - + request->resp_xobj->SetVal("errcode", 0); + request->resp_xobj->SetVal("errmsg", ""); + std::string name = MetaMgr::Instance()->RandName(); + int try_count = 0; + while (try_count < 10) { + name = MetaMgr::Instance()->RandName(); + if (MetaMgr::Instance()->HasDirtyWord(name)) { + break; + } + ++try_count; + } + if (try_count >= 10) { + request->resp_xobj->SetVal("errcode", 1); + request->resp_xobj->SetVal("errmsg", "含有屏蔽字符,请重试"); + } else { + std::string sign = Sign(name); + request->resp_xobj->SetVal("errcode", 0); + request->resp_xobj->SetVal("errmsg", ""); + request->resp_xobj->SetVal("name", name); + request->resp_xobj->SetVal("name_sign", sign); + } } void TextMgr::__IsValidName(f8::JsonHttpRequest* request) { request->resp_xobj->SetVal("errcode", 0); request->resp_xobj->SetVal("errmsg", ""); - std::string name = request->request.At("name")->AsXValue(); + std::string name = ""; if (MetaMgr::Instance()->HasDirtyWord(name)) { request->resp_xobj->SetVal("errcode", 1); request->resp_xobj->SetVal("errmsg", "含有屏蔽字符"); + } else { + std::string sign = Sign(name); + request->resp_xobj->SetVal("errcode", 0); + request->resp_xobj->SetVal("errmsg", ""); + request->resp_xobj->SetVal("name", name); + request->resp_xobj->SetVal("name_sign", sign); } } + +std::string TextMgr::Sign(const std::string& name) +{ + int rnd = rand(); + std::string sign = a8::openssl::md5(name + + a8::XValue(App::Instance()->nowtime).GetString() + + a8::XValue(rnd).GetString()); + sign = a8::Format("%s_%s_%s", + { + a8::XValue(App::Instance()->nowtime).GetString(), + a8::XValue(rnd).GetString(), + sign + }); + return sign; +} diff --git a/server/textserver/textmgr.h b/server/textserver/textmgr.h index 18e4d24..73b98a6 100644 --- a/server/textserver/textmgr.h +++ b/server/textserver/textmgr.h @@ -19,6 +19,7 @@ class TextMgr : public a8::Singleton void __IsValidName(f8::JsonHttpRequest* request); private: + std::string Sign(const std::string& name); private: a8::TimerAttacher timer_attacher_; diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index b12e6b3..7bdbf6f 100644 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -11,3 +11,10 @@ message Text optional string textid = 1; optional string text = 2; } + +message Creator +{ + optional string adjective = 1; + optional string surname = 2; + optional string name = 3; +} \ No newline at end of file