summaryrefslogtreecommitdiff
path: root/src/irc/irc_client.cpp
diff options
context:
space:
mode:
authorlouiz’ <louiz@louiz.org>2016-06-14 20:14:36 +0200
committerlouiz’ <louiz@louiz.org>2016-06-14 20:14:36 +0200
commit80d0c19c5a8d548a8c6019033bf574ff2be4c0ce (patch)
treec02303b06ee6a7603f175aab767f3d5742152c4b /src/irc/irc_client.cpp
parent19bca5c2f2b104d534a7c8be7f61dc48d928cf24 (diff)
downloadbiboumi-80d0c19c5a8d548a8c6019033bf574ff2be4c0ce.tar.gz
biboumi-80d0c19c5a8d548a8c6019033bf574ff2be4c0ce.tar.bz2
biboumi-80d0c19c5a8d548a8c6019033bf574ff2be4c0ce.tar.xz
biboumi-80d0c19c5a8d548a8c6019033bf574ff2be4c0ce.zip
Refactor, test and improve the way we cut too-long messages for IRC
Diffstat (limited to 'src/irc/irc_client.cpp')
-rw-r--r--src/irc/irc_client.cpp17
1 files changed, 8 insertions, 9 deletions
diff --git a/src/irc/irc_client.cpp b/src/irc/irc_client.cpp
index e320db9..2cf0840 100644
--- a/src/irc/irc_client.cpp
+++ b/src/irc/irc_client.cpp
@@ -9,6 +9,7 @@
#include <config/config.hpp>
#include <utils/tolower.hpp>
#include <utils/split.hpp>
+#include <utils/string.hpp>
#include <sstream>
#include <iostream>
@@ -455,15 +456,13 @@ bool IrcClient::send_channel_message(const std::string& chan_name, const std::st
log_warning("Cannot send message to channel ", chan_name, ", it is not joined");
return false;
}
- // Cut the message body into 400-bytes parts (because the whole command
- // must fit into 512 bytes, that's an easy way to make sure the chan name
- // + body fits. I’m lazy.)
- std::string::size_type pos = 0;
- while (pos < body.size())
- {
- this->send_message(IrcMessage("PRIVMSG", {chan_name, body.substr(pos, 400)}));
- pos += 400;
- }
+ // Cut the message body into 512-bytes parts, because the whole command
+ // must fit into 512 bytes.
+ // Count the ':' at the start of the text, and two spaces
+ const auto line_size = 512 - ::strlen("PRIVMSG") - chan_name.length() - 3;
+ const auto lines = cut(body, line_size);
+ for (const auto& line: lines)
+ this->send_message(IrcMessage("PRIVMSG", {chan_name, line}));
return true;
}