* On nick messages, check that the nick doesn't already exist here.
* If it does, perform collision logic.
*/
- bool callfnc = true;
User* x = ServerInstance->FindNickOnly(params[0]);
if ((x) && (x != user) && (x->registered == REG_ALL))
{
if (collideret != 1)
{
// Remote client lost, or both lost, rewrite this nick change as a change to uuid before
- // forwarding and don't call ChangeNick() because DoCollision() has done it already
+ // calling ChangeNick() and forwarding the message
params[0] = user->uuid;
- callfnc = false;
}
}
- if (callfnc)
- user->ChangeNick(params[0], newts);
+
+ user->ChangeNick(params[0], newts);
return CMD_SUCCESS;
}
* Yes, this function looks a little ugly.
* However, in some circumstances we may not have a User, so we need to do things this way.
* Returns 1 if colliding local client, 2 if colliding remote, 3 if colliding both.
- * Sends SAVEs as appropriate and forces nickchanges too.
+ * Sends SAVEs as appropriate and forces nick change of the user 'u' if our side loses or if both lose.
+ * Does not change the nick of the user that is trying to claim the nick of 'u', i.e. the "remote" user.
*/
int SpanningTreeUtilities::DoCollision(User* u, TreeServer* server, time_t remotets, const std::string& remoteident, const std::string& remoteip, const std::string& remoteuid)
{
}
if (bChangeRemote)
{
- User *remote = ServerInstance->FindUUID(remoteuid);
/*
* remote side needs to change. If this happens, we will modify
* the UID or halt the propagation of the nick change command,
TreeSocket* sock = server->GetSocket();
sock->WriteLine(CmdBuilder("SAVE").push(remoteuid).push_int(remotets));
- if (remote)
- {
- /* nick change collide. Force change their nick. */
- remote->ChangeNick(remoteuid);
- }
-
if (!bChangeLocal)
return 2;
}