plugins/pubsub2room.lua

Mon, 06 Dec 2021 11:27:16 +0000

author
Matthew Wild <mwild1@gmail.com>
date
Mon, 06 Dec 2021 11:27:16 +0000
changeset 167
2073137bc943
parent 146
e545ba65c9ef
permissions
-rw-r--r--

rtbl_admin: Notify subscribers on item removal (requires verse 98dc1750584d)

69
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1 --[[ pubsub2room
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
2 relays pubsub broadcasts to rooms
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
3
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
4 example conf:
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
5 pubsub2room = {
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
6 ["pubsub.prosody.im#commits"] = {
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
7 room = "prosody@conference.prosody.im";
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
8 template = "${author.name} committed: ${title}";
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
9 };
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
10 };
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
11 --]]
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
12
139
6de453570270 plugins.pubsub2room: Import verse (no longer global)
Kim Alvefur <zash@zash.se>
parents: 138
diff changeset
13 local verse = require "verse";
70
22670e551879 plugins.pubsub2room: Fix reliance on Atom payloads, and add an extra 'data' parameter for additional non-payload data
Matthew Wild <mwild1@gmail.com>
parents: 69
diff changeset
14 local st = require "util.stanza";
146
e545ba65c9ef riddim.plugins.pubsub2room: Add support for extracting data from JSON Containers (XEP-0335)
Kim Alvefur <zash@zash.se>
parents: 145
diff changeset
15 local json = require "util.json";
70
22670e551879 plugins.pubsub2room: Fix reliance on Atom payloads, and add an extra 'data' parameter for additional non-payload data
Matthew Wild <mwild1@gmail.com>
parents: 69
diff changeset
16
69
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
17 -- FIXME Should this really be here?
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
18 local extractor_mt = {
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
19 __index = function (t, k)
70
22670e551879 plugins.pubsub2room: Fix reliance on Atom payloads, and add an extra 'data' parameter for additional non-payload data
Matthew Wild <mwild1@gmail.com>
parents: 69
diff changeset
20 local n;
22670e551879 plugins.pubsub2room: Fix reliance on Atom payloads, and add an extra 'data' parameter for additional non-payload data
Matthew Wild <mwild1@gmail.com>
parents: 69
diff changeset
21 if k:match("^data%.") then
22670e551879 plugins.pubsub2room: Fix reliance on Atom payloads, and add an extra 'data' parameter for additional non-payload data
Matthew Wild <mwild1@gmail.com>
parents: 69
diff changeset
22 k = k:gsub("^data.", "");
22670e551879 plugins.pubsub2room: Fix reliance on Atom payloads, and add an extra 'data' parameter for additional non-payload data
Matthew Wild <mwild1@gmail.com>
parents: 69
diff changeset
23 n = t.data;
22670e551879 plugins.pubsub2room: Fix reliance on Atom payloads, and add an extra 'data' parameter for additional non-payload data
Matthew Wild <mwild1@gmail.com>
parents: 69
diff changeset
24 else
22670e551879 plugins.pubsub2room: Fix reliance on Atom payloads, and add an extra 'data' parameter for additional non-payload data
Matthew Wild <mwild1@gmail.com>
parents: 69
diff changeset
25 n = t.stanza;
22670e551879 plugins.pubsub2room: Fix reliance on Atom payloads, and add an extra 'data' parameter for additional non-payload data
Matthew Wild <mwild1@gmail.com>
parents: 69
diff changeset
26 end
69
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
27 for x in k:gmatch("[^.]+") do
80
5cb658e37a37 pubsub2room: Access to attributes in templates
Kim Alvefur <zash@zash.se>
parents: 71
diff changeset
28 local m, a = x:match("^([^@]*)@(.*)$");
5cb658e37a37 pubsub2room: Access to attributes in templates
Kim Alvefur <zash@zash.se>
parents: 71
diff changeset
29 if m and a then
5cb658e37a37 pubsub2room: Access to attributes in templates
Kim Alvefur <zash@zash.se>
parents: 71
diff changeset
30 m = n:get_child(m);
5cb658e37a37 pubsub2room: Access to attributes in templates
Kim Alvefur <zash@zash.se>
parents: 71
diff changeset
31 return m and m.attr[a] or nil;
5cb658e37a37 pubsub2room: Access to attributes in templates
Kim Alvefur <zash@zash.se>
parents: 71
diff changeset
32 end
69
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
33 n = n:get_child(x);
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
34 if not n then return end
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
35 end
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
36 return n[1];
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
37 end
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
38 };
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
39
146
e545ba65c9ef riddim.plugins.pubsub2room: Add support for extracting data from JSON Containers (XEP-0335)
Kim Alvefur <zash@zash.se>
parents: 145
diff changeset
40 local json_extractor_mt = {
e545ba65c9ef riddim.plugins.pubsub2room: Add support for extracting data from JSON Containers (XEP-0335)
Kim Alvefur <zash@zash.se>
parents: 145
diff changeset
41 __index = function (t, k)
e545ba65c9ef riddim.plugins.pubsub2room: Add support for extracting data from JSON Containers (XEP-0335)
Kim Alvefur <zash@zash.se>
parents: 145
diff changeset
42 if not k:find"%." then
e545ba65c9ef riddim.plugins.pubsub2room: Add support for extracting data from JSON Containers (XEP-0335)
Kim Alvefur <zash@zash.se>
parents: 145
diff changeset
43 return nil;
e545ba65c9ef riddim.plugins.pubsub2room: Add support for extracting data from JSON Containers (XEP-0335)
Kim Alvefur <zash@zash.se>
parents: 145
diff changeset
44 end
e545ba65c9ef riddim.plugins.pubsub2room: Add support for extracting data from JSON Containers (XEP-0335)
Kim Alvefur <zash@zash.se>
parents: 145
diff changeset
45 for x in k:gmatch("[^.]+") do
e545ba65c9ef riddim.plugins.pubsub2room: Add support for extracting data from JSON Containers (XEP-0335)
Kim Alvefur <zash@zash.se>
parents: 145
diff changeset
46 t = rawget(t, x) or rawget(t, tonumber(x));
e545ba65c9ef riddim.plugins.pubsub2room: Add support for extracting data from JSON Containers (XEP-0335)
Kim Alvefur <zash@zash.se>
parents: 145
diff changeset
47 if t == nil then return end
e545ba65c9ef riddim.plugins.pubsub2room: Add support for extracting data from JSON Containers (XEP-0335)
Kim Alvefur <zash@zash.se>
parents: 145
diff changeset
48 end
e545ba65c9ef riddim.plugins.pubsub2room: Add support for extracting data from JSON Containers (XEP-0335)
Kim Alvefur <zash@zash.se>
parents: 145
diff changeset
49 if type(t) == "table" then
e545ba65c9ef riddim.plugins.pubsub2room: Add support for extracting data from JSON Containers (XEP-0335)
Kim Alvefur <zash@zash.se>
parents: 145
diff changeset
50 return json.encode(t);
e545ba65c9ef riddim.plugins.pubsub2room: Add support for extracting data from JSON Containers (XEP-0335)
Kim Alvefur <zash@zash.se>
parents: 145
diff changeset
51 end
e545ba65c9ef riddim.plugins.pubsub2room: Add support for extracting data from JSON Containers (XEP-0335)
Kim Alvefur <zash@zash.se>
parents: 145
diff changeset
52 return tostring(t);
e545ba65c9ef riddim.plugins.pubsub2room: Add support for extracting data from JSON Containers (XEP-0335)
Kim Alvefur <zash@zash.se>
parents: 145
diff changeset
53 end
e545ba65c9ef riddim.plugins.pubsub2room: Add support for extracting data from JSON Containers (XEP-0335)
Kim Alvefur <zash@zash.se>
parents: 145
diff changeset
54 };
e545ba65c9ef riddim.plugins.pubsub2room: Add support for extracting data from JSON Containers (XEP-0335)
Kim Alvefur <zash@zash.se>
parents: 145
diff changeset
55
70
22670e551879 plugins.pubsub2room: Fix reliance on Atom payloads, and add an extra 'data' parameter for additional non-payload data
Matthew Wild <mwild1@gmail.com>
parents: 69
diff changeset
56 local function new_extractor(stanza, data)
138
7c95aba75a55 riddim.plugins.pubsub2room: Return early from extractor if no stanza given
Kim Alvefur <zash@zash.se>
parents: 104
diff changeset
57 if not stanza then return nil end
146
e545ba65c9ef riddim.plugins.pubsub2room: Add support for extracting data from JSON Containers (XEP-0335)
Kim Alvefur <zash@zash.se>
parents: 145
diff changeset
58 if stanza.attr.xmlns == "urn:xmpp:json:0" then
e545ba65c9ef riddim.plugins.pubsub2room: Add support for extracting data from JSON Containers (XEP-0335)
Kim Alvefur <zash@zash.se>
parents: 145
diff changeset
59 local payload = json.decode(stanza:get_text());
e545ba65c9ef riddim.plugins.pubsub2room: Add support for extracting data from JSON Containers (XEP-0335)
Kim Alvefur <zash@zash.se>
parents: 145
diff changeset
60 if type(payload) == "table" then
e545ba65c9ef riddim.plugins.pubsub2room: Add support for extracting data from JSON Containers (XEP-0335)
Kim Alvefur <zash@zash.se>
parents: 145
diff changeset
61 return setmetatable(payload, json_extractor_mt);
e545ba65c9ef riddim.plugins.pubsub2room: Add support for extracting data from JSON Containers (XEP-0335)
Kim Alvefur <zash@zash.se>
parents: 145
diff changeset
62 end
e545ba65c9ef riddim.plugins.pubsub2room: Add support for extracting data from JSON Containers (XEP-0335)
Kim Alvefur <zash@zash.se>
parents: 145
diff changeset
63 end
138
7c95aba75a55 riddim.plugins.pubsub2room: Return early from extractor if no stanza given
Kim Alvefur <zash@zash.se>
parents: 104
diff changeset
64 return setmetatable({ stanza = stanza, data = data }, extractor_mt);
69
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
65 end
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
66
71
9ab5919aa416 plugins.pubsub2room: Throttle messages to the room when a batch of notifications arrives at once
Matthew Wild <mwild1@gmail.com>
parents: 70
diff changeset
67 local last_message_time = 0;
9ab5919aa416 plugins.pubsub2room: Throttle messages to the room when a batch of notifications arrives at once
Matthew Wild <mwild1@gmail.com>
parents: 70
diff changeset
68
69
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
69 function riddim.plugins.pubsub2room(bot)
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
70 local bare_jid = require "util.jid".bare;
86
2fa4d58349c8 plugins.pubsub2room: Hook pubsub events directly on the stream.
Kim Alvefur <zash@zash.se>
parents: 80
diff changeset
71 bot.stream:add_plugin("pubsub");
69
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
72
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
73 local config = bot.config.pubsub2room;
86
2fa4d58349c8 plugins.pubsub2room: Hook pubsub events directly on the stream.
Kim Alvefur <zash@zash.se>
parents: 80
diff changeset
74 bot.stream:hook("pubsub/event", function(event)
69
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
75 local conf = config[event.from .. "#" .. event.node];
141
be0754cc0ede riddim.plugins.pubsub2room: Return early in case of unconfigured pubsub event
Kim Alvefur <zash@zash.se>
parents: 139
diff changeset
76 if not conf then return end
69
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
77 local room = bot.rooms[conf.room];
142
211fa13c7ca2 riddim.plugins.pubsub2room: Don't create an invalid stanza with an empty name
Kim Alvefur <zash@zash.se>
parents: 141
diff changeset
78 local data = st.stanza("data"):tag("id"):text(event.item.attr.id);
70
22670e551879 plugins.pubsub2room: Fix reliance on Atom payloads, and add an extra 'data' parameter for additional non-payload data
Matthew Wild <mwild1@gmail.com>
parents: 69
diff changeset
79 local entry = event.item and new_extractor(event.item.tags[1], data)
69
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
80
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
81 if not conf or not entry or not room then return end
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
82 local message = conf.template:gsub("%${([^}]+)}", entry);
145
565c0c43b063 riddim.plugins.pubsub2room: Trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 142
diff changeset
83
71
9ab5919aa416 plugins.pubsub2room: Throttle messages to the room when a batch of notifications arrives at once
Matthew Wild <mwild1@gmail.com>
parents: 70
diff changeset
84 -- Throttle to 1 message/second so we don't flood the room
9ab5919aa416 plugins.pubsub2room: Throttle messages to the room when a batch of notifications arrives at once
Matthew Wild <mwild1@gmail.com>
parents: 70
diff changeset
85 if os.time() - last_message_time > 0 then
9ab5919aa416 plugins.pubsub2room: Throttle messages to the room when a batch of notifications arrives at once
Matthew Wild <mwild1@gmail.com>
parents: 70
diff changeset
86 room:send_message(message);
9ab5919aa416 plugins.pubsub2room: Throttle messages to the room when a batch of notifications arrives at once
Matthew Wild <mwild1@gmail.com>
parents: 70
diff changeset
87 last_message_time = os.time();
9ab5919aa416 plugins.pubsub2room: Throttle messages to the room when a batch of notifications arrives at once
Matthew Wild <mwild1@gmail.com>
parents: 70
diff changeset
88 else
9ab5919aa416 plugins.pubsub2room: Throttle messages to the room when a batch of notifications arrives at once
Matthew Wild <mwild1@gmail.com>
parents: 70
diff changeset
89 last_message_time = last_message_time + 1;
9ab5919aa416 plugins.pubsub2room: Throttle messages to the room when a batch of notifications arrives at once
Matthew Wild <mwild1@gmail.com>
parents: 70
diff changeset
90 verse.add_task(last_message_time - os.time(), function ()
9ab5919aa416 plugins.pubsub2room: Throttle messages to the room when a batch of notifications arrives at once
Matthew Wild <mwild1@gmail.com>
parents: 70
diff changeset
91 room:send_message(message);
9ab5919aa416 plugins.pubsub2room: Throttle messages to the room when a batch of notifications arrives at once
Matthew Wild <mwild1@gmail.com>
parents: 70
diff changeset
92 end);
9ab5919aa416 plugins.pubsub2room: Throttle messages to the room when a batch of notifications arrives at once
Matthew Wild <mwild1@gmail.com>
parents: 70
diff changeset
93 end
69
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
94 end);
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
95
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
96 -- FIXME When to unsubscribe?
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
97 bot:hook("started", function()
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
98 local jid = bare_jid(bot.stream.jid);
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
99 for hostnode in pairs(config) do
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
100 local host, node = hostnode:match("^([^#]+)#(.*)");
104
8202cdfb99b4 plugins.pubsub2room: Remove old debug print
Kim Alvefur <zash@zash.se>
parents: 99
diff changeset
101 bot.stream.pubsub(host, node):subscribe(jid);
69
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
102 end
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
103 end);
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
104 end

mercurial