Send XMPP multi-line messages as multiple IRC messages
This commit is contained in:
+12
-5
@@ -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)
|
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())
|
if (iid.chan.empty() || iid.server.empty())
|
||||||
{
|
{
|
||||||
std::cout << "Cannot send message to channel: [" << iid.chan << "] on server [" << iid.server << "]" << std::endl;
|
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;
|
std::cout << "Cannot send message: no client exist for server " << iid.server << std::endl;
|
||||||
return;
|
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);
|
irc->send_mode_command(iid.chan, args);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (body.substr(0, 4) == "/me ")
|
if (first_line.substr(0, 4) == "/me ")
|
||||||
irc->send_channel_message(iid.chan, action_prefix + body.substr(4) + "\01");
|
irc->send_channel_message(iid.chan, action_prefix + first_line.substr(4) + "\01");
|
||||||
else
|
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,
|
// We do not need to convert body to utf-8: it comes from our XMPP server,
|
||||||
// so it's ok to send it back
|
// 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);
|
this->xmpp->send_muc_message(iid.chan + "%" + iid.server, irc->get_own_nick(), body, this->user_jid);
|
||||||
|
|||||||
+23
-8
@@ -2,18 +2,18 @@
|
|||||||
* Just a very simple test suite, by hand, using assert()
|
* Just a very simple test suite, by hand, using assert()
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <assert.h>
|
#include <xmpp/xmpp_parser.hpp>
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
#include <bridge/colors.hpp>
|
|
||||||
#include <utils/encoding.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 <string.h>
|
||||||
|
|
||||||
#include <config/config.hpp>
|
#include <iostream>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include <xmpp/jid.hpp>
|
#include <assert.h>
|
||||||
#include <xmpp/xmpp_parser.hpp>
|
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
@@ -48,6 +48,21 @@ int main()
|
|||||||
remove_irc_colors(coucou);
|
remove_irc_colors(coucou);
|
||||||
assert(coucou == "COUCOU");
|
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
|
* XML parsing
|
||||||
*/
|
*/
|
||||||
|
|||||||
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
namespace utils
|
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::vector<std::string> ret;
|
||||||
std::stringstream ss(s);
|
std::stringstream ss(s);
|
||||||
|
|||||||
Reference in New Issue
Block a user