summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorent Le Coz <louiz@louiz.org>2013-11-10 06:33:04 +0100
committerFlorent Le Coz <louiz@louiz.org>2013-11-10 06:33:04 +0100
commit10d528717723a72dd3240c634980a461cf9fa2df (patch)
tree51f640715c78b4d76a04a4952edb5c6a5acf6de0
parent7ba2d0fb45e7466e6fb38002bf1866d1f5e39c28 (diff)
downloadbiboumi-10d528717723a72dd3240c634980a461cf9fa2df.tar.gz
biboumi-10d528717723a72dd3240c634980a461cf9fa2df.tar.bz2
biboumi-10d528717723a72dd3240c634980a461cf9fa2df.tar.xz
biboumi-10d528717723a72dd3240c634980a461cf9fa2df.zip
Handle private messages, both ways
-rw-r--r--src/bridge/bridge.cpp22
-rw-r--r--src/bridge/bridge.hpp3
-rw-r--r--src/irc/irc_client.cpp13
-rw-r--r--src/irc/irc_client.hpp4
-rw-r--r--src/xmpp/xmpp_component.cpp5
5 files changed, 39 insertions, 8 deletions
diff --git a/src/bridge/bridge.cpp b/src/bridge/bridge.cpp
index 89a6231..1f394bf 100644
--- a/src/bridge/bridge.cpp
+++ b/src/bridge/bridge.cpp
@@ -87,6 +87,15 @@ void Bridge::send_channel_message(const Iid& iid, const std::string& body)
this->xmpp->send_muc_message(iid.chan + "%" + iid.server, irc->get_own_nick(), body, this->user_jid);
}
+void Bridge::send_private_message(const Iid& iid, const std::string& body)
+{
+ if (iid.chan.empty() || iid.server.empty())
+ return ;
+ IrcClient* irc = this->get_irc_client(iid.server);
+ if (irc)
+ irc->send_private_message(iid.chan, body);
+}
+
void Bridge::leave_irc_channel(Iid&& iid, std::string&& status_message)
{
IrcClient* irc = this->get_irc_client(iid.server);
@@ -94,18 +103,19 @@ void Bridge::leave_irc_channel(Iid&& iid, std::string&& status_message)
irc->send_part_command(iid.chan, status_message);
}
-void Bridge::send_muc_message(const Iid& iid, const std::string& nick, const std::string& body)
+void Bridge::send_message(const Iid& iid, const std::string& nick, const std::string& body, const bool muc)
{
- const std::string& utf8_body = this->sanitize_for_xmpp(body);
+ std::string utf8_body = this->sanitize_for_xmpp(body);
if (utf8_body.substr(0, action_prefix_len) == action_prefix)
{ // Special case for ACTION (/me) messages:
// "\01ACTION goes out\01" == "/me goes out"
- this->xmpp->send_muc_message(iid.chan + "%" + iid.server, nick,
- std::string("/me ") + utf8_body.substr(action_prefix_len, utf8_body.size() - action_prefix_len - 1),
- this->user_jid);
+ utf8_body = std::string("/me ") +
+ utf8_body.substr(action_prefix_len, utf8_body.size() - action_prefix_len - 1);
}
- else
+ if (muc)
this->xmpp->send_muc_message(iid.chan + "%" + iid.server, nick, utf8_body, this->user_jid);
+ else
+ this->xmpp->send_message(iid.chan + "%" + iid.server, utf8_body, this->user_jid);
}
void Bridge::send_muc_leave(Iid&& iid, std::string&& nick, std::string&& message, const bool self)
diff --git a/src/bridge/bridge.hpp b/src/bridge/bridge.hpp
index 93bb321..e0f4598 100644
--- a/src/bridge/bridge.hpp
+++ b/src/bridge/bridge.hpp
@@ -32,6 +32,7 @@ public:
void join_irc_channel(const Iid& iid, const std::string& username);
void send_channel_message(const Iid& iid, const std::string& body);
+ void send_private_message(const Iid& iid, const std::string& body);
void leave_irc_channel(Iid&& iid, std::string&& status_message);
/***
@@ -60,7 +61,7 @@ public:
/**
* Send a MUC message from some participant
*/
- void send_muc_message(const Iid& iid, const std::string& nick, const std::string& body);
+ void send_message(const Iid& iid, const std::string& nick, const std::string& body, const bool muc);
/**
* Send an unavailable presence from this participant
*/
diff --git a/src/irc/irc_client.cpp b/src/irc/irc_client.cpp
index 8de7c8f..71b0fe2 100644
--- a/src/irc/irc_client.cpp
+++ b/src/irc/irc_client.cpp
@@ -147,6 +147,11 @@ bool IrcClient::send_channel_message(const std::string& chan_name, const std::st
return true;
}
+void IrcClient::send_private_message(const std::string& username, const std::string& body)
+{
+ this->send_message(IrcMessage("PRIVMSG", {username, body}));
+}
+
void IrcClient::send_part_command(const std::string& chan_name, const std::string& status_message)
{
IrcChannel* channel = this->get_channel(chan_name);
@@ -211,7 +216,13 @@ void IrcClient::on_channel_message(const IrcMessage& message)
iid.chan = message.arguments[0];
iid.server = this->hostname;
const std::string body = message.arguments[1];
- this->bridge->send_muc_message(iid, nick, body);
+ bool muc = true;
+ if (!this->get_channel(iid.chan)->joined)
+ {
+ iid.chan = nick;
+ muc = false;
+ }
+ this->bridge->send_message(iid, nick, body, muc);
}
void IrcClient::on_topic_received(const IrcMessage& message)
diff --git a/src/irc/irc_client.hpp b/src/irc/irc_client.hpp
index 33ab894..bb51a4e 100644
--- a/src/irc/irc_client.hpp
+++ b/src/irc/irc_client.hpp
@@ -76,6 +76,10 @@ public:
*/
bool send_channel_message(const std::string& chan_name, const std::string& body);
/**
+ * Send a PRIVMSG command for an user
+ */
+ void send_private_message(const std::string& username, const std::string& body);
+ /**
* Send the PART irc command
*/
void send_part_command(const std::string& chan_name, const std::string& status_message);
diff --git a/src/xmpp/xmpp_component.cpp b/src/xmpp/xmpp_component.cpp
index ba45fe4..7cf2ce0 100644
--- a/src/xmpp/xmpp_component.cpp
+++ b/src/xmpp/xmpp_component.cpp
@@ -188,6 +188,11 @@ void XmppComponent::handle_message(const Stanza& stanza)
if (body && !body->get_inner().empty())
bridge->send_channel_message(iid, body->get_inner());
}
+ else
+ {
+ if (body && !body->get_inner().empty())
+ bridge->send_private_message(iid, body->get_inner());
+ }
}
Bridge* XmppComponent::get_user_bridge(const std::string& user_jid)