Changeset

9003:a971023e9b6e

MUC: Bring handling of presence errors to the room more in line with unavailable presence Related issues: #505, #978
author Matthew Wild <mwild1@gmail.com>
date Mon, 09 Jul 2018 17:46:23 +0100
parents 9002:1fcddb4a4d16
children 9004:50a0f405e6c9
files plugins/muc/muc.lib.lua
diffstat 1 files changed, 13 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/plugins/muc/muc.lib.lua	Mon Jul 09 17:41:57 2018 +0100
+++ b/plugins/muc/muc.lib.lua	Mon Jul 09 17:46:23 2018 +0100
@@ -221,7 +221,7 @@
 	local base_presence do
 		-- Try to use main jid's presence
 		local pr = occupant:get_presence();
-		if pr and (pr.attr.type ~= "unavailable" and occupant.role ~= nil) then
+		if pr and (occupant.role ~= nil or pr.attr.type == "unavailable") then
 			base_presence = st.clone(pr);
 		else -- user is leaving but didn't send a leave presence. make one for them
 			base_presence = st.presence {from = occupant.nick; type = "unavailable";};
@@ -369,12 +369,18 @@
 	end
 	occupant:set_session(real_jid, st.presence({type="unavailable"})
 		:tag('status'):text(error_message));
-	self:save_occupant(occupant);
-	local x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user";})
-		:tag("status", {code = "307"}):up()
-		:tag("status", {code = "333"})
-	self:publicise_occupant_status(occupant, x);
-	if occupant.jid == real_jid then -- Was last session
+	local is_last_session = occupant.jid == real_jid;
+	if is_last_session then
+		occupant.role = nil;
+	end
+	local new_occupant = self:save_occupant(occupant);
+	local x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user";});
+	if is_last_session then
+		x:tag("status", {code = "307"}):up()
+		 :tag("status", {code = "333"});
+	end
+	self:publicise_occupant_status(new_occupant or occupant, x);
+	if is_last_session then
 		module:fire_event("muc-occupant-left", {room = self; nick = occupant.nick; occupant = occupant;});
 	end
 	return true;