summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAttila Molnar <attilamolnar@hush.com>2015-01-24 14:53:03 +0100
committerAttila Molnar <attilamolnar@hush.com>2015-01-24 14:53:03 +0100
commitcf728bd8a3de0942c2294ca5b49745092565d87c (patch)
tree0c963a0b164782625be86f2d18cb0c899760034d
parent662dfa6c181a8c1d97a0c65499679e0eb1b399e2 (diff)
Implement User::WriteCommonQuit() using ForEachNeighbor() in UserManager
-rw-r--r--include/users.h7
-rw-r--r--src/usermanager.cpp26
-rw-r--r--src/users.cpp40
3 files changed, 25 insertions, 48 deletions
diff --git a/include/users.h b/include/users.h
index 6f319018f..fa8f610bc 100644
--- a/include/users.h
+++ b/include/users.h
@@ -548,13 +548,6 @@ class CoreExport User : public Extensible
*/
void WriteCommon(const char* text, ...) CUSTOM_PRINTF(2, 3);
- /** Write a quit message to all common users, as in User::WriteCommonExcept but with a specific
- * quit message for opers only.
- * @param normal_text Normal user quit message
- * @param oper_text Oper only quit message
- */
- void WriteCommonQuit(const std::string &normal_text, const std::string &oper_text);
-
/** Execute a function once for each local neighbor of this user. By default, the neighbors of a user are the users
* who have at least one common channel with the user. Modules are allowed to alter the set of neighbors freely.
* This function is used for example to send something conditionally to neighbors, or to send different messages
diff --git a/src/usermanager.cpp b/src/usermanager.cpp
index 52cb4989f..5d07c4d79 100644
--- a/src/usermanager.cpp
+++ b/src/usermanager.cpp
@@ -24,6 +24,30 @@
#include "xline.h"
#include "iohook.h"
+namespace
+{
+ class WriteCommonQuit : public User::ForEachNeighborHandler
+ {
+ std::string line;
+ std::string operline;
+
+ void Execute(LocalUser* user) CXX11_OVERRIDE
+ {
+ user->Write(user->IsOper() ? operline : line);
+ }
+
+ public:
+ WriteCommonQuit(User* user, const std::string& msg, const std::string& opermsg)
+ : line(":" + user->GetFullHost() + " QUIT :")
+ , operline(line)
+ {
+ line += msg;
+ operline += opermsg;
+ user->ForEachNeighbor(*this, false);
+ }
+ };
+}
+
UserManager::UserManager()
: unregistered_count(0)
{
@@ -180,7 +204,7 @@ void UserManager::QuitUser(User* user, const std::string& quitreason, const std:
if (user->registered == REG_ALL)
{
FOREACH_MOD(OnUserQuit, (user, reason, *operreason));
- user->WriteCommonQuit(reason, *operreason);
+ WriteCommonQuit(user, reason, *operreason);
}
else
unregistered_count--;
diff --git a/src/users.cpp b/src/users.cpp
index cb1bc901e..5be3963b4 100644
--- a/src/users.cpp
+++ b/src/users.cpp
@@ -896,46 +896,6 @@ void User::WriteCommonRaw(const std::string &line, bool include_self)
}
}
-void User::WriteCommonQuit(const std::string &normal_text, const std::string &oper_text)
-{
- if (this->registered != REG_ALL)
- return;
-
- already_sent_t uniq_id = ++LocalUser::already_sent_id;
-
- const std::string normalMessage = ":" + this->GetFullHost() + " QUIT :" + normal_text;
- const std::string operMessage = ":" + this->GetFullHost() + " QUIT :" + oper_text;
-
- IncludeChanList include_c(chans.begin(), chans.end());
- std::map<User*,bool> exceptions;
-
- FOREACH_MOD(OnBuildNeighborList, (this, include_c, exceptions));
-
- for (std::map<User*,bool>::iterator i = exceptions.begin(); i != exceptions.end(); ++i)
- {
- LocalUser* u = IS_LOCAL(i->first);
- if (u && !u->quitting)
- {
- u->already_sent = uniq_id;
- if (i->second)
- u->Write(u->IsOper() ? operMessage : normalMessage);
- }
- }
- for (IncludeChanList::const_iterator v = include_c.begin(); v != include_c.end(); ++v)
- {
- const Channel::MemberMap& ulist = (*v)->chan->GetUsers();
- for (Channel::MemberMap::const_iterator i = ulist.begin(); i != ulist.end(); i++)
- {
- LocalUser* u = IS_LOCAL(i->first);
- if (u && (u->already_sent != uniq_id))
- {
- u->already_sent = uniq_id;
- u->Write(u->IsOper() ? operMessage : normalMessage);
- }
- }
- }
-}
-
void User::ForEachNeighbor(ForEachNeighborHandler& handler, bool include_self)
{
// The basic logic for visiting the neighbors of a user is to iterate the channel list of the user