Annotate

plugins/muc/persistent.lib.lua @ 13014:06453c564141

util.startup: Add prosody.started promise to easily execute code after startup To avoid a race where server-started fires before the promise function body is run (on next tick), I moved server-started to fire on the next tick, which seems sensible anyway. Errors are logged, I'm not sure if we ought to be doing something more here. I'm sure we'll find out.
author Matthew Wild <mwild1@gmail.com>
date Sat, 01 Apr 2023 11:56:38 +0100
parent 12732:f731eda8a873
child 13170:082c7d856e61
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6222
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
1 -- Prosody IM
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
2 -- Copyright (C) 2008-2010 Matthew Wild
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
3 -- Copyright (C) 2008-2010 Waqas Hussain
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
4 -- Copyright (C) 2014 Daurnimator
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
5 --
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
6 -- This project is MIT/X11 licensed. Please see the
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
7 -- COPYING file in the source package for more information.
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
8 --
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
9
9053
ea9e1f8f3013 MUC: Allow restricting public/persistent room options to service admins (muc_room_allow_public/muc_room_allow_persistent)
Matthew Wild <mwild1@gmail.com>
parents: 9035
diff changeset
10 local restrict_persistent = not module:get_option_boolean("muc_room_allow_persistent", true);
12732
f731eda8a873 Backed out changeset 73a45ba6e3f1 in favour of 427dd01f0864
Matthew Wild <mwild1@gmail.com>
parents: 12729
diff changeset
11 module:default_permission(
f731eda8a873 Backed out changeset 73a45ba6e3f1 in favour of 427dd01f0864
Matthew Wild <mwild1@gmail.com>
parents: 12729
diff changeset
12 restrict_persistent and "prosody:admin" or "prosody:user",
f731eda8a873 Backed out changeset 73a45ba6e3f1 in favour of 427dd01f0864
Matthew Wild <mwild1@gmail.com>
parents: 12729
diff changeset
13 ":create-persistent-room"
f731eda8a873 Backed out changeset 73a45ba6e3f1 in favour of 427dd01f0864
Matthew Wild <mwild1@gmail.com>
parents: 12729
diff changeset
14 );
9053
ea9e1f8f3013 MUC: Allow restricting public/persistent room options to service admins (muc_room_allow_public/muc_room_allow_persistent)
Matthew Wild <mwild1@gmail.com>
parents: 9035
diff changeset
15
6222
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
16 local function get_persistent(room)
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
17 return room._data.persistent;
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
18 end
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
19
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
20 local function set_persistent(room, persistent)
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
21 persistent = persistent and true or nil;
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
22 if get_persistent(room) == persistent then return false; end
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
23 room._data.persistent = persistent;
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
24 return true;
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
25 end
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
26
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
27 module:hook("muc-config-form", function(event)
12732
f731eda8a873 Backed out changeset 73a45ba6e3f1 in favour of 427dd01f0864
Matthew Wild <mwild1@gmail.com>
parents: 12729
diff changeset
28 if not module:may(":create-persistent-room", event.actor) then
12642
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 9053
diff changeset
29 -- Hide config option if this user is not allowed to create persistent rooms
9053
ea9e1f8f3013 MUC: Allow restricting public/persistent room options to service admins (muc_room_allow_public/muc_room_allow_persistent)
Matthew Wild <mwild1@gmail.com>
parents: 9035
diff changeset
30 return;
ea9e1f8f3013 MUC: Allow restricting public/persistent room options to service admins (muc_room_allow_public/muc_room_allow_persistent)
Matthew Wild <mwild1@gmail.com>
parents: 9035
diff changeset
31 end
6222
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
32 table.insert(event.form, {
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
33 name = "muc#roomconfig_persistentroom";
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
34 type = "boolean";
9034
1c709e3d2e5e MUC: Improve labels of all config form items
Matthew Wild <mwild1@gmail.com>
parents: 9014
diff changeset
35 label = "Persistent (room should remain even when it is empty)";
1c709e3d2e5e MUC: Improve labels of all config form items
Matthew Wild <mwild1@gmail.com>
parents: 9014
diff changeset
36 desc = "Rooms are automatically deleted when they are empty, unless this option is enabled";
6222
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
37 value = get_persistent(event.room);
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
38 });
9035
173c0e16e704 MUC: Add sections in room config form
Matthew Wild <mwild1@gmail.com>
parents: 9034
diff changeset
39 end, 100-5);
6222
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
40
6991
84e01dbb739e MUC: Update all config form handlers to take advantage of the new per-option events
Matthew Wild <mwild1@gmail.com>
parents: 6222
diff changeset
41 module:hook("muc-config-submitted/muc#roomconfig_persistentroom", function(event)
12732
f731eda8a873 Backed out changeset 73a45ba6e3f1 in favour of 427dd01f0864
Matthew Wild <mwild1@gmail.com>
parents: 12729
diff changeset
42 if not module:may(":create-persistent-room", event.actor) then
9053
ea9e1f8f3013 MUC: Allow restricting public/persistent room options to service admins (muc_room_allow_public/muc_room_allow_persistent)
Matthew Wild <mwild1@gmail.com>
parents: 9035
diff changeset
43 return; -- Not allowed
ea9e1f8f3013 MUC: Allow restricting public/persistent room options to service admins (muc_room_allow_public/muc_room_allow_persistent)
Matthew Wild <mwild1@gmail.com>
parents: 9035
diff changeset
44 end
6991
84e01dbb739e MUC: Update all config form handlers to take advantage of the new per-option events
Matthew Wild <mwild1@gmail.com>
parents: 6222
diff changeset
45 if set_persistent(event.room, event.value) then
6222
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
46 event.status_codes["104"] = true;
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
47 end
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
48 end);
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
49
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
50 module:hook("muc-disco#info", function(event)
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
51 event.reply:tag("feature", {var = get_persistent(event.room) and "muc_persistent" or "muc_temporary"}):up();
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
52 end);
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
53
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
54 module:hook("muc-room-destroyed", function(event)
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
55 set_persistent(event.room, false);
9014
326fedc1d3c6 MUC: Unset persistence of destroyed rooms later in event chain
Kim Alvefur <zash@zash.se>
parents: 7401
diff changeset
56 end, -100);
6222
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
57
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
58 return {
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
59 get = get_persistent;
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
60 set = set_persistent;
355b29881117 plugins/muc: Move persistent room configuration to own module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
61 };