M louloulibs/utils/string.cpp => louloulibs/utils/string.cpp +12 -0
@@ 4,3 4,15 @@ bool to_bool(const std::string& val)
{
return (val == "1" || val == "true");
}
+
+std::vector<std::string> cut(const std::string& val, const std::size_t size)
+{
+ std::vector<std::string> res;
+ std::string::size_type pos = 0;
+ while (pos < val.size())
+ {
+ res.emplace_back(val.substr(pos, size));
+ pos += size;
+ }
+ return res;
+}
M louloulibs/utils/string.hpp => louloulibs/utils/string.hpp +2 -0
@@ 1,8 1,10 @@
#ifndef STRING_UTILS_HPP_INCLUDED
#define STRING_UTILS_HPP_INCLUDED
+#include <vector>
#include <string>
bool to_bool(const std::string& val);
+std::vector<std::string> cut(const std::string& val, const std::size_t size);
#endif /* STRING_UTILS_HPP_INCLUDED */
M src/irc/irc_client.cpp => src/irc/irc_client.cpp +8 -9
@@ 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;
}
M tests/utils.cpp => tests/utils.cpp +6 -0
@@ 88,3 88,9 @@ TEST_CASE("empty if fixed irc server")
}
}
+
+TEST_CASE("string cut")
+{
+ CHECK(cut("coucou", 2).size() == 3);
+ CHECK(cut("bonjour les copains", 6).size() == 4);
+}<
\ No newline at end of file