Diff

plugins/muc/mod_muc.lua @ 5062:88e198d65905

MUC: Send unavailable presence when the component or server is shutting down.
author Waqas Hussain <waqas20@gmail.com>
date Wed, 01 Aug 2012 01:36:22 +0500
parent 5058:433cc9a4c7e9
child 5064:7a1eb302c562
line wrap: on
line diff
--- a/plugins/muc/mod_muc.lua	Wed Aug 01 01:36:19 2012 +0500
+++ b/plugins/muc/mod_muc.lua	Wed Aug 01 01:36:22 2012 +0500
@@ -178,7 +178,9 @@
 
 hosts[module:get_host()].muc = { rooms = rooms };
 
+local saved = false;
 module.save = function()
+	saved = true;
 	return {rooms = rooms};
 end
 module.restore = function(data)
@@ -194,3 +196,28 @@
 	end
 	hosts[module:get_host()].muc = { rooms = rooms };
 end
+
+function shutdown_room(room, stanza)
+	for nick, occupant in pairs(room._occupants) do
+		stanza.attr.from = nick;
+		for jid in pairs(occupant.sessions) do
+			stanza.attr.to = jid;
+			room:_route_stanza(stanza);
+			room._jid_nick[jid] = nil;
+		end
+		room._occupants[nick] = nil;
+	end
+end
+function shutdown_component()
+	if not saved then
+		local stanza = st.presence({type = "unavailable"})
+			:tag("x", {xmlns = "http://jabber.org/protocol/muc#user"})
+				:tag("item", { affiliation='none', role='none' }):up();
+		for roomjid, room in pairs(rooms) do
+			shutdown_room(room, stanza);
+		end
+		shutdown_room(host_room, stanza);
+	end
+end
+module.unload = shutdown_component;
+module:hook_global("server-stopping", shutdown_component);