diff options
author | Waqas Hussain <waqas20@gmail.com> | 2012-08-01 01:36:22 +0500 |
---|---|---|
committer | Waqas Hussain <waqas20@gmail.com> | 2012-08-01 01:36:22 +0500 |
commit | 79e3b83332033b221938a50763e293fd920ad76d (patch) | |
tree | a1345b4f3b1bfa1eada5bf43f8f72d2901fc8359 | |
parent | e24f92a4f950ae64991e260a2ea042aa0137bd7c (diff) | |
download | prosody-79e3b83332033b221938a50763e293fd920ad76d.tar.gz prosody-79e3b83332033b221938a50763e293fd920ad76d.zip |
MUC: Send unavailable presence when the component or server is shutting down.
-rw-r--r-- | plugins/muc/mod_muc.lua | 27 |
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); |