summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bridge/bridge.cpp8
-rw-r--r--src/bridge/bridge.hpp5
-rw-r--r--src/irc/irc_client.cpp5
-rw-r--r--src/xmpp/xmpp_component.cpp39
-rw-r--r--src/xmpp/xmpp_component.hpp17
5 files changed, 24 insertions, 50 deletions
diff --git a/src/bridge/bridge.cpp b/src/bridge/bridge.cpp
index 9501d47..ba4911a 100644
--- a/src/bridge/bridge.cpp
+++ b/src/bridge/bridge.cpp
@@ -331,9 +331,11 @@ void Bridge::send_message(const Iid& iid, const std::string& nick, const std::st
}
}
-void Bridge::send_join_failed(const Iid& iid, const std::string& nick, const std::string& type, const std::string& condition, const std::string& text)
+void Bridge::send_presence_error(const Iid& iid, const std::string& nick,
+ const std::string& type, const std::string& condition,
+ const std::string& error_code, const std::string& text)
{
- this->xmpp->send_presence_error(std::to_string(iid), nick, this->user_jid, type, condition, text);
+ this->xmpp->send_presence_error(std::to_string(iid), nick, this->user_jid, type, condition, error_code, text);
}
void Bridge::send_muc_leave(Iid&& iid, std::string&& nick, const std::string& message, const bool self)
@@ -412,7 +414,7 @@ void Bridge::kick_muc_user(Iid&& iid, const std::string& target, const std::stri
void Bridge::send_nickname_conflict_error(const Iid& iid, const std::string& nickname)
{
- this->xmpp->send_nickname_conflict_error(std::to_string(iid), nickname, this->user_jid);
+ this->xmpp->send_presence_error(std::to_string(iid), nickname, this->user_jid, "cancel", "conflict", "409", "");
}
void Bridge::send_affiliation_role_change(const Iid& iid, const std::string& target, const char mode)
diff --git a/src/bridge/bridge.hpp b/src/bridge/bridge.hpp
index a75b319..b0e6a27 100644
--- a/src/bridge/bridge.hpp
+++ b/src/bridge/bridge.hpp
@@ -100,10 +100,9 @@ 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.
+ * Send a presence of type error, from a room.
*/
- void send_join_failed(const Iid& iid, const std::string& nick, const std::string& type, const std::string& condition, const std::string& text);
+ void send_presence_error(const Iid& iid, const std::string& nick, const std::string& type, const std::string& condition, const std::string& error_code, const std::string& text);
/**
* Send an unavailable presence from this participant
*/
diff --git a/src/irc/irc_client.cpp b/src/irc/irc_client.cpp
index e518ffc..678cac8 100644
--- a/src/irc/irc_client.cpp
+++ b/src/irc/irc_client.cpp
@@ -77,8 +77,9 @@ void IrcClient::on_connection_failed(const std::string& reason)
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);
+ this->bridge->send_presence_error(iid, this->current_nick,
+ "cancel", "item-not-found",
+ "", reason);
}
}
else // try the next port
diff --git a/src/xmpp/xmpp_component.cpp b/src/xmpp/xmpp_component.cpp
index bc54bcd..1aa98b0 100644
--- a/src/xmpp/xmpp_component.cpp
+++ b/src/xmpp/xmpp_component.cpp
@@ -911,38 +911,13 @@ void XmppComponent::kick_user(const std::string& muc_name,
this->send_stanza(presence);
}
-void XmppComponent::send_nickname_conflict_error(const std::string& muc_name,
- const std::string& nickname,
- const std::string& jid_to)
-{
- Stanza presence("presence");
- presence["from"] = muc_name + "@" + this->served_hostname + "/" + nickname;
- presence["to"] = jid_to;
- presence["type"] = "error";
- 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"] = "cancel";
- error["code"] = "409";
- XmlNode conflict("conflict");
- conflict["xmlns"] = STANZA_NS;
- conflict.close();
- error.add_child(std::move(conflict));
- error.close();
- presence.add_child(std::move(error));
- presence.close();
- 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&)
+ const std::string& nickname,
+ const std::string& jid_to,
+ const std::string& type,
+ const std::string& condition,
+ const std::string& error_code,
+ const std::string& /* text */)
{
Stanza presence("presence");
presence["from"] = muc_name + "@" + this->served_hostname + "/" + nickname;
@@ -955,6 +930,8 @@ void XmppComponent::send_presence_error(const std::string& muc_name,
XmlNode error("error");
error["by"] = muc_name + "@" + this->served_hostname;
error["type"] = type;
+ if (!error_code.empty())
+ error["code"] = error_code;
XmlNode subnode(condition);
subnode["xmlns"] = STANZA_NS;
subnode.close();
diff --git a/src/xmpp/xmpp_component.hpp b/src/xmpp/xmpp_component.hpp
index daadbec..9f1cec3 100644
--- a/src/xmpp/xmpp_component.hpp
+++ b/src/xmpp/xmpp_component.hpp
@@ -172,20 +172,15 @@ public:
const std::string& author,
const std::string& jid_to);
/**
- * Send a presence type=error with a conflict element
- */
- void send_nickname_conflict_error(const std::string& muc_name,
- 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);
+ const std::string& nickname,
+ const std::string& jid_to,
+ const std::string& type,
+ const std::string& condition,
+ const std::string& error_code,
+ const std::string& text);
/**
* Send a presence from the MUC indicating a change in the role and/or
* affiliation of a participant