summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/commands/cmd_nick.h3
-rw-r--r--src/cmd_nick.cpp9
-rw-r--r--src/users.cpp10
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*> &parameters);
};
#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*> &parameters)
+{
+ 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;
}