~singpolyma/biboumi

80d0c19c5a8d548a8c6019033bf574ff2be4c0ce — louiz’ 7 years ago 19bca5c
Refactor, test and improve the way we cut too-long messages for IRC
4 files changed, 28 insertions(+), 9 deletions(-)

M louloulibs/utils/string.cpp
M louloulibs/utils/string.hpp
M src/irc/irc_client.cpp
M tests/utils.cpp
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