diff options
author | louiz’ <louiz@louiz.org> | 2020-03-11 18:41:43 +0100 |
---|---|---|
committer | louiz’ <louiz@louiz.org> | 2020-03-11 18:41:43 +0100 |
commit | 212e8e59897c65e50f9d89949824a32d383201f4 (patch) | |
tree | 6c8628cb616ff7977176ee2316f115fa5cc2a9d9 /src | |
parent | a0d24b48471e5307fda077a11491a3c44cbbdfaf (diff) | |
parent | 470ba2e4e486d922b2585219b790371ec7df934a (diff) | |
download | biboumi-212e8e59897c65e50f9d89949824a32d383201f4.tar.gz biboumi-212e8e59897c65e50f9d89949824a32d383201f4.tar.bz2 biboumi-212e8e59897c65e50f9d89949824a32d383201f4.tar.xz biboumi-212e8e59897c65e50f9d89949824a32d383201f4.zip |
Merge remote-tracking branch 'linkmauve/die-gc1.0-die'
Diffstat (limited to 'src')
-rw-r--r-- | src/bridge/bridge.cpp | 7 | ||||
-rw-r--r-- | src/bridge/bridge.hpp | 6 | ||||
-rw-r--r-- | src/xmpp/biboumi_component.cpp | 66 |
3 files changed, 46 insertions, 33 deletions
diff --git a/src/bridge/bridge.cpp b/src/bridge/bridge.cpp index 28869c8..424c72a 100644 --- a/src/bridge/bridge.cpp +++ b/src/bridge/bridge.cpp @@ -170,8 +170,7 @@ IrcClient* Bridge::find_irc_client(const std::string& hostname) const bool Bridge::join_irc_channel(const Iid& iid, std::string nickname, const std::string& password, const std::string& resource, - HistoryLimit history_limit, - const bool force_join) + HistoryLimit history_limit) { const auto& hostname = iid.get_server(); #ifdef USE_DATABASE @@ -189,8 +188,8 @@ bool Bridge::join_irc_channel(const Iid& iid, std::string nickname, { irc->send_join_command(iid.get_local(), password); return true; - } else if (!res_in_chan || force_join) { - // See https://github.com/xsf/xeps/pull/499 for the force_join argument + } else { + // See https://github.com/xsf/xeps/pull/499 this->generate_channel_join_for_resource(iid, resource); } return false; diff --git a/src/bridge/bridge.hpp b/src/bridge/bridge.hpp index a94f07b..6b15478 100644 --- a/src/bridge/bridge.hpp +++ b/src/bridge/bridge.hpp @@ -72,14 +72,12 @@ public: **/ /** - * Try to join an irc_channel, does nothing and return true if the channel - * was already joined. + * Try to join an irc_channel. */ bool join_irc_channel(const Iid& iid, std::string nickname, const std::string& password, const std::string& resource, - HistoryLimit history_limit, - const bool force_join); + HistoryLimit history_limit); void send_channel_message(const Iid& iid, const std::string& body, std::string id, std::vector<XmlNode> nodes_to_reflect); void send_private_message(const Iid& iid, const std::string& body, const std::string& type="PRIVMSG"); diff --git a/src/xmpp/biboumi_component.cpp b/src/xmpp/biboumi_component.cpp index 6fda98f..f49b3b6 100644 --- a/src/xmpp/biboumi_component.cpp +++ b/src/xmpp/biboumi_component.cpp @@ -158,35 +158,51 @@ void BiboumiComponent::handle_presence(const Stanza& stanza) { const std::string own_nick = bridge->get_own_nick(iid); const XmlNode* x = stanza.get_child("x", MUC_NS); - const XmlNode* password = x ? x->get_child("password", MUC_NS): nullptr; - const XmlNode* history = x ? x->get_child("history", MUC_NS): nullptr; - HistoryLimit history_limit; - if (history) + const IrcClient* irc = bridge->find_irc_client(iid.get_server()); + // if there is no <x/>, this is a presence status update, we don’t care about those + if (x) { - const auto seconds = history->get_tag("seconds"); - if (!seconds.empty()) + const XmlNode* password = x->get_child("password", MUC_NS); + const XmlNode* history = x->get_child("history", MUC_NS); + HistoryLimit history_limit; + if (history) { - const auto now = std::chrono::system_clock::now(); - std::time_t timestamp = std::chrono::system_clock::to_time_t(now); - int int_seconds = std::atoi(seconds.data()); - timestamp -= int_seconds; - history_limit.since = utils::to_string(timestamp); + const auto seconds = history->get_tag("seconds"); + if (!seconds.empty()) + { + const auto now = std::chrono::system_clock::now(); + std::time_t timestamp = std::chrono::system_clock::to_time_t(now); + int int_seconds = std::atoi(seconds.data()); + timestamp -= int_seconds; + history_limit.since = utils::to_string(timestamp); + } + const auto since = history->get_tag("since"); + if (!since.empty()) + history_limit.since = since; + const auto maxstanzas = history->get_tag("maxstanzas"); + if (!maxstanzas.empty()) + history_limit.stanzas = std::atoi(maxstanzas.data()); + // Ignore any other value, because this is too complex to implement, + // so I won’t do it. + if (history->get_tag("maxchars") == "0") + history_limit.stanzas = 0; + } + bridge->join_irc_channel(iid, to.resource, password ? password->get_inner(): "", + from.resource, history_limit); + } + else + { + if (irc) + { + const auto chan = irc->find_channel(iid.get_local()); + if (chan && chan->joined) + bridge->send_irc_nick_change(iid, to.resource, from.resource); + else + { // send an error if we are not joined yet, instead of treating it as a join + this->send_stanza_error("presence", from_str, to_str, id, "modify", "not-acceptable", "You are not joined to this MUC."); + } } - const auto since = history->get_tag("since"); - if (!since.empty()) - history_limit.since = since; - const auto maxstanzas = history->get_tag("maxstanzas"); - if (!maxstanzas.empty()) - history_limit.stanzas = std::atoi(maxstanzas.data()); - // Ignore any other value, because this is too complex to implement, - // so I won’t do it. - if (history->get_tag("maxchars") == "0") - history_limit.stanzas = 0; } - const bool was_really_a_join = bridge->join_irc_channel(iid, to.resource, password ? password->get_inner(): "", - from.resource, history_limit, x != nullptr); - if (!was_really_a_join) - bridge->send_irc_nick_change(iid, to.resource, from.resource); } else if (type == "unavailable") { |