Diff

plugins/mod_muc.lua @ 818:4dda65cd1405

MUC: Various fixes
author Waqas Hussain <waqas20@gmail.com>
date Wed, 18 Feb 2009 23:30:33 +0500
parent 817:e3e3919b6c7e
child 820:c20545c0dc4d
line wrap: on
line diff
--- a/plugins/mod_muc.lua	Tue Feb 17 02:48:06 2009 +0500
+++ b/plugins/mod_muc.lua	Wed Feb 18 23:30:33 2009 +0500
@@ -116,7 +116,7 @@
 	if subject == "" then subject = nil; end
 	rooms_info:set(room, 'subject', subject);
 	save_room();
-	local msg = st.message({type='groupchat', from=from})
+	local msg = st.message({type='groupchat', from=current_nick})
 		:tag('subject'):text(subject):up();
 	broadcast_message_stanza(room, msg, false);
 	--broadcast_message(current_nick, room, subject or "", nil);
@@ -231,30 +231,35 @@
 		pr.attr.from = to;
 		if type == "error" then -- error, kick em out!
 			if current_nick then
-				local data = rooms:get(room, to);
+				local data = rooms:get(room, current_nick);
 				data.role = 'none';
 				local pr = st.presence({type='unavailable', from=current_nick}):tag('status'):text('This participant is kicked from the room because he sent an error presence'):up()
-					:tag("x", {xmlns='http://jabber.org/protocol/muc#user'})
-					:tag("item", {affiliation=data.affiliation, role=data.role}):up();
+					--:tag("x", {xmlns='http://jabber.org/protocol/muc#user'})
+					--:tag("item", {affiliation=data.affiliation, role=data.role}):up();
 				broadcast_presence_stanza(room, pr);
-				--broadcast_presence('unavailable', to, room); -- TODO also add <status>This participant is kicked from the room because he sent an error presence: badformed error stanza</status>
-				rooms:remove(room, to);
+				--broadcast_presence('unavailable', current_nick, room); -- TODO also add <status>This participant is kicked from the room because he sent an error presence: badformed error stanza</status>
+				rooms:remove(room, current_nick);
 				jid_nick:remove(from, room);
 			end
 		elseif type == "unavailable" then -- unavailable
 			if current_nick then
-				local data = rooms:get(room, to);
+				local data = rooms:get(room, current_nick);
 				data.role = 'none';
 				broadcast_presence_stanza(room, pr);
-				--broadcast_presence('unavailable', to, room);
-				rooms:remove(room, to);
+				--broadcast_presence('unavailable', current_nick, room);
+				rooms:remove(room, current_nick);
 				jid_nick:remove(from, room);
 			end
 		elseif not type then -- available
 			if current_nick then
 				if current_nick == to then -- simple presence
-					broadcast_presence_stanza(room, pr);
-					-- FIXME check if something was filtered. if it was, then user may be rejoining
+					if #pr == #stanza then
+						broadcast_presence_stanza(room, pr);
+					else -- possible rejoin
+						local pr_ = st.presence({type='unavailable', from=from, to=current_nick}):tag('status'):text('Replaced by new connection');
+						handle_to_occupant(origin, pr_); -- send unavailable
+						handle_to_occupant(origin, pr); -- resend available
+					end
 				else -- change nick
 					if rooms:get(room, to) then
 						origin.send(st.error_reply(stanza, "cancel", "conflict"));