summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/users.h8
-rw-r--r--src/users.cpp35
2 files changed, 10 insertions, 33 deletions
diff --git a/include/users.h b/include/users.h
index b71f32748..da68bfd78 100644
--- a/include/users.h
+++ b/include/users.h
@@ -513,14 +513,6 @@ class CoreExport User : public Extensible
*/
void Oper(OperInfo* info);
- /** Change this users hash key to a new string.
- * You should not call this function directly. It is used by the core
- * to update the users hash entry on a nickchange.
- * @param New new user_hash key
- * @return Pointer to User in hash (usually 'this')
- */
- User* UpdateNickHash(const char* New);
-
/** Force a nickname change.
* If the nickname change fails (for example, because the nick in question
* already exists) this function will return false, and you must then either
diff --git a/src/users.cpp b/src/users.cpp
index f429597da..8456703cc 100644
--- a/src/users.cpp
+++ b/src/users.cpp
@@ -864,27 +864,6 @@ void LocalUser::FullConnect()
ServerInstance->BanCache->AddHit(this->GetIPString(), "", "");
}
-/** User::UpdateNick()
- * re-allocates a nick in the user_hash after they change nicknames,
- * returns a pointer to the new user as it may have moved
- */
-User* User::UpdateNickHash(const char* New)
-{
- //user_hash::iterator newnick;
- user_hash::iterator oldnick = ServerInstance->Users->clientlist->find(this->nick);
-
- if (!irc::string(this->nick.c_str()).compare(New))
- return oldnick->second;
-
- if (oldnick == ServerInstance->Users->clientlist->end())
- return NULL; /* doesnt exist */
-
- User* olduser = oldnick->second;
- ServerInstance->Users->clientlist->erase(oldnick);
- (*(ServerInstance->Users->clientlist))[New] = olduser;
- return olduser;
-}
-
void User::InvalidateCache()
{
/* Invalidate cache */
@@ -971,8 +950,11 @@ bool User::ChangeNick(const std::string& newnick, bool force)
/* force the camper to their UUID, and ask them to re-send a NICK. */
InUse->WriteTo(InUse, "NICK %s", InUse->uuid.c_str());
InUse->WriteNumeric(433, "%s %s :Nickname overruled.", InUse->nick.c_str(), InUse->nick.c_str());
- InUse->UpdateNickHash(InUse->uuid.c_str());
- InUse->nick.assign(InUse->uuid, 0, IS_LOCAL(InUse) ? ServerInstance->Config->Limits.NickMax : MAXBUF);
+
+ ServerInstance->Users->clientlist->erase(InUse->nick);
+ (*(ServerInstance->Users->clientlist))[InUse->uuid] = InUse;
+
+ InUse->nick = InUse->uuid;
InUse->InvalidateCache();
InUse->registered &= ~REG_NICK;
}
@@ -980,7 +962,7 @@ bool User::ChangeNick(const std::string& newnick, bool force)
{
/* No camping, tell the incoming user to stop trying to change nick ;p */
this->WriteNumeric(433, "%s %s :Nickname is already in use.", this->registered >= REG_NICK ? this->nick.c_str() : "*", newnick.c_str());
- return CMD_FAILURE;
+ return false;
}
}
}
@@ -989,8 +971,11 @@ bool User::ChangeNick(const std::string& newnick, bool force)
this->WriteCommon("NICK %s",newnick.c_str());
std::string oldnick = nick;
nick = newnick;
+
InvalidateCache();
- UpdateNickHash(newnick.c_str());
+ ServerInstance->Users->clientlist->erase(oldnick);
+ (*(ServerInstance->Users->clientlist))[newnick] = this;
+
FOREACH_MOD(I_OnUserPostNick,OnUserPostNick(this,oldnick));
return true;
}