diff options
author | Florent Le Coz <louiz@louiz.org> | 2013-11-21 00:58:14 +0100 |
---|---|---|
committer | Florent Le Coz <louiz@louiz.org> | 2013-11-21 00:58:14 +0100 |
commit | bfcc9cdc7462c515c308592735bc661103fb92b5 (patch) | |
tree | 60b3a715ef01bb75786fd238ab683f430a9e5d3d | |
parent | 70a58a8f7152e775a1c6cdc15b3c9f23a7719f85 (diff) | |
download | biboumi-bfcc9cdc7462c515c308592735bc661103fb92b5.tar.gz biboumi-bfcc9cdc7462c515c308592735bc661103fb92b5.tar.bz2 biboumi-bfcc9cdc7462c515c308592735bc661103fb92b5.tar.xz biboumi-bfcc9cdc7462c515c308592735bc661103fb92b5.zip |
Send XMPP multi-line messages as multiple IRC messages
-rw-r--r-- | src/bridge/bridge.cpp | 17 | ||||
-rw-r--r-- | src/test.cpp | 31 | ||||
-rw-r--r-- | src/utils/split.cpp | 2 |
3 files changed, 36 insertions, 14 deletions
diff --git a/src/bridge/bridge.cpp b/src/bridge/bridge.cpp index e39cdd3..e24ab88 100644 --- a/src/bridge/bridge.cpp +++ b/src/bridge/bridge.cpp @@ -73,6 +73,10 @@ bool Bridge::join_irc_channel(const Iid& iid, const std::string& username) void Bridge::send_channel_message(const Iid& iid, const std::string& body) { + std::vector<std::string> lines = utils::split(body, '\n', true); + if (lines.empty()) + return ; + const std::string first_line = lines[0]; if (iid.chan.empty() || iid.server.empty()) { std::cout << "Cannot send message to channel: [" << iid.chan << "] on server [" << iid.server << "]" << std::endl; @@ -84,16 +88,19 @@ void Bridge::send_channel_message(const Iid& iid, const std::string& body) std::cout << "Cannot send message: no client exist for server " << iid.server << std::endl; return; } - if (body.substr(0, 6) == "/mode ") + if (first_line.substr(0, 6) == "/mode ") { - std::vector<std::string> args = utils::split(body.substr(6), ' ', false); + std::vector<std::string> args = utils::split(first_line.substr(6), ' ', false); irc->send_mode_command(iid.chan, args); return; } - if (body.substr(0, 4) == "/me ") - irc->send_channel_message(iid.chan, action_prefix + body.substr(4) + "\01"); + if (first_line.substr(0, 4) == "/me ") + irc->send_channel_message(iid.chan, action_prefix + first_line.substr(4) + "\01"); else - irc->send_channel_message(iid.chan, body); + irc->send_channel_message(iid.chan, first_line); + // Send each of the other lines of the message as a separate IRC message + for (std::vector<std::string>::const_iterator it = lines.begin() + 1; it != lines.end(); ++it) + irc->send_channel_message(iid.chan, *it); // We do not need to convert body to utf-8: it comes from our XMPP server, // so it's ok to send it back this->xmpp->send_muc_message(iid.chan + "%" + iid.server, irc->get_own_nick(), body, this->user_jid); diff --git a/src/test.cpp b/src/test.cpp index 9cb48b7..aa1ccde 100644 --- a/src/test.cpp +++ b/src/test.cpp @@ -2,18 +2,18 @@ * Just a very simple test suite, by hand, using assert() */ -#include <assert.h> - -#include <iostream> - -#include <bridge/colors.hpp> +#include <xmpp/xmpp_parser.hpp> #include <utils/encoding.hpp> +#include <config/config.hpp> +#include <bridge/colors.hpp> +#include <utils/split.hpp> +#include <xmpp/jid.hpp> #include <string.h> -#include <config/config.hpp> +#include <iostream> +#include <vector> -#include <xmpp/jid.hpp> -#include <xmpp/xmpp_parser.hpp> +#include <assert.h> int main() { @@ -49,6 +49,21 @@ int main() assert(coucou == "COUCOU"); /** + * Utils + */ + std::vector<std::string> splitted = utils::split("a::a", ':', false); + assert(splitted.size() == 2); + splitted = utils::split("a::a", ':', true); + assert(splitted.size() == 3); + assert(splitted[0] == "a"); + assert(splitted[1] == ""); + assert(splitted[2] == "a"); + splitted = utils::split("\na", '\n', true); + assert(splitted.size() == 2); + assert(splitted[0] == ""); + assert(splitted[1] == "a"); + + /** * XML parsing */ XmppParser xml; diff --git a/src/utils/split.cpp b/src/utils/split.cpp index 82852ee..afe4300 100644 --- a/src/utils/split.cpp +++ b/src/utils/split.cpp @@ -2,7 +2,7 @@ namespace utils { - std::vector<std::string> split(const std::string &s, const char delim, const bool allow_empty) + std::vector<std::string> split(const std::string& s, const char delim, const bool allow_empty) { std::vector<std::string> ret; std::stringstream ss(s); |