From 10d528717723a72dd3240c634980a461cf9fa2df Mon Sep 17 00:00:00 2001 From: Florent Le Coz Date: Sun, 10 Nov 2013 06:33:04 +0100 Subject: Handle private messages, both ways --- src/bridge/bridge.cpp | 22 ++++++++++++++++------ src/bridge/bridge.hpp | 3 ++- src/irc/irc_client.cpp | 13 ++++++++++++- src/irc/irc_client.hpp | 4 ++++ src/xmpp/xmpp_component.cpp | 5 +++++ 5 files changed, 39 insertions(+), 8 deletions(-) (limited to 'src') 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 @@ -75,6 +75,10 @@ public: * Return true if the message was actually sent */ 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 */ 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) -- cgit v1.2.3