diff options
author | w00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7> | 2008-05-07 18:54:14 +0000 |
---|---|---|
committer | w00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7> | 2008-05-07 18:54:14 +0000 |
commit | 1bf397ca49f5433915a9a15776d8debedd6ff936 (patch) | |
tree | 27f3353b05dcd5064ce2765c624ea9ccd893f42f /src | |
parent | 69b42417f3133154536034074b0d60d2f0314a72 (diff) |
Add support for /nick 0: changes nick to UID, which can come in useful for circumstances when trying to connect while your nick is in use. Also supported by various others (ircd etc?). This also moves validation checking up a bit, avoiding two calls to IsNick in an obscure circumstance (hooray).
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@9660 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src')
-rw-r--r-- | src/commands/cmd_nick.cpp | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/src/commands/cmd_nick.cpp b/src/commands/cmd_nick.cpp index eac29dd24..0ae781cc0 100644 --- a/src/commands/cmd_nick.cpp +++ b/src/commands/cmd_nick.cpp @@ -36,6 +36,27 @@ CmdResult CommandNick::Handle (const std::vector<std::string>& parameters, User return CMD_FAILURE; } + if (((!ServerInstance->IsNick(parameters[0].c_str()))) && (IS_LOCAL(user))) + { + if (!allowinvalid) + { + if (parameters[0] == "0") + { + // Special case, Fake a /nick UIDHERE. Useful for evading "ERR: NICK IN USE" on connect etc. + std::vector<std::string> p2; + std::deque<classbase*> dummy; + p2.push_back(user->uuid); + this->HandleInternal(1, dummy); + this->Handle(p2, user); + this->HandleInternal(0, dummy); + return CMD_SUCCESS; + } + + user->WriteNumeric(432, "%s %s :Erroneous Nickname", user->nick,parameters[0].c_str()); + return CMD_FAILURE; + } + } + if (irc::string(user->nick) == assign(parameters[0])) { /* If its exactly the same, even case, dont do anything. */ @@ -89,7 +110,7 @@ CmdResult CommandNick::Handle (const std::vector<std::string>& parameters, User * because the nick is already (rightfully) in use. -- w00t */ User* InUse = ServerInstance->FindNickOnly(parameters[0]); - if (InUse && (InUse != user) && ((ServerInstance->IsNick(parameters[0].c_str()) || allowinvalid))) + if (InUse && (InUse != user)) { if (InUse->registered != REG_ALL) { @@ -109,14 +130,7 @@ CmdResult CommandNick::Handle (const std::vector<std::string>& parameters, User } } } - if (((!ServerInstance->IsNick(parameters[0].c_str()))) && (IS_LOCAL(user))) - { - if (!allowinvalid) - { - user->WriteNumeric(432, "%s %s :Erroneous Nickname", user->nick,parameters[0].c_str()); - return CMD_FAILURE; - } - } + int MOD_RESULT = 0; FOREACH_RESULT(I_OnUserPreNick,OnUserPreNick(user, parameters[0])); |