Annotate

plugins/muc/presence_broadcast.lib.lua @ 11961:542a9a503073

util.async: Add sleep() method with configurable scheduling backend No scheduler set by default, so it will error (we plan to initialize it in util.startup). We wanted to avoid a hard dependency on util.timer (which in turn depends on network backends, etc.), and we didn't add timer.sleep() because we didn't want to add a hard dependency on util.async for things that don't need it.
author Matthew Wild <mwild1@gmail.com>
date Mon, 29 Nov 2021 14:11:24 +0000
parent 10687:8c2c5b4fde32
child 12977:74b9e05af71e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10353
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
1 -- Prosody IM
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
2 -- Copyright (C) 2008-2010 Matthew Wild
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
3 -- Copyright (C) 2008-2010 Waqas Hussain
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
4 -- Copyright (C) 2014 Daurnimator
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
5 --
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
6 -- This project is MIT/X11 licensed. Please see the
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
7 -- COPYING file in the source package for more information.
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
8 --
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
9
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
10 local st = require "util.stanza";
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
11
10687
8c2c5b4fde32 MUC: Support for broadcasting unavailable presence for affiliated offline users
Matthew Wild <mwild1@gmail.com>
parents: 10685
diff changeset
12 local valid_roles = { "none", "visitor", "participant", "moderator" };
10353
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
13 local default_broadcast = {
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
14 visitor = true;
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
15 participant = true;
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
16 moderator = true;
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
17 };
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
18
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
19 local function get_presence_broadcast(room)
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
20 return room._data.presence_broadcast or default_broadcast;
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
21 end
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
22
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
23 local function set_presence_broadcast(room, broadcast_roles)
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
24 broadcast_roles = broadcast_roles or default_broadcast;
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
25
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
26 local changed = false;
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
27 local old_broadcast_roles = get_presence_broadcast(room);
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
28 for _, role in ipairs(valid_roles) do
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
29 if old_broadcast_roles[role] ~= broadcast_roles[role] then
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
30 changed = true;
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
31 end
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
32 end
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
33
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
34 if not changed then return false; end
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
35
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
36 room._data.presence_broadcast = broadcast_roles;
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
37
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
38 for _, occupant in room:each_occupant() do
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
39 local x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user";});
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
40 local role = occupant.role or "none";
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
41 if broadcast_roles[role] and not old_broadcast_roles[role] then
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
42 -- Presence broadcast is now enabled, so announce existing user
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
43 room:publicise_occupant_status(occupant, x);
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
44 elseif old_broadcast_roles[role] and not broadcast_roles[role] then
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
45 -- Presence broadcast is now disabled, so mark existing user as unavailable
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
46 room:publicise_occupant_status(occupant, x, nil, nil, nil, nil, true);
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
47 end
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
48 end
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
49
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
50 return true;
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
51 end
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
52
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
53 module:hook("muc-config-form", function(event)
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
54 local values = {};
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
55 for role, value in pairs(get_presence_broadcast(event.room)) do
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
56 if value then
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
57 values[#values + 1] = role;
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
58 end
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
59 end
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
60
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
61 table.insert(event.form, {
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
62 name = "muc#roomconfig_presencebroadcast";
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
63 type = "list-multi";
10516
d3e6941546a8 MUC: Improve presence broadcast form field label
Matthew Wild <mwild1@gmail.com>
parents: 10353
diff changeset
64 label = "Only show participants with roles:";
10353
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
65 value = values;
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
66 options = valid_roles;
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
67 });
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
68 end, 70-7);
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
69
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
70 module:hook("muc-config-submitted/muc#roomconfig_presencebroadcast", function(event)
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
71 local broadcast_roles = {};
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
72 for _, role in ipairs(event.value) do
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
73 broadcast_roles[role] = true;
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
74 end
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
75 if set_presence_broadcast(event.room, broadcast_roles) then
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
76 event.status_codes["104"] = true;
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
77 end
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
78 end);
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
79
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
80 return {
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
81 get = get_presence_broadcast;
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
82 set = set_presence_broadcast;
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
diff changeset
83 };