summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorent Le Coz <louiz@louiz.org>2014-05-07 02:02:47 +0200
committerFlorent Le Coz <louiz@louiz.org>2014-05-07 02:02:47 +0200
commit579ca4bdb6b8806d821daa2ee47d60260b64f0f8 (patch)
tree769ea0ec97757f94eb3e6b2d1d50e504a8b868a9
parent04fe15a1e78e2bb20e490b15d45853328545c97d (diff)
downloadbiboumi-579ca4bdb6b8806d821daa2ee47d60260b64f0f8.tar.gz
biboumi-579ca4bdb6b8806d821daa2ee47d60260b64f0f8.tar.bz2
biboumi-579ca4bdb6b8806d821daa2ee47d60260b64f0f8.tar.xz
biboumi-579ca4bdb6b8806d821daa2ee47d60260b64f0f8.zip
Forward iq version results to IRC
-rw-r--r--src/bridge/bridge.cpp11
-rw-r--r--src/bridge/bridge.hpp3
-rw-r--r--src/irc/irc_client.cpp4
-rw-r--r--src/irc/irc_client.hpp2
-rw-r--r--src/xmpp/xmpp_component.cpp18
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";