summaryrefslogtreecommitdiff
path: root/src/commands
diff options
context:
space:
mode:
authorw00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7>2008-05-07 18:54:14 +0000
committerw00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7>2008-05-07 18:54:14 +0000
commit1bf397ca49f5433915a9a15776d8debedd6ff936 (patch)
tree27f3353b05dcd5064ce2765c624ea9ccd893f42f /src/commands
parent69b42417f3133154536034074b0d60d2f0314a72 (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/commands')
-rw-r--r--src/commands/cmd_nick.cpp32
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]));