Send an error presence when the connection to the IRC server fails
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -80,6 +80,11 @@ public:
|
||||
* Send a MUC message from some participant
|
||||
*/
|
||||
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
|
||||
*/
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -141,6 +141,15 @@ public:
|
||||
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);
|
||||
/**
|
||||
* Send a presence from the MUC indicating a change in the role and/or
|
||||
* affiliation of a participant
|
||||
|
||||
Reference in New Issue
Block a user