summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorent Le Coz <louiz@louiz.org>2014-05-28 01:27:41 +0200
committerFlorent Le Coz <louiz@louiz.org>2014-05-28 01:27:41 +0200
commit6c2d03da4ea0443624b6bf434b6a654c12e48438 (patch)
treea1fd150cd3f6c114f1844bed7f57d8ce6438049f
parent7b31bea75b0c5b9fe127ea6d845e48a3f87d480f (diff)
downloadbiboumi-6c2d03da4ea0443624b6bf434b6a654c12e48438.tar.gz
biboumi-6c2d03da4ea0443624b6bf434b6a654c12e48438.tar.bz2
biboumi-6c2d03da4ea0443624b6bf434b6a654c12e48438.tar.xz
biboumi-6c2d03da4ea0443624b6bf434b6a654c12e48438.zip
Send an error presence when the connection to the IRC server fails
-rw-r--r--src/bridge/bridge.cpp5
-rw-r--r--src/bridge/bridge.hpp5
-rw-r--r--src/irc/irc_client.cpp9
-rw-r--r--src/xmpp/xmpp_component.cpp27
-rw-r--r--src/xmpp/xmpp_component.hpp9
5 files changed, 54 insertions, 1 deletions
diff --git a/src/bridge/bridge.cpp b/src/bridge/bridge.cpp
index 78cd2d2..70650a5 100644
--- a/src/bridge/bridge.cpp
+++ b/src/bridge/bridge.cpp
@@ -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);
diff --git a/src/bridge/bridge.hpp b/src/bridge/bridge.hpp
index 37f5b05..2618ca6 100644
--- a/src/bridge/bridge.hpp
+++ b/src/bridge/bridge.hpp
@@ -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);
diff --git a/src/irc/irc_client.cpp b/src/irc/irc_client.cpp
index 270e0ed..f08e9d6 100644
--- a/src/irc/irc_client.cpp
+++ b/src/irc/irc_client.cpp
@@ -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)
diff --git a/src/xmpp/xmpp_component.cpp b/src/xmpp/xmpp_component.cpp
index 55f0ca4..3c2aa7a 100644
--- a/src/xmpp/xmpp_component.cpp
+++ b/src/xmpp/xmpp_component.cpp
@@ -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,
diff --git a/src/xmpp/xmpp_component.hpp b/src/xmpp/xmpp_component.hpp
index f081420..9839158 100644
--- a/src/xmpp/xmpp_component.hpp
+++ b/src/xmpp/xmpp_component.hpp
@@ -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
*/