From c378c178809fc77ad922298c0e9bb33d1fa55cb0 Mon Sep 17 00:00:00 2001 From: JAJames Date: Sat, 2 Jul 2016 13:14:26 -0400 Subject: [PATCH] nickname conflicts are now handled slightly better --- Jupiter/IRC_Client.cpp | 39 ++++++++++++++++++++++++--------------- Release/Jupiter.lib | Bin 324110 -> 324110 bytes 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/Jupiter/IRC_Client.cpp b/Jupiter/IRC_Client.cpp index e1fe2f3..f55cc48 100644 --- a/Jupiter/IRC_Client.cpp +++ b/Jupiter/IRC_Client.cpp @@ -776,7 +776,7 @@ int Jupiter::IRC::Client::process_line(const Jupiter::ReadableString &line) case 3: // Registration sent, but not verified. { - bool completelyBadNick = false; + bool erroneous_nickname = false; switch (numeric) { // We'll take any of these 4, just in-case any of them are missing. In general, this will trigger on 001. @@ -791,37 +791,45 @@ int Jupiter::IRC::Client::process_line(const Jupiter::ReadableString &line) // You have a bad nickname! Try the alt. //case IRC_ERR_NONICKNAMEGIVEN: // 431 -- Not consistently usable due to lack of command field. case IRC_ERR_ERRONEOUSNICKNAME: // 432 - completelyBadNick = true; + erroneous_nickname = true; case IRC_ERR_NICKNAMEINUSE: // 433 case IRC_ERR_NICKCOLLISION: // 436 case IRC_ERR_BANNICKCHANGE: // 437 -- Note: This conflicts with another token. - const Jupiter::ReadableString &altNick = Jupiter::IRC::Client::readConfigValue("AltNick"_jrs, "Jupiter"_jrs); + const Jupiter::ReadableString &altNick = Jupiter::IRC::Client::readConfigValue("AltNick"_jrs); const Jupiter::ReadableString &configNick = Jupiter::IRC::Client::readConfigValue("Nick"_jrs, "Jupiter"_jrs); - /* - * Possible Issues: - * altNick != nickname after first nick change -- loop initiated? - * completelyBadNick will apply to altNick if it was tried, not the actual nick. - */ - if (Jupiter::IRC::Client::data_->nickname.equalsi(altNick)) // The alternate nick failed. + + if (altNick.isNotEmpty() && Jupiter::IRC::Client::data_->nickname.equalsi(altNick)) // The alternate nick failed. { Jupiter::IRC::Client::data_->nickname = configNick; Jupiter::IRC::Client::data_->nickname += "1"; + + Jupiter::IRC::Client::data_->sock->send("NICK "_jrs + Jupiter::IRC::Client::data_->nickname + ENDL); } - else if (Jupiter::IRC::Client::data_->nickname.equalsi(configNick)) + else if (Jupiter::IRC::Client::data_->nickname.equalsi(configNick)) // The config nick failed { - Jupiter::IRC::Client::data_->nickname = altNick; - if (Jupiter::IRC::Client::data_->nickname.isNotEmpty()) - Jupiter::IRC::Client::data_->sock->send(Jupiter::StringS::Format("NICK %.*s" ENDL, Jupiter::IRC::Client::data_->nickname.size(), Jupiter::IRC::Client::data_->nickname.ptr())); + if (altNick.isEmpty()) + { + if (erroneous_nickname) + break; // If this nick is invalid, adding numbers won't help. + + Jupiter::IRC::Client::data_->nickname += '1'; + } + else + Jupiter::IRC::Client::data_->nickname = altNick; + + Jupiter::IRC::Client::data_->sock->send("NICK "_jrs + Jupiter::IRC::Client::data_->nickname + ENDL); } // Note: Add a series of contains() functions to String_Type. else { - if (completelyBadNick == false) // If this nick is invalid, adding numbers won't help. + if (erroneous_nickname == false) // If this nick is invalid, adding numbers won't help. { if (Jupiter::IRC::Client::data_->nickname.size() > configNick.size()) { int n = Jupiter_strtoi_nospace_s(Jupiter::IRC::Client::data_->nickname.ptr() + configNick.size(), Jupiter::IRC::Client::data_->nickname.size() - configNick.size(), 10); - Jupiter::IRC::Client::data_->nickname.format("%.*s%d", configNick.size(), configNick.ptr(), n); + Jupiter::IRC::Client::data_->nickname.format("%.*s%d", configNick.size(), configNick.ptr(), n + 1); + + Jupiter::IRC::Client::data_->sock->send("NICK "_jrs + Jupiter::IRC::Client::data_->nickname + ENDL); } else { @@ -829,6 +837,7 @@ int Jupiter::IRC::Client::process_line(const Jupiter::ReadableString &line) // This can be somewhat edgy -- this will only trigger if someone rehashes AND the new nickname is shorter. // However, it won't be fatal even if the new nickname's length is >= the old. Jupiter::IRC::Client::data_->nickname = configNick; + Jupiter::IRC::Client::data_->sock->send("NICK "_jrs + Jupiter::IRC::Client::data_->nickname + ENDL); } } else diff --git a/Release/Jupiter.lib b/Release/Jupiter.lib index 41aa873f8e08f788c0b8df3be695a16e9043bf52..c97149778754d7d50e16668f8c4b7cf68e93007a 100644 GIT binary patch delta 21035 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 HZ^!>XoSnTc delta 21818 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