plugins/pubsub2room.lua

Sun, 20 May 2018 02:06:16 +0200

author
Kim Alvefur <zash@zash.se>
date
Sun, 20 May 2018 02:06:16 +0200
changeset 139
6de453570270
parent 138
7c95aba75a55
child 141
be0754cc0ede
permissions
-rw-r--r--

plugins.pubsub2room: Import verse (no longer global)

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];
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
53 local room = bot.rooms[conf.room];
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
54 local data = st.stanza(""):tag("id"):text(event.item.attr.id);
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
55 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
56
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
57 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
58 local message = conf.template:gsub("%${([^}]+)}", entry);
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
59
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
60 -- 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
61 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
62 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
63 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
64 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
65 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
66 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
67 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
68 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
69 end
69
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
70 end);
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
71
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
72 -- FIXME When to unsubscribe?
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
73 bot:hook("started", function()
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
74 local jid = bare_jid(bot.stream.jid);
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
75 for hostnode in pairs(config) do
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
76 local host, node = hostnode:match("^([^#]+)#(.*)");
104
8202cdfb99b4 plugins.pubsub2room: Remove old debug print
Kim Alvefur <zash@zash.se>
parents: 99
diff changeset
77 bot.stream.pubsub(host, node):subscribe(jid);
69
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
78 end
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

mercurial