diff options
-rw-r--r-- | include/users.h | 6 | ||||
-rw-r--r-- | src/modules/m_spanningtree/uid.cpp | 8 | ||||
-rw-r--r-- | src/users.cpp | 17 |
3 files changed, 20 insertions, 11 deletions
diff --git a/include/users.h b/include/users.h index fc31a8297..8cf78a585 100644 --- a/include/users.h +++ b/include/users.h @@ -872,6 +872,12 @@ class CoreExport LocalUser : public User, public insp::intrusive_list_node<Local * @return True if the user can set or unset this mode. */ bool HasModePermission(const ModeHandler* mh) const; + + /** Change nick to uuid, unset REG_NICK and send a nickname overruled numeric. + * This is called when another user (either local or remote) needs the nick of this user and this user + * isn't registered. + */ + void OverruleNick(); }; class RemoteUser : public User diff --git a/src/modules/m_spanningtree/uid.cpp b/src/modules/m_spanningtree/uid.cpp index a41fe408d..6f59fcd50 100644 --- a/src/modules/m_spanningtree/uid.cpp +++ b/src/modules/m_spanningtree/uid.cpp @@ -50,12 +50,8 @@ CmdResult CommandUID::HandleServer(TreeServer* remoteserver, std::vector<std::st { // User that the incoming user is colliding with is not fully registered, we force nick change the // unregistered user to their uuid and tell them what happened - collideswith->WriteFrom(collideswith, "NICK %s", collideswith->uuid.c_str()); - collideswith->WriteNumeric(ERR_NICKNAMEINUSE, collideswith->nick, "Nickname overruled."); - - // Clear the bit before calling User::ChangeNick() to make it NOT run the OnUserPostNick() hook - collideswith->registered &= ~REG_NICK; - collideswith->ChangeNick(collideswith->uuid); + LocalUser* const localuser = static_cast<LocalUser*>(collideswith); + localuser->OverruleNick(); } else if (collideswith) { diff --git a/src/users.cpp b/src/users.cpp index 498a27d58..06a1c1149 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -627,11 +627,8 @@ bool User::ChangeNick(const std::string& newnick, time_t newts) if (InUse->registered != REG_ALL) { /* force the camper to their UUID, and ask them to re-send a NICK. */ - InUse->WriteFrom(InUse, "NICK %s", InUse->uuid.c_str()); - InUse->WriteNumeric(ERR_NICKNAMEINUSE, InUse->nick, "Nickname overruled."); - - InUse->registered &= ~REG_NICK; - InUse->ChangeNick(InUse->uuid); + LocalUser* const localuser = static_cast<LocalUser*>(InUse); + localuser->OverruleNick(); } else { @@ -659,6 +656,16 @@ bool User::ChangeNick(const std::string& newnick, time_t newts) return true; } +void LocalUser::OverruleNick() +{ + this->WriteFrom(this, "NICK %s", this->uuid.c_str()); + this->WriteNumeric(ERR_NICKNAMEINUSE, this->nick, "Nickname overruled."); + + // Clear the bit before calling ChangeNick() to make it NOT run the OnUserPostNick() hook + this->registered &= ~REG_NICK; + this->ChangeNick(this->uuid); +} + int LocalUser::GetServerPort() { switch (this->server_sa.sa.sa_family) |