diff options
author | Florent Le Coz <louiz@louiz.org> | 2013-11-11 00:24:34 +0100 |
---|---|---|
committer | Florent Le Coz <louiz@louiz.org> | 2013-11-11 00:24:34 +0100 |
commit | 096a4e3bafe6e2d238e4592f57f22f19f363fcbd (patch) | |
tree | 621047f639559200903ec08683dcdfa1bc363615 /src/xmpp | |
parent | f0d9273da61ce154dbe460cf58c98de851d30615 (diff) | |
download | biboumi-096a4e3bafe6e2d238e4592f57f22f19f363fcbd.tar.gz biboumi-096a4e3bafe6e2d238e4592f57f22f19f363fcbd.tar.bz2 biboumi-096a4e3bafe6e2d238e4592f57f22f19f363fcbd.tar.xz biboumi-096a4e3bafe6e2d238e4592f57f22f19f363fcbd.zip |
Handle nick changes, both ways
Diffstat (limited to 'src/xmpp')
-rw-r--r-- | src/xmpp/xmpp_component.cpp | 42 | ||||
-rw-r--r-- | src/xmpp/xmpp_component.hpp | 4 |
2 files changed, 45 insertions, 1 deletions
diff --git a/src/xmpp/xmpp_component.cpp b/src/xmpp/xmpp_component.cpp index 7cf2ce0..e2063ba 100644 --- a/src/xmpp/xmpp_component.cpp +++ b/src/xmpp/xmpp_component.cpp @@ -167,7 +167,13 @@ void XmppComponent::handle_presence(const Stanza& stanza) if (!iid.chan.empty() && !iid.chan.empty()) { // presence toward a MUC that corresponds to an irc channel if (type.empty()) - bridge->join_irc_channel(iid, to.resource); + { + const std::string own_nick = bridge->get_own_nick(iid); + if (!own_nick.empty() && own_nick != to.resource) + bridge->send_irc_nick_change(iid, to.resource); + else + bridge->join_irc_channel(iid, to.resource); + } else if (type == "unavailable") { XmlNode* status = stanza.get_child(MUC_USER_NS":status"); @@ -317,3 +323,37 @@ void XmppComponent::send_muc_leave(std::string&& muc_name, std::string&& nick, s presence.close(); this->send_stanza(presence); } + +void XmppComponent::send_nick_change(const std::string& muc_name, const std::string& old_nick, const std::string& new_nick, const std::string& jid_to, const bool self) +{ + Stanza presence("presence"); + presence["to"] = jid_to; + presence["from"] = muc_name + "@" + this->served_hostname + "/" + old_nick; + presence["type"] = "unavailable"; + XmlNode x("x"); + x["xmlns"] = MUC_USER_NS; + XmlNode item("item"); + item["nick"] = new_nick; + item.close(); + x.add_child(std::move(item)); + XmlNode status("status"); + status["code"] = "303"; + status.close(); + x.add_child(std::move(status)); + if (self) + { + XmlNode status2("status"); + status2["code"] = "110"; + status2.close(); + x.add_child(std::move(status2)); + } + x.close(); + presence.add_child(std::move(x)); + presence.close(); + this->send_stanza(presence); + + if (self) + this->send_self_join(muc_name, new_nick, jid_to); + else + this->send_user_join(muc_name, new_nick, jid_to); +} diff --git a/src/xmpp/xmpp_component.hpp b/src/xmpp/xmpp_component.hpp index a5127a9..84b19a9 100644 --- a/src/xmpp/xmpp_component.hpp +++ b/src/xmpp/xmpp_component.hpp @@ -80,6 +80,10 @@ public: */ void send_muc_leave(std::string&& muc_name, std::string&& nick, std::string&& message, const std::string& jid_to, const bool self); /** + * Indicate that a participant changed his nick + */ + void send_nick_change(const std::string& muc_name, const std::string& old_nick, const std::string& new_nick, const std::string& jid_to, const bool self); + /** * Handle the various stanza types */ void handle_handshake(const Stanza& stanza); |