Software /
code /
prosody
Diff
plugins/muc/muc.lib.lua @ 7706:d92e186c2a1c
MUC: Include the appropriate status code if nickname is changed during join process
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Wed, 26 Oct 2016 13:10:22 +0200 |
parent | 7705:0a29a5e64f1d |
child | 7958:47cb54a08336 |
line wrap: on
line diff
--- a/plugins/muc/muc.lib.lua Wed Oct 26 13:06:08 2016 +0200 +++ b/plugins/muc/muc.lib.lua Wed Oct 26 13:10:22 2016 +0200 @@ -402,6 +402,7 @@ module:log("debug", "Room creation without <x>, possibly desynced"); end + local orig_nick = dest_occupant.nick; if module:fire_event("muc-occupant-pre-join", { room = self; origin = origin; @@ -410,6 +411,7 @@ is_new_room = true; occupant = dest_occupant; }) then return true; end + local nick_changed = orig_nick ~= dest_occupant.nick; dest_occupant:set_session(real_jid, stanza); local dest_x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user";}); @@ -417,9 +419,14 @@ if self:get_whois() == "anyone" then dest_x:tag("status", {code = "100"}):up(); end + local self_x; + if nick_changed then + self_x = st.clone(dest_x); + self_x:tag("status", {code = "210"}):up(); + end self:save_occupant(dest_occupant); - self:publicise_occupant_status(dest_occupant, dest_x); + self:publicise_occupant_status(dest_occupant, {base = dest_x, self = self_x}); module:fire_event("muc-occupant-joined", { room = self; @@ -485,6 +492,8 @@ module:log("debug", "Presence update with <x>, possibly desynced"); end + local orig_nick = dest_occupant and dest_occupant.nick; + local event, event_name = { room = self; origin = origin; @@ -505,6 +514,8 @@ end if module:fire_event(event_name, event) then return true; end + local nick_changed = dest_occupant and orig_nick ~= dest_occupant.nick; + -- Check for nick conflicts if dest_occupant ~= nil and not is_first_dest_session and bare_jid ~= jid_bare(dest_occupant.bare_jid) then -- new nick or has different bare real jid log("debug", "%s couldn't join due to nick conflict: %s", real_jid, dest_occupant.nick); @@ -586,7 +597,12 @@ return occupant:get_presence(real_jid) == nil; end) end - self:publicise_occupant_status(dest_occupant, dest_x); + local self_x; + if nick_changed then + self_x = st.clone(dest_x); + self_x:tag("status", {code="210"}):up(); + end + self:publicise_occupant_status(dest_occupant, {base=dest_x,self=self_x}); if orig_occupant ~= nil and orig_occupant ~= dest_occupant and not is_last_orig_session then -- If user is swapping and wasn't last original session log("debug", "session %s split nicks; showing %s rejoining", real_jid, orig_occupant.nick);