summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorent Le Coz <louiz@louiz.org>2014-08-08 00:47:05 +0200
committerFlorent Le Coz <louiz@louiz.org>2014-08-08 00:47:05 +0200
commit41e8a3ba9b57e67aec5d0d30112338664afbd6e4 (patch)
treefa75cc0aa7206a8f277c612adbff818faae18cd1
parente3ea0d62c79cf74e154f24d7f5a0fa8c7d26d73b (diff)
downloadbiboumi-41e8a3ba9b57e67aec5d0d30112338664afbd6e4.tar.gz
biboumi-41e8a3ba9b57e67aec5d0d30112338664afbd6e4.tar.bz2
biboumi-41e8a3ba9b57e67aec5d0d30112338664afbd6e4.tar.xz
biboumi-41e8a3ba9b57e67aec5d0d30112338664afbd6e4.zip
Send a proper error on IRC message 438 (nickname change too fast)
fix #2576
-rw-r--r--src/irc/irc_client.cpp19
-rw-r--r--src/irc/irc_client.hpp5
2 files changed, 24 insertions, 0 deletions
diff --git a/src/irc/irc_client.cpp b/src/irc/irc_client.cpp
index 678cac8..f9ebfa0 100644
--- a/src/irc/irc_client.cpp
+++ b/src/irc/irc_client.cpp
@@ -478,6 +478,25 @@ void IrcClient::on_nickname_conflict(const IrcMessage& message)
}
}
+void IrcClient::on_nickname_change_too_fast(const IrcMessage& message)
+{
+ const std::string nickname = message.arguments[1];
+ std::string txt;
+ if (message.arguments.size() >= 3)
+ txt = message.arguments[2];
+ this->on_generic_error(message);
+ for (auto it = this->channels.begin(); it != this->channels.end(); ++it)
+ {
+ Iid iid;
+ iid.set_local(it->first);
+ iid.set_server(this->hostname);
+ iid.is_channel = true;
+ this->bridge->send_presence_error(iid, nickname,
+ "cancel", "not-acceptable",
+ "", txt);
+ }
+}
+
void IrcClient::on_generic_error(const IrcMessage& message)
{
const std::string error_msg = message.arguments.size() >= 3 ?
diff --git a/src/irc/irc_client.hpp b/src/irc/irc_client.hpp
index 88d2d72..9bef04a 100644
--- a/src/irc/irc_client.hpp
+++ b/src/irc/irc_client.hpp
@@ -172,6 +172,10 @@ public:
*/
void on_nickname_conflict(const IrcMessage& message);
/**
+ * Idem, but for when the user changes their nickname too quickly
+ */
+ void on_nickname_change_too_fast(const IrcMessage& message);
+ /**
* Handles most errors from the server by just forwarding the message to the user.
*/
void on_generic_error(const IrcMessage& message);
@@ -317,6 +321,7 @@ static const std::unordered_map<std::string, irc_callback_t> irc_callbacks = {
{"366", &IrcClient::on_channel_completely_joined},
{"432", &IrcClient::on_erroneous_nickname},
{"433", &IrcClient::on_nickname_conflict},
+ {"438", &IrcClient::on_nickname_change_too_fast},
{"001", &IrcClient::on_welcome_message},
{"PART", &IrcClient::on_part},
{"ERROR", &IrcClient::on_error},