M src/bridge/bridge.cpp => src/bridge/bridge.cpp +9 -2
@@ 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)
M src/bridge/bridge.hpp => src/bridge/bridge.hpp +2 -1
@@ 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);
/***
**
M src/irc/irc_client.cpp => src/irc/irc_client.cpp +2 -2
@@ 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;
}
M src/irc/irc_client.hpp => src/irc/irc_client.hpp +1 -1
@@ 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
*/
M src/xmpp/xmpp_component.cpp => src/xmpp/xmpp_component.cpp +18 -0
@@ 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";