From 579ca4bdb6b8806d821daa2ee47d60260b64f0f8 Mon Sep 17 00:00:00 2001 From: Florent Le Coz Date: Wed, 7 May 2014 02:02:47 +0200 Subject: Forward iq version results to IRC --- src/bridge/bridge.cpp | 11 +++++++++-- src/bridge/bridge.hpp | 3 ++- src/irc/irc_client.cpp | 4 ++-- src/irc/irc_client.hpp | 2 +- src/xmpp/xmpp_component.cpp | 18 ++++++++++++++++++ 5 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/bridge/bridge.cpp b/src/bridge/bridge.cpp index 6c85722..f9dc9a6 100644 --- a/src/bridge/bridge.cpp +++ b/src/bridge/bridge.cpp @@ -170,13 +170,13 @@ void Bridge::send_channel_message(const Iid& iid, const std::string& body) this->make_xmpp_body(body), this->user_jid); } -void Bridge::send_private_message(const Iid& iid, const std::string& body) +void Bridge::send_private_message(const Iid& iid, const std::string& body, const std::string& type) { 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); + irc->send_private_message(iid.chan, body, type); } void Bridge::leave_irc_channel(Iid&& iid, std::string&& status_message) @@ -207,6 +207,13 @@ void Bridge::set_channel_topic(const Iid& iid, const std::string& subject) irc->send_topic_command(iid.chan, subject); } +void Bridge::send_xmpp_version_to_irc(const Iid& iid, const std::string& name, const std::string& version, const std::string& os) +{ + std::string result(name + " " + version + " " + os); + + this->send_private_message(iid, "\01VERSION "s + result + "\01", "NOTICE"); +} + void Bridge::send_message(const Iid& iid, const std::string& nick, const std::string& body, const bool muc) { if (muc) diff --git a/src/bridge/bridge.hpp b/src/bridge/bridge.hpp index f2da8d7..d0fd5bd 100644 --- a/src/bridge/bridge.hpp +++ b/src/bridge/bridge.hpp @@ -45,11 +45,12 @@ public: */ bool 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 send_private_message(const Iid& iid, const std::string& body, const std::string& type="PRIVMSG"); void leave_irc_channel(Iid&& iid, std::string&& status_message); void send_irc_nick_change(const Iid& iid, const std::string& new_nick); void send_irc_kick(const Iid& iid, const std::string& target, const std::string& reason); void set_channel_topic(const Iid& iid, const std::string& subject); + void send_xmpp_version_to_irc(const Iid& iid, const std::string& name, const std::string& version, const std::string& os); /*** ** diff --git a/src/irc/irc_client.cpp b/src/irc/irc_client.cpp index 5f70efb..c149311 100644 --- a/src/irc/irc_client.cpp +++ b/src/irc/irc_client.cpp @@ -192,12 +192,12 @@ 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) +void IrcClient::send_private_message(const std::string& username, const std::string& body, const std::string& type) { std::string::size_type pos = 0; while (pos < body.size()) { - this->send_message(IrcMessage("PRIVMSG", {username, body.substr(pos, 400)})); + this->send_message(IrcMessage(std::string(type), {username, body.substr(pos, 400)})); pos += 400; } diff --git a/src/irc/irc_client.hpp b/src/irc/irc_client.hpp index 849190a..a2e2afe 100644 --- a/src/irc/irc_client.hpp +++ b/src/irc/irc_client.hpp @@ -88,7 +88,7 @@ public: /** * Send a PRIVMSG command for an user */ - void send_private_message(const std::string& username, const std::string& body); + void send_private_message(const std::string& username, const std::string& body, const std::string& type); /** * Send the PART irc command */ diff --git a/src/xmpp/xmpp_component.cpp b/src/xmpp/xmpp_component.cpp index eb23087..967614c 100644 --- a/src/xmpp/xmpp_component.cpp +++ b/src/xmpp/xmpp_component.cpp @@ -444,6 +444,24 @@ void XmppComponent::handle_iq(const Stanza& stanza) else if (type == "result") { stanza_error.disable(); + XmlNode* query; + if ((query = stanza.get_child(VERSION_NS":query"))) + { + XmlNode* name_node = query->get_child(VERSION_NS":name"); + XmlNode* version_node = query->get_child(VERSION_NS":version"); + XmlNode* os_node = query->get_child(VERSION_NS":os"); + std::string name; + std::string version; + std::string os; + if (name_node) + name = name_node->get_inner() + " (through the biboumi gateway)"; + if (version_node) + version = version_node->get_inner(); + if (os_node) + os = os_node->get_inner(); + const Iid iid(to.local); + bridge->send_xmpp_version_to_irc(iid, name, version, os); + } } error_type = "cancel"; error_name = "feature-not-implemented"; -- cgit v1.2.3