plugins/muc: Move persistent room configuration to own module
authordaurnimator <quae@daurnimator.com>
Tue, 15 Apr 2014 17:06:04 -0400
changeset 6222 355b29881117
parent 6221 f321536afeec
child 6223 2a7ce69844ca
plugins/muc: Move persistent room configuration to own module
plugins/muc/mod_muc.lua
plugins/muc/muc.lib.lua
plugins/muc/persistent.lib.lua
--- a/plugins/muc/mod_muc.lua	Fri Apr 04 11:20:20 2014 -0400
+++ b/plugins/muc/mod_muc.lua	Tue Apr 15 17:06:04 2014 -0400
@@ -26,6 +26,7 @@
 
 local muclib = module:require "muc";
 local muc_new_room = muclib.new_room;
+local persistent = module:require "muc/persistent";
 local jid_split = require "util.jid".split;
 local jid_bare = require "util.jid".bare;
 local st = require "util.stanza";
@@ -65,8 +66,9 @@
 
 local function room_save(room, forced)
 	local node = jid_split(room.jid);
-	persistent_rooms[room.jid] = room._data.persistent;
-	if room._data.persistent then
+	local is_persistent = persistent.get(room);
+	persistent_rooms[room.jid] = is_persistent;
+	if is_persistent then
 		local history = room._data.history;
 		room._data.history = nil;
 		local data = {
@@ -138,7 +140,7 @@
 
 module:hook("muc-occupant-left",function(event)
 	local room = event.room
-	if not next(room._occupants) and not persistent_rooms[room.jid] then -- empty, non-persistent room
+	if not next(room._occupants) and not persistent.get(room) then -- empty, non-persistent room
 		module:fire_event("muc-room-destroyed", { room = room });
 	end
 end);
--- a/plugins/muc/muc.lib.lua	Fri Apr 04 11:20:20 2014 -0400
+++ b/plugins/muc/muc.lib.lua	Tue Apr 15 17:06:04 2014 -0400
@@ -281,9 +281,6 @@
 	event.reply:tag("feature", {var = event.room:get_moderated() and "muc_moderated" or "muc_unmoderated"}):up();
 end);
 module:hook("muc-disco#info", function(event)
-	event.reply:tag("feature", {var = event.room:get_persistent() and "muc_persistent" or "muc_temporary"}):up();
-end);
-module:hook("muc-disco#info", function(event)
 	event.reply:tag("feature", {var = event.room:get_hidden() and "muc_hidden" or "muc_public"}):up();
 end);
 module:hook("muc-disco#info", function(event)
@@ -349,16 +346,6 @@
 function room_mt:get_moderated()
 	return self._data.moderated;
 end
-function room_mt:set_persistent(persistent)
-	persistent = persistent and true or nil;
-	if self._data.persistent ~= persistent then
-		self._data.persistent = persistent;
-		if self.save then self:save(true); end
-	end
-end
-function room_mt:get_persistent()
-	return self._data.persistent;
-end
 function room_mt:set_hidden(hidden)
 	hidden = hidden and true or nil;
 	if self._data.hidden ~= hidden then
@@ -673,14 +660,6 @@
 end
 module:hook("muc-config-form", function(event)
 	table.insert(event.form, {
-		name = 'muc#roomconfig_persistentroom',
-		type = 'boolean',
-		label = 'Make Room Persistent?',
-		value = event.room:get_persistent()
-	});
-end);
-module:hook("muc-config-form", function(event)
-	table.insert(event.form, {
 		name = 'muc#roomconfig_publicroom',
 		type = 'boolean',
 		label = 'Make Room Publicly Searchable?',
@@ -745,9 +724,6 @@
 	return true;
 end
 module:hook("muc-config-submitted", function(event)
-	event.update_option("persistent", "muc#roomconfig_persistentroom");
-end);
-module:hook("muc-config-submitted", function(event)
 	event.update_option("moderated", "muc#roomconfig_moderatedroom");
 end);
 module:hook("muc-config-submitted", function(event)
@@ -780,7 +756,6 @@
 	if password then x:tag("password"):text(password):up(); end
 	x:up();
 	self:clear(x);
-	self:set_persistent(false);
 	module:fire_event("muc-room-destroyed", { room = self });
 end
 
@@ -1220,6 +1195,10 @@
 room_mt.get_members_only = members_only.get;
 room_mt.set_members_only = members_only.set;
 
+local persistent = module:require "muc/persistent";
+room_mt.get_persistent = persistent.get;
+room_mt.set_persistent = persistent.set;
+
 local history = module:require "muc/history";
 room_mt.send_history = history.send;
 room_mt.get_historylength = history.get_length;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/muc/persistent.lib.lua	Tue Apr 15 17:06:04 2014 -0400
@@ -0,0 +1,49 @@
+-- Prosody IM
+-- Copyright (C) 2008-2010 Matthew Wild
+-- Copyright (C) 2008-2010 Waqas Hussain
+-- Copyright (C) 2014 Daurnimator
+--
+-- This project is MIT/X11 licensed. Please see the
+-- COPYING file in the source package for more information.
+--
+
+local function get_persistent(room)
+	return room._data.persistent;
+end
+
+local function set_persistent(room, persistent)
+	persistent = persistent and true or nil;
+	if get_persistent(room) == persistent then return false; end
+	room._data.persistent = persistent;
+	if room.save then room:save(true); end
+	return true;
+end
+
+module:hook("muc-config-form", function(event)
+	table.insert(event.form, {
+		name = "muc#roomconfig_persistentroom";
+		type = "boolean";
+		label = "Make Room Persistent?";
+		value = get_persistent(event.room);
+	});
+end);
+
+module:hook("muc-config-submitted", function(event)
+	local new = event.fields["muc#roomconfig_persistentroom"];
+	if new ~= nil and set_persistent(event.room, new) then
+		event.status_codes["104"] = true;
+	end
+end);
+
+module:hook("muc-disco#info", function(event)
+	event.reply:tag("feature", {var = get_persistent(event.room) and "muc_persistent" or "muc_temporary"}):up();
+end);
+
+module:hook("muc-room-destroyed", function(event)
+	set_persistent(event.room, false);
+end);
+
+return {
+	get = get_persistent;
+	set = set_persistent;
+};