Software /
code /
prosody
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 |
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 }; |