summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFlorent Le Coz <louiz@louiz.org>2013-11-21 00:58:14 +0100
committerFlorent Le Coz <louiz@louiz.org>2013-11-21 00:58:14 +0100
commitbfcc9cdc7462c515c308592735bc661103fb92b5 (patch)
tree60b3a715ef01bb75786fd238ab683f430a9e5d3d /src
parent70a58a8f7152e775a1c6cdc15b3c9f23a7719f85 (diff)
downloadbiboumi-bfcc9cdc7462c515c308592735bc661103fb92b5.tar.gz
biboumi-bfcc9cdc7462c515c308592735bc661103fb92b5.tar.bz2
biboumi-bfcc9cdc7462c515c308592735bc661103fb92b5.tar.xz
biboumi-bfcc9cdc7462c515c308592735bc661103fb92b5.zip
Send XMPP multi-line messages as multiple IRC messages
Diffstat (limited to 'src')
-rw-r--r--src/bridge/bridge.cpp17
-rw-r--r--src/test.cpp31
-rw-r--r--src/utils/split.cpp2
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);