Wed, 15 Mar 2023 12:19:39 +0000
riddim: exit with non-zero code (1) on disconnect
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 |