Commit 80d0c19c authored by louiz’'s avatar louiz’

Refactor, test and improve the way we cut too-long messages for IRC

parent 19bca5c2
......@@ -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;
}
#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 */
......@@ -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;
}
......
......@@ -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
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment