Diff

plugins/muc/muc.lib.lua @ 2529:7968e8b3ecf9

MUC: Fixes and refactoring for the previous commit to work in all cases, text of error stanzas is now broadcast
author Matthew Wild <mwild1@gmail.com>
date Fri, 29 Jan 2010 15:13:06 +0000
parent 2528:3365ed0ed5bd
child 2540:8c52b023f0b9
line wrap: on
line diff
--- a/plugins/muc/muc.lib.lua	Fri Jan 29 14:40:37 2010 +0000
+++ b/plugins/muc/muc.lib.lua	Fri Jan 29 15:13:06 2010 +0000
@@ -188,6 +188,16 @@
 	return true;
 end
 
+local function build_unavailable_presence_from_error(stanza)
+	local type, condition, text = stanza:get_error();
+	local error_message = "Kicked: "..condition:gsub("%-", " ");
+	if text then
+		error_message = error_message..": "..text;
+	end
+	return st.presence({type='unavailable', from=stanza.attr.from, to=stanza.attr.to})
+		:tag('status'):text(error_message);
+end
+
 function room_mt:handle_to_occupant(origin, stanza) -- PM, vCards, etc
 	local from, to = stanza.attr.from, stanza.attr.to;
 	local room = jid_bare(to);
@@ -200,14 +210,8 @@
 		pr.attr.from = current_nick;
 		if type == "error" then -- error, kick em out!
 			if current_nick then
-				local type, condition, text = stanza:get_error();
-				local error_message = "Kicked: "..condition:gsub("%-", " ");
-				if text then
-					error_message = error_message..": "..text;
-				end
-				log("debug", "kicking %s from %s for %s", current_nick, room, condition);
-				self:handle_to_occupant(origin, st.presence({type='unavailable', from=from, to=to})
-					:tag('status'):text(error_message)); -- send unavailable
+				log("debug", "kicking %s from %s", current_nick, room);
+				self:handle_to_occupant(origin, build_unavailable_presence_from_error(stanza));
 			end
 		elseif type == "unavailable" then -- unavailable
 			if current_nick then
@@ -354,8 +358,7 @@
 		origin.send(st.error_reply(stanza, "modify", "bad-request"));
 	elseif current_nick and stanza.name == "message" and type == "error" and is_kickable_error(stanza) then
 		log("debug", "%s kicked from %s for sending an error message", current_nick, self.jid);
-		self:handle_to_occupant(origin, st.presence({type='unavailable', from=stanza.attr.from, to=stanza.attr.to})
-			:tag('status'):text('Kicked: '..get_error_condition(stanza))); -- send unavailable
+		self:handle_to_occupant(origin, build_unavailable_presence_from_error(stanza)); -- send unavailable
 	else -- private stanza
 		local o_data = self._occupants[to];
 		if o_data then
@@ -614,8 +617,7 @@
 	elseif stanza.name == "message" and type == "error" and is_kickable_error(stanza) then
 		local current_nick = self._jid_nick[stanza.attr.from];
 		log("debug", "%s kicked from %s for sending an error message", current_nick, self.jid);
-		self:handle_to_occupant(origin, st.presence({type='unavailable', from=stanza.attr.from, to=stanza.attr.to})
-			:tag('status'):text('Kicked: '..get_error_condition(stanza))); -- send unavailable
+		self:handle_to_occupant(origin, build_unavailable_presence_from_error(stanza)); -- send unavailable
 	elseif stanza.name == "presence" then -- hack - some buggy clients send presence updates to the room rather than their nick
 		local to = stanza.attr.to;
 		local current_nick = self._jid_nick[stanza.attr.from];