diff options
-rw-r--r-- | include/commands/cmd_nick.h | 3 | ||||
-rw-r--r-- | src/cmd_nick.cpp | 9 | ||||
-rw-r--r-- | src/users.cpp | 10 |
3 files changed, 19 insertions, 3 deletions
diff --git a/include/commands/cmd_nick.h b/include/commands/cmd_nick.h index e0264407d..c27ed2035 100644 --- a/include/commands/cmd_nick.h +++ b/include/commands/cmd_nick.h @@ -26,6 +26,7 @@ */ class cmd_nick : public command_t { + bool allowinvalid; public: /** Constructor for nick. */ @@ -37,6 +38,8 @@ class cmd_nick : public command_t * @return A value from CmdResult to indicate command success or failure. */ CmdResult Handle(const char** parameters, int pcnt, userrec *user); + + CmdResult HandleInternal(const unsigned int id, const std::deque<classbase*> ¶meters); }; #endif diff --git a/src/cmd_nick.cpp b/src/cmd_nick.cpp index a00803d75..f5c036dcf 100644 --- a/src/cmd_nick.cpp +++ b/src/cmd_nick.cpp @@ -77,7 +77,7 @@ CmdResult cmd_nick::Handle (const char** parameters, int pcnt, userrec *user) * here first, no TS checks need to take place here) */ userrec* InUse = ServerInstance->FindNick(parameters[0]); - if (InUse && (InUse != user) && (ServerInstance->IsNick(parameters[0]))) + if (InUse && (InUse != user) && ((ServerInstance->IsNick(parameters[0]) || allowinvalid))) { if (InUse->registered != REG_ALL) { @@ -98,7 +98,7 @@ CmdResult cmd_nick::Handle (const char** parameters, int pcnt, userrec *user) } } } - if ((!ServerInstance->IsNick(parameters[0])) && (IS_LOCAL(user))) + if (((!allowinvalid || !ServerInstance->IsNick(parameters[0]))) && (IS_LOCAL(user))) { user->WriteServ("432 %s %s :Erroneous Nickname",user->nick,parameters[0]); return CMD_FAILURE; @@ -180,3 +180,8 @@ CmdResult cmd_nick::Handle (const char** parameters, int pcnt, userrec *user) } +CmdResult cmd_nick::HandleInternal(const unsigned int id, const std::deque<classbase*> ¶meters) +{ + allowinvalid = (id != 0); +} + diff --git a/src/users.cpp b/src/users.cpp index b76df8ac5..1c1181689 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -1197,7 +1197,15 @@ bool userrec::ForceNickChange(const char* newnick) if (this->registered == REG_ALL) { - return (ServerInstance->Parser->CallHandler("NICK", &newnick, 1, this) == CMD_SUCCESS); + std::deque<classbase*> dummy; + command_t* nickhandler = ServerInstance->Parser->GetHandler("NICK"); + if (nickhandler) + { + nickhandler->HandleInternal(1, dummy); + bool result = (ServerInstance->Parser->CallHandler("NICK", &newnick, 1, this) == CMD_SUCCESS); + nickhandler->HandleInternal(0, dummy); + return result; + } } return false; } |