aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/muc
diff options
context:
space:
mode:
authorWaqas Hussain <waqas20@gmail.com>2012-08-01 01:36:22 +0500
committerWaqas Hussain <waqas20@gmail.com>2012-08-01 01:36:22 +0500
commit35113f999fdc2ef2f91c0bb6d066763518ff4829 (patch)
treea1345b4f3b1bfa1eada5bf43f8f72d2901fc8359 /plugins/muc
parentf1f8cf4bafc4e605c3b86d42897bd3f85b1a8080 (diff)
downloadprosody-35113f999fdc2ef2f91c0bb6d066763518ff4829.tar.gz
prosody-35113f999fdc2ef2f91c0bb6d066763518ff4829.zip
MUC: Send unavailable presence when the component or server is shutting down.
Diffstat (limited to 'plugins/muc')
-rw-r--r--plugins/muc/mod_muc.lua27
1 files changed, 27 insertions, 0 deletions
diff --git a/plugins/muc/mod_muc.lua b/plugins/muc/mod_muc.lua
index 7312157c..94d8263c 100644
--- a/plugins/muc/mod_muc.lua
+++ b/plugins/muc/mod_muc.lua
@@ -178,7 +178,9 @@ end
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 @@ module.restore = function(data)
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);