From 1bf397ca49f5433915a9a15776d8debedd6ff936 Mon Sep 17 00:00:00 2001 From: w00t Date: Wed, 7 May 2008 18:54:14 +0000 Subject: 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 --- src/commands/cmd_nick.cpp | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) (limited to 'src/commands') 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& 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 p2; + std::deque 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& 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& 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])); -- cgit v1.2.3