summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorent Le Coz <louiz@louiz.org>2013-11-17 11:35:43 +0100
committerFlorent Le Coz <louiz@louiz.org>2013-11-21 00:35:15 +0100
commit1e122d3342ef4336f17bd5606be7101748627415 (patch)
tree06ef6b0698865d2a13404190d726f680adb536ea
parenta85e1abaaa5fe4f6cd9da7276088d14bf5f2c41f (diff)
downloadbiboumi-1e122d3342ef4336f17bd5606be7101748627415.tar.gz
biboumi-1e122d3342ef4336f17bd5606be7101748627415.tar.bz2
biboumi-1e122d3342ef4336f17bd5606be7101748627415.tar.xz
biboumi-1e122d3342ef4336f17bd5606be7101748627415.zip
Send the motd as one single big message
We append each line to a string, and when the MOTD is complete, we send that string at once.
-rw-r--r--src/irc/irc_client.cpp21
-rw-r--r--src/irc/irc_client.hpp25
2 files changed, 44 insertions, 2 deletions
diff --git a/src/irc/irc_client.cpp b/src/irc/irc_client.cpp
index 82abbd9..f339580 100644
--- a/src/irc/irc_client.cpp
+++ b/src/irc/irc_client.cpp
@@ -222,6 +222,27 @@ void IrcClient::on_channel_message(const IrcMessage& message)
this->bridge->send_message(iid, nick, body, muc);
}
+void IrcClient::empty_motd(const IrcMessage& message)
+{
+ (void)message;
+ this->motd.erase();
+}
+
+void IrcClient::on_motd_line(const IrcMessage& message)
+{
+ const std::string body = message.arguments[1];
+ // We could send the MOTD without a line break between each IRC-message,
+ // but sometimes it contains some ASCII art, we use line breaks to keep
+ // them intact.
+ this->motd += body+"\n";
+}
+
+void IrcClient::send_motd(const IrcMessage& message)
+{
+ (void)message;
+ this->bridge->send_xmpp_message(this->hostname, "", this->motd);
+}
+
void IrcClient::on_topic_received(const IrcMessage& message)
{
const std::string chan_name = message.arguments[1];
diff --git a/src/irc/irc_client.hpp b/src/irc/irc_client.hpp
index 3b22fa0..aa420f4 100644
--- a/src/irc/irc_client.hpp
+++ b/src/irc/irc_client.hpp
@@ -100,6 +100,18 @@ public:
*/
void forward_server_message(const IrcMessage& message);
/**
+ * Just empty the motd we kept as a string
+ */
+ void empty_motd(const IrcMessage& message);
+ /**
+ * Send the MOTD string as one single "big" message
+ */
+ void send_motd(const IrcMessage& message);
+ /**
+ * Append this line to the MOTD
+ */
+ void on_motd_line(const IrcMessage& message);
+ /**
* Forward the join of an other user into an IRC channel, and save the
* IrcUsers in the IrcChannel
*/
@@ -172,6 +184,11 @@ private:
*/
std::vector<std::string> channels_to_join;
bool welcomed;
+ /**
+ * Each motd line received is appended to this string, which we send when
+ * the motd is completely received
+ */
+ std::string motd;
IrcClient(const IrcClient&) = delete;
IrcClient(IrcClient&&) = delete;
IrcClient& operator=(const IrcClient&) = delete;
@@ -186,8 +203,12 @@ typedef void (IrcClient::*irc_callback_t)(const IrcMessage&);
static const std::unordered_map<std::string, irc_callback_t> irc_callbacks = {
{"NOTICE", &IrcClient::forward_server_message},
- {"375", &IrcClient::forward_server_message},
- {"372", &IrcClient::forward_server_message},
+ {"RPL_MOTDSTART", &IrcClient::empty_motd},
+ {"375", &IrcClient::empty_motd},
+ {"RPL_MOTD", &IrcClient::on_motd_line},
+ {"372", &IrcClient::on_motd_line},
+ {"RPL_MOTDEND", &IrcClient::send_motd},
+ {"376", &IrcClient::send_motd},
{"JOIN", &IrcClient::on_channel_join},
{"PRIVMSG", &IrcClient::on_channel_message},
{"353", &IrcClient::set_and_forward_user_list},