~singpolyma/biboumi

5ec05cb0edda6b01ff5c21a42edf9142b90399e5 — Florent Le Coz 9 years ago f35db5c
Forward CTCP version request to XMPP
M src/bridge/bridge.cpp => src/bridge/bridge.cpp +5 -0
@@ 304,3 304,8 @@ void Bridge::send_affiliation_role_change(const Iid& iid, const std::string& tar
  std::tie(role, affiliation) = get_role_affiliation_from_irc_mode(mode);
  this->xmpp->send_affiliation_role_change(iid.chan + "%" + iid.server, target, affiliation, role, this->user_jid);
}

void Bridge::send_iq_version_request(const std::string& nick, const std::string& hostname)
{
  this->xmpp->send_iq_version_request(nick + "%" + hostname, this->user_jid);
}

M src/bridge/bridge.hpp => src/bridge/bridge.hpp +4 -0
@@ 99,6 99,10 @@ public:
   * Send a role/affiliation change, matching the change of mode for that user
   */
  void send_affiliation_role_change(const Iid& iid, const std::string& target, const char mode);
  /**
   * Send an iq version request coming from nick%hostname@
   */
  void send_iq_version_request(const std::string& nick, const std::string& hostname);

  /**
   * Misc

M src/irc/irc_client.cpp => src/irc/irc_client.cpp +2 -0
@@ 348,6 348,8 @@ void IrcClient::on_channel_message(const IrcMessage& message)
      if (body.substr(1, 6) == "ACTION")
        this->bridge->send_message(iid, nick,
                  "/me"s + body.substr(7, body.size() - 8), muc);
      else if (body.substr(1, 8) == "VERSION\01")
        this->bridge->send_iq_version_request(nick, this->hostname);
    }
  else
    this->bridge->send_message(iid, nick, body, muc);

M src/xmpp/xmpp_component.cpp => src/xmpp/xmpp_component.cpp +19 -0
@@ 28,6 28,9 @@
#define XHTMLIM_NS       "http://jabber.org/protocol/xhtml-im"
#define STANZA_NS        "urn:ietf:params:xml:ns:xmpp-stanzas"
#define STREAMS_NS       "urn:ietf:params:xml:ns:xmpp-streams"
#define VERSION_NS       "jabber:iq:version"

using namespace std::string_literals;

unsigned long XmppComponent::current_id = 0;



@@ 786,6 789,22 @@ void XmppComponent::send_self_disco_info(const std::string& id, const std::strin
  this->send_stanza(iq);
}

void XmppComponent::send_iq_version_request(const std::string& from,
                                            const std::string& jid_to)
{
  Stanza iq("iq");
  iq["type"] = "get";
  iq["id"] = "version_"s + XmppComponent::next_id();
  iq["from"] = from + "@" + this->served_hostname;
  iq["to"] = jid_to;
  XmlNode query("query");
  query["xmlns"] = VERSION_NS;
  query.close();
  iq.add_child(std::move(query));
  iq.close();
  this->send_stanza(iq);
}

std::string XmppComponent::next_id()
{
  return std::to_string(XmppComponent::current_id++);

M src/xmpp/xmpp_component.hpp => src/xmpp/xmpp_component.hpp +5 -0
@@ 155,6 155,11 @@ public:
   */
  void send_self_disco_info(const std::string& id, const std::string& jid_to);
  /**
   * Send an iq version request
   */
  void send_iq_version_request(const std::string& from,
                               const std::string& jid_to);
  /**
   * Handle the various stanza types
   */
  void handle_handshake(const Stanza& stanza);