~singpolyma/biboumi

6c2d03da4ea0443624b6bf434b6a654c12e48438 — Florent Le Coz 8 years ago 7b31bea
Send an error presence when the connection to the IRC server fails
M src/bridge/bridge.cpp => src/bridge/bridge.cpp +5 -0
@@ 241,6 241,11 @@ void Bridge::send_message(const Iid& iid, const std::string& nick, const std::st
                             this->make_xmpp_body(body), this->user_jid, "chat");
}

void Bridge::send_join_failed(const Iid& iid, const std::string& nick, const std::string& type, const std::string& condition, const std::string& text)
{
  this->xmpp->send_presence_error(iid.chan + "%" + iid.server, nick, this->user_jid, type, condition, text);
}

void Bridge::send_muc_leave(Iid&& iid, std::string&& nick, const std::string& message, const bool self)
{
  this->xmpp->send_muc_leave(std::move(iid.chan) + "%" + std::move(iid.server), std::move(nick), this->make_xmpp_body(message), this->user_jid, self);

M src/bridge/bridge.hpp => src/bridge/bridge.hpp +5 -0
@@ 81,6 81,11 @@ public:
   */
  void send_message(const Iid& iid, const std::string& nick, const std::string& body, const bool muc);
  /**
   * Send a presence of type error, from a room. This is used to indicate
   * why joining a room failed.
   */
  void send_join_failed(const Iid& iid, const std::string& nick, const std::string& type, const std::string& condition, const std::string& text);
  /**
   * Send an unavailable presence from this participant
   */
  void send_muc_leave(Iid&& iid, std::string&& nick, const std::string& message, const bool self);

M src/irc/irc_client.cpp => src/irc/irc_client.cpp +8 -1
@@ 50,6 50,13 @@ void IrcClient::on_connection_failed(const std::string& reason)
{
  this->bridge->send_xmpp_message(this->hostname, "",
                                  "Connection failed: "s + reason);
  // Send an error message for all room that the user wanted to join
  for (const std::string& channel: this->channels_to_join)
    {
      Iid iid(channel + "%" + this->hostname);
      this->bridge->send_join_failed(iid, this->current_nick,
                                     "cancel", "item-not-found", reason);
    }
}

void IrcClient::on_connected()


@@ 167,11 174,11 @@ void IrcClient::send_quit_command(const std::string& reason)

void IrcClient::send_join_command(const std::string& chan_name)
{
  this->start();
  if (this->welcomed == false)
    this->channels_to_join.push_back(chan_name);
  else
    this->send_message(IrcMessage("JOIN", {chan_name}));
  this->start();
}

bool IrcClient::send_channel_message(const std::string& chan_name, const std::string& body)

M src/xmpp/xmpp_component.cpp => src/xmpp/xmpp_component.cpp +27 -0
@@ 796,6 796,33 @@ void XmppComponent::send_nickname_conflict_error(const std::string& muc_name,
  this->send_stanza(presence);
}

void XmppComponent::send_presence_error(const std::string& muc_name,
                                   const std::string& nickname,
                                   const std::string& jid_to,
                                   const std::string& type,
                                   const std::string& condition,
                                   const std::string&)
{
  Stanza presence("presence");
  presence["from"] = muc_name + "@" + this->served_hostname + "/" + nickname;
  presence["to"] = jid_to;
  XmlNode x("x");
  x["xmlns"] = MUC_NS;
  x.close();
  presence.add_child(std::move(x));
  XmlNode error("error");
  error["by"] = muc_name + "@" + this->served_hostname;
  error["type"] = type;
  XmlNode subnode(condition);
  subnode["xmlns"] = STANZA_NS;
  subnode.close();
  error.add_child(std::move(subnode));
  error.close();
  presence.add_child(std::move(error));
  presence.close();
  this->send_stanza(presence);
}

void XmppComponent::send_affiliation_role_change(const std::string& muc_name,
                                                 const std::string& target,
                                                 const std::string& affiliation,

M src/xmpp/xmpp_component.hpp => src/xmpp/xmpp_component.hpp +9 -0
@@ 142,6 142,15 @@ public:
                                    const std::string& nickname,
                                    const std::string& jid_to);
  /**
   * Send a generic presence error
   */
  void send_presence_error(const std::string& muc_name,
                      const std::string& nickname,
                      const std::string& jid_to,
                      const std::string& type,
                      const std::string& condition,
                      const std::string& text);
  /**
   * Send a presence from the MUC indicating a change in the role and/or
   * affiliation of a participant
   */