summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoriwalkalone <iwalkalone69@users.noreply.github.com>2019-06-24 15:46:54 +0200
committerPeter Powell <petpow@saberuk.com>2019-06-24 14:46:54 +0100
commit2ab383f707ec648ceeb29059ce4f54d4bbb056a4 (patch)
tree1e83d48bafc205178ba20965a5a620f4d2b5b632 /src
parent871d93dc76091a273296e9a0a7ce3d411054c862 (diff)
Add OnUserPreQuit event to allow modules to change quit messages (#1629).
Diffstat (limited to 'src')
-rw-r--r--src/modules.cpp1
-rw-r--r--src/usermanager.cpp39
2 files changed, 28 insertions, 12 deletions
diff --git a/src/modules.cpp b/src/modules.cpp
index 444e90645..3e268dae6 100644
--- a/src/modules.cpp
+++ b/src/modules.cpp
@@ -73,6 +73,7 @@ void Module::DetachEvent(Implementation i)
void Module::ReadConfig(ConfigStatus& status) { }
ModResult Module::OnSendSnotice(char &snomask, std::string &type, const std::string &message) { DetachEvent(I_OnSendSnotice); return MOD_RES_PASSTHRU; }
void Module::OnUserConnect(LocalUser*) { DetachEvent(I_OnUserConnect); }
+ModResult Module::OnUserPreQuit(LocalUser*, std::string&, std::string&) { DetachEvent(I_OnUserPreQuit); return MOD_RES_PASSTHRU; }
void Module::OnUserQuit(User*, const std::string&, const std::string&) { DetachEvent(I_OnUserQuit); }
void Module::OnUserDisconnect(LocalUser*) { DetachEvent(I_OnUserDisconnect); }
void Module::OnUserJoin(Membership*, bool, bool, CUList&) { DetachEvent(I_OnUserJoin); }
diff --git a/src/usermanager.cpp b/src/usermanager.cpp
index fafeffb42..6acd25ac5 100644
--- a/src/usermanager.cpp
+++ b/src/usermanager.cpp
@@ -214,7 +214,7 @@ void UserManager::AddUser(int socket, ListenSocket* via, irc::sockets::sockaddrs
FOREACH_MOD(OnUserPostInit, (New));
}
-void UserManager::QuitUser(User* user, const std::string& quitreason, const std::string* operreason)
+void UserManager::QuitUser(User* user, const std::string& quitmessage, const std::string* operquitmessage)
{
if (user->quitting)
{
@@ -228,27 +228,42 @@ void UserManager::QuitUser(User* user, const std::string& quitreason, const std:
return;
}
- user->quitting = true;
+ std::string quitmsg(quitmessage);
+ std::string operquitmsg;
+ if (operquitmessage)
+ operquitmsg.assign(*operquitmessage);
- ServerInstance->Logs->Log("USERS", LOG_DEBUG, "QuitUser: %s=%s '%s'", user->uuid.c_str(), user->nick.c_str(), quitreason.c_str());
LocalUser* const localuser = IS_LOCAL(user);
if (localuser)
{
- ClientProtocol::Messages::Error errormsg(InspIRCd::Format("Closing link: (%s@%s) [%s]", user->ident.c_str(), user->GetRealHost().c_str(), operreason ? operreason->c_str() : quitreason.c_str()));
- localuser->Send(ServerInstance->GetRFCEvents().error, errormsg);
+ ModResult MOD_RESULT;
+ FIRST_MOD_RESULT(OnUserPreQuit, MOD_RESULT, (localuser, quitmsg, operquitmsg));
+ if (MOD_RESULT == MOD_RES_DENY)
+ return;
}
- std::string reason;
- reason.assign(quitreason, 0, ServerInstance->Config->Limits.MaxQuit);
- if (!operreason)
- operreason = &reason;
+ if (quitmsg.length() > ServerInstance->Config->Limits.MaxQuit)
+ quitmsg.erase(ServerInstance->Config->Limits.MaxQuit + 1);
+
+ if (operquitmsg.empty())
+ operquitmsg.assign(quitmsg);
+ else if (operquitmsg.length() > ServerInstance->Config->Limits.MaxQuit)
+ operquitmsg.erase(ServerInstance->Config->Limits.MaxQuit + 1);
+
+ user->quitting = true;
+ ServerInstance->Logs->Log("USERS", LOG_DEBUG, "QuitUser: %s=%s '%s'", user->uuid.c_str(), user->nick.c_str(), quitmessage.c_str());
+ if (localuser)
+ {
+ ClientProtocol::Messages::Error errormsg(InspIRCd::Format("Closing link: (%s@%s) [%s]", user->ident.c_str(), user->GetRealHost().c_str(), operquitmsg.c_str()));
+ localuser->Send(ServerInstance->GetRFCEvents().error, errormsg);
+ }
ServerInstance->GlobalCulls.AddItem(user);
if (user->registered == REG_ALL)
{
- FOREACH_MOD(OnUserQuit, (user, reason, *operreason));
- WriteCommonQuit(user, reason, *operreason);
+ FOREACH_MOD(OnUserQuit, (user, quitmsg, operquitmsg));
+ WriteCommonQuit(user, quitmsg, operquitmsg);
}
else
unregistered_count--;
@@ -260,7 +275,7 @@ void UserManager::QuitUser(User* user, const std::string& quitreason, const std:
lu->eh.Close();
if (lu->registered == REG_ALL)
- ServerInstance->SNO->WriteToSnoMask('q',"Client exiting: %s (%s) [%s]", user->GetFullRealHost().c_str(), user->GetIPString().c_str(), operreason->c_str());
+ ServerInstance->SNO->WriteToSnoMask('q',"Client exiting: %s (%s) [%s]", user->GetFullRealHost().c_str(), user->GetIPString().c_str(), operquitmsg.c_str());
local_users.erase(lu);
}