Refactor, test and improve the way we cut too-long messages for IRC
This commit is contained in:
@@ -4,3 +4,15 @@ bool to_bool(const std::string& val)
|
|||||||
{
|
{
|
||||||
return (val == "1" || val == "true");
|
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;
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
#ifndef STRING_UTILS_HPP_INCLUDED
|
#ifndef STRING_UTILS_HPP_INCLUDED
|
||||||
#define STRING_UTILS_HPP_INCLUDED
|
#define STRING_UTILS_HPP_INCLUDED
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
bool to_bool(const std::string& val);
|
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 */
|
#endif /* STRING_UTILS_HPP_INCLUDED */
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
#include <config/config.hpp>
|
#include <config/config.hpp>
|
||||||
#include <utils/tolower.hpp>
|
#include <utils/tolower.hpp>
|
||||||
#include <utils/split.hpp>
|
#include <utils/split.hpp>
|
||||||
|
#include <utils/string.hpp>
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <iostream>
|
#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");
|
log_warning("Cannot send message to channel ", chan_name, ", it is not joined");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// Cut the message body into 400-bytes parts (because the whole command
|
// Cut the message body into 512-bytes parts, because the whole command
|
||||||
// must fit into 512 bytes, that's an easy way to make sure the chan name
|
// must fit into 512 bytes.
|
||||||
// + body fits. I’m lazy.)
|
// Count the ':' at the start of the text, and two spaces
|
||||||
std::string::size_type pos = 0;
|
const auto line_size = 512 - ::strlen("PRIVMSG") - chan_name.length() - 3;
|
||||||
while (pos < body.size())
|
const auto lines = cut(body, line_size);
|
||||||
{
|
for (const auto& line: lines)
|
||||||
this->send_message(IrcMessage("PRIVMSG", {chan_name, body.substr(pos, 400)}));
|
this->send_message(IrcMessage("PRIVMSG", {chan_name, line}));
|
||||||
pos += 400;
|
|
||||||
}
|
|
||||||
return true;
|
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);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user