plugins/pubsub2room.lua

Thu, 31 May 2018 00:59:08 +0200

author
Kim Alvefur <zash@zash.se>
date
Thu, 31 May 2018 00:59:08 +0200
changeset 145
565c0c43b063
parent 142
211fa13c7ca2
child 146
e545ba65c9ef
permissions
-rw-r--r--

riddim.plugins.pubsub2room: Trim trailing whitespace

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";
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
15
69
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
16 -- FIXME Should this really be here?
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
17 local extractor_mt = {
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
18 __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
19 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
20 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
21 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
22 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
23 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
24 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
25 end
69
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
26 for x in k:gmatch("[^.]+") do
80
5cb658e37a37 pubsub2room: Access to attributes in templates
Kim Alvefur <zash@zash.se>
parents: 71
diff changeset
27 local m, a = x:match("^([^@]*)@(.*)$");
5cb658e37a37 pubsub2room: Access to attributes in templates
Kim Alvefur <zash@zash.se>
parents: 71
diff changeset
28 if m and a then
5cb658e37a37 pubsub2room: Access to attributes in templates
Kim Alvefur <zash@zash.se>
parents: 71
diff changeset
29 m = n:get_child(m);
5cb658e37a37 pubsub2room: Access to attributes in templates
Kim Alvefur <zash@zash.se>
parents: 71
diff changeset
30 return m and m.attr[a] or nil;
5cb658e37a37 pubsub2room: Access to attributes in templates
Kim Alvefur <zash@zash.se>
parents: 71
diff changeset
31 end
69
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
32 n = n:get_child(x);
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
33 if not n then return end
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
34 end
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
35 return n[1];
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
36 end
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
37 };
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
38
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
39 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
40 if not stanza then return nil end
7c95aba75a55 riddim.plugins.pubsub2room: Return early from extractor if no stanza given
Kim Alvefur <zash@zash.se>
parents: 104
diff changeset
41 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
42 end
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
43
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
44 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
45
69
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
46 function riddim.plugins.pubsub2room(bot)
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
47 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
48 bot.stream:add_plugin("pubsub");
69
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
49
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
50 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
51 bot.stream:hook("pubsub/event", function(event)
69
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
52 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
53 if not conf then return end
69
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
54 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
55 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
56 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
57
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
58 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
59 local message = conf.template:gsub("%${([^}]+)}", entry);
145
565c0c43b063 riddim.plugins.pubsub2room: Trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 142
diff changeset
60
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
61 -- 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
62 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
63 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
64 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
65 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
66 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
67 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
68 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
69 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
70 end
69
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
71 end);
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 -- FIXME When to unsubscribe?
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
74 bot:hook("started", function()
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
75 local jid = bare_jid(bot.stream.jid);
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
76 for hostnode in pairs(config) do
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
77 local host, node = hostnode:match("^([^#]+)#(.*)");
104
8202cdfb99b4 plugins.pubsub2room: Remove old debug print
Kim Alvefur <zash@zash.se>
parents: 99
diff changeset
78 bot.stream.pubsub(host, node):subscribe(jid);
69
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
79 end
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
80 end);
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
81 end

mercurial