From 831ae233e46cd20c933622236f41523ad3b53524 Mon Sep 17 00:00:00 2001 From: erqan Date: Fri, 4 Sep 2015 20:00:51 +0300 Subject: [PATCH] spam message queue --- src/main.cpp | 18 ++++++++++-- src/main.h | 4 ++- src/twister.cpp | 77 ++++++++++++++++++++++++++++++++++++++++++------- 3 files changed, 85 insertions(+), 14 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index c8b84e61..9a0e87c1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -71,7 +71,8 @@ int64 nHPSTimerStart = 0; // Settings int64 nTransactionFee = 0; -string strSpamMessage = "Promoted posts are needed to run the network infrastructure. If you want to help, start generating blocks and advertise. [en]"; +CCriticalSection cs_spamMessages; +list spamMessages; string strSpamUser = "nobody"; @@ -3681,7 +3682,13 @@ public: static bool CreateSpamMsgTx(CTransaction &txNew, std::vector &salt) { - txNew.message = CScript() << strSpamMessage; + if (spamMessages.size()) + { + LOCK(cs_spamMessages); + txNew.message = CScript() << spamMessages.front(); + } + else + txNew.message = CScript() << strSpamMessage; std::string strUsername = strSpamUser; CKeyID keyID; @@ -3941,6 +3948,13 @@ bool CheckWork(CBlock* pblock, CWallet& wallet) CValidationState state; if (!ProcessBlock(state, NULL, pblock)) return error("BitcoinMiner : ProcessBlock, block not accepted"); + else + { + //after finding a block, change spam messages order.. + LOCK(cs_spamMessages); + spamMessages.push_back(spamMessages.front()); + spamMessages.pop_front(); + } } return true; diff --git a/src/main.h b/src/main.h index 153c97a1..ba37ed00 100644 --- a/src/main.h +++ b/src/main.h @@ -96,7 +96,9 @@ extern bool fHaveGUI; // Settings extern int64 nTransactionFee; -extern string strSpamMessage; +extern CCriticalSection cs_spamMessages; +static const string strSpamMessage = "Promoted posts are needed to run the network infrastructure. If you want to help, start generating blocks and advertise. [en]"; +extern std::list spamMessages; extern string strSpamUser; // Minimum disk space required - used in CheckDiskSpace() diff --git a/src/twister.cpp b/src/twister.cpp index f9cde0f5..88034212 100644 --- a/src/twister.cpp +++ b/src/twister.cpp @@ -64,6 +64,7 @@ static CCriticalSection cs_spamMsg; static std::string m_preferredSpamLang = "[en]"; static std::string m_receivedSpamMsgStr; static std::string m_receivedSpamUserStr; +static int m_receivedSpamHeight; static int64 m_lastSpamTime = 0; static std::map m_users; static std::map m_groups; @@ -213,8 +214,16 @@ int saveGlobalData(std::string const& filename) globalDict["preferredSpamLang"] = m_preferredSpamLang; globalDict["receivedSpamMsg"] = m_receivedSpamMsgStr; globalDict["receivedSpamUser"] = m_receivedSpamUserStr; + globalDict["receivedSpamHeight"]= m_receivedSpamHeight; globalDict["lastSpamTime"] = m_lastSpamTime; - globalDict["sendSpamMsg"] = strSpamMessage; + + entry spams(entry::list_t); + { + LOCK(cs_spamMessages); + BOOST_FOREACH(string msg, spamMessages) + spams.list().push_back(msg); + } + globalDict["sendSpamMsg"] = spams; globalDict["sendSpamUser"] = strSpamUser; globalDict["generate"] = GetBoolArg("-gen", false); int genproclimit = GetArg("-genproclimit", -1); @@ -240,9 +249,24 @@ int loadGlobalData(std::string const& filename) m_preferredSpamLang = userDict.dict_find_string_value("preferredSpamLang"); m_receivedSpamMsgStr = userDict.dict_find_string_value("receivedSpamMsg"); m_receivedSpamUserStr = userDict.dict_find_string_value("receivedSpamUser"); + m_receivedSpamHeight = userDict.dict_find_int_value("receivedSpamHeight"); m_lastSpamTime = userDict.dict_find_int_value("lastSpamTime"); - string sendSpamMsg = userDict.dict_find_string_value("sendSpamMsg"); - if( sendSpamMsg.size() ) strSpamMessage = sendSpamMsg; + + const lazy_entry *sendSpamMsg = userDict.dict_find_list("sendSpamMsg"); + if (sendSpamMsg) + { + LOCK(cs_spamMessages); + for (int i = 0; i < sendSpamMsg->list_size(); i++) + spamMessages.push_back(sendSpamMsg->list_string_value_at(i)); + } + else + { + string strSSM = userDict.dict_find_string_value("sendSpamMsg"); + LOCK(cs_spamMessages); + if(strSSM.size() && strSSM != strSpamMessage) + spamMessages.push_back(strSSM); + } + string sendSpamUser = userDict.dict_find_string_value("sendSpamUser"); if( sendSpamUser.size() ) strSpamUser = sendSpamUser; generateOpt = userDict.dict_find_int_value("generate"); @@ -1791,6 +1815,7 @@ void receivedSpamMessage(std::string const &message, std::string const &user) if( currentlyEmpty || (isSameLang && rand() < (RAND_MAX/2)) ) { m_receivedSpamMsgStr = message; m_receivedSpamUserStr = user; + m_receivedSpamHeight = nBestHeight; } } @@ -2528,7 +2553,7 @@ Value getposts(const Array& params, bool fHelp) if( m_receivedSpamMsgStr.length() && GetAdjustedTime() > m_lastSpamTime + (8*3600) ) { m_lastSpamTime = GetAdjustedTime(); - entry v = formatSpamPost(m_receivedSpamMsgStr, m_receivedSpamUserStr); + entry v = formatSpamPost(m_receivedSpamMsgStr, m_receivedSpamUserStr, 0, m_receivedSpamHeight); ret.insert(ret.begin(),entryToJson(v)); m_receivedSpamMsgStr = ""; @@ -2756,13 +2781,15 @@ Value getfavs(const Array& params, bool fHelp) Value setspammsg(const Array& params, bool fHelp) { - if (fHelp || (params.size() != 2)) + if (fHelp || params.size() < 2 || params.size() > 3) throw runtime_error( - "setspammsg \n" - "Set spam message attached to generated blocks"); + "setspammsg [add|remove|replace]\n" + "Set spam message attached to generated blocks\n" + "replace is default operation."); string strUsername = params[0].get_str(); string strMsg = params[1].get_str(); + string strOp = params.size() == 3 ? params[2].get_str() : "replace"; int spamMsgUtf8Size = utf8::num_characters(strMsg.begin(), strMsg.end()); if (spamMsgUtf8Size < 0) @@ -2772,10 +2799,30 @@ Value setspammsg(const Array& params, bool fHelp) if (spamMsgUtf8Size > MAX_SPAM_MSG_SIZE) throw JSONRPCError(RPC_INTERNAL_ERROR, "spam message too big"); - strSpamUser = strUsername; - strSpamMessage = strMsg; + Array ret; + { + LOCK(cs_spamMessages); + strSpamUser = strUsername; + if (strOp == "add") + { + spamMessages.push_back(strMsg); + spamMessages.unique(); + } + else if (strOp == "remove") + spamMessages.remove(strMsg); + else if (strOp == "replace") + { + spamMessages.clear(); + spamMessages.push_back(strMsg); + } + else + throw JSONRPCError(RPC_INVALID_PARAMETER, "unknown operation"); - return Value(); + BOOST_FOREACH(string msg, spamMessages) + ret.push_back(msg); + } + + return ret; } Value getspammsg(const Array& params, bool fHelp) @@ -2787,7 +2834,15 @@ Value getspammsg(const Array& params, bool fHelp) Array ret; ret.push_back(strSpamUser); - ret.push_back(strSpamMessage); + + { + LOCK(cs_spamMessages); + BOOST_FOREACH(string msg, spamMessages) + ret.push_back(msg); + } + //if spamMessages is empty, use default message... + if (ret.size() == 1) + ret.push_back(strSpamMessage); return ret; }