From 15d057e92be9b2356fe6392dbb6586b319cb6914 Mon Sep 17 00:00:00 2001 From: Green Sky Date: Mon, 18 Dec 2023 00:38:55 +0100 Subject: [PATCH] split messages by newline --- .../ircclient_message_manager.cpp | 33 ++++++++----- .../ircclient_messages/string_view_split.hpp | 49 +++++++++++++++++++ 2 files changed, 70 insertions(+), 12 deletions(-) create mode 100644 src/solanaceae/ircclient_messages/string_view_split.hpp diff --git a/src/solanaceae/ircclient_messages/ircclient_message_manager.cpp b/src/solanaceae/ircclient_messages/ircclient_message_manager.cpp index 067f8c1..277788b 100644 --- a/src/solanaceae/ircclient_messages/ircclient_message_manager.cpp +++ b/src/solanaceae/ircclient_messages/ircclient_message_manager.cpp @@ -9,6 +9,8 @@ #include #include +#include "./string_view_split.hpp" + #include #include #include @@ -120,20 +122,27 @@ bool IRCClientMessageManager::sendText(const Contact3 c, std::string_view messag } { // actually send - std::string tmp_message{message}; // string_view might not be nul terminated - if (action) { - if (irc_cmd_me(_ircc.getSession(), to_str.c_str(), tmp_message.c_str()) != 0) { - std::cerr << "IRCCMM error: failed to send action\n"; - - // we dont have offline messaging in irc - return false; + // split message by line + for (const auto& inner_str : MM::std_utils::split(message, "\n")) { + if (inner_str.empty()) { + continue; } - } else { - if (irc_cmd_msg(_ircc.getSession(), to_str.c_str(), tmp_message.c_str()) != 0) { - std::cerr << "IRCCMM error: failed to send message\n"; - // we dont have offline messaging in irc - return false; + std::string tmp_message{inner_str}; // string_view might not be nul terminated + if (action) { + if (irc_cmd_me(_ircc.getSession(), to_str.c_str(), tmp_message.c_str()) != 0) { + std::cerr << "IRCCMM error: failed to send action\n"; + + // we dont have offline messaging in irc + return false; + } + } else { + if (irc_cmd_msg(_ircc.getSession(), to_str.c_str(), tmp_message.c_str()) != 0) { + std::cerr << "IRCCMM error: failed to send message\n"; + + // we dont have offline messaging in irc + return false; + } } } } diff --git a/src/solanaceae/ircclient_messages/string_view_split.hpp b/src/solanaceae/ircclient_messages/string_view_split.hpp new file mode 100644 index 0000000..4ea6300 --- /dev/null +++ b/src/solanaceae/ircclient_messages/string_view_split.hpp @@ -0,0 +1,49 @@ +#pragma once + +#include +#include +#include + +namespace MM::std_utils { + +inline std::string_view trim_prefix(std::string_view sv) { + while (!sv.empty() && std::isspace(sv.front())) { + sv.remove_prefix(1); + } + + return sv; +} + +inline std::string_view trim_suffix(std::string_view sv) { + while (!sv.empty() && std::isspace(sv.back())) { + sv.remove_suffix(1); + } + + return sv; +} + +inline std::string_view trim(std::string_view sv) { + return trim_suffix(trim_prefix(sv)); +} + +// src : https://marcoarena.wordpress.com/2017/01/03/string_view-odi-et-amo/ +inline std::vector split(std::string_view str, const char* delims) { + std::vector ret; + + std::string_view::size_type start = 0; + auto pos = str.find_first_of(delims, start); + while (pos != std::string_view::npos) { + if (pos != start) { + ret.push_back(str.substr(start, pos - start)); + } + start = pos + 1; + pos = str.find_first_of(delims, start); + } + if (start < str.length()) + ret.push_back(str.substr(start, str.length() - start)); + + return ret; +} + +} // MM::std_utils +