plugins/pubsub2room.lua

Sat, 12 Mar 2011 10:36:06 +0000

author
Matthew Wild <mwild1@gmail.com>
date
Sat, 12 Mar 2011 10:36:06 +0000
changeset 71
9ab5919aa416
parent 70
22670e551879
child 80
5cb658e37a37
permissions
-rw-r--r--

plugins.pubsub2room: Throttle messages to the room when a batch of notifications arrives at once

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
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
13 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
14
69
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
15 -- FIXME Should this really be here?
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
16 local extractor_mt = {
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
17 __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
18 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
19 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
20 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
21 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
22 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
23 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
24 end
69
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
25 for x in k:gmatch("[^.]+") do
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
26 n = n:get_child(x);
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
27 if not n then return end
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
28 end
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
29 return n[1];
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
30 end
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
31 };
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
32
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
33 local function new_extractor(stanza, 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
34 return stanza and setmetatable({ stanza = stanza, data = data }, extractor_mt) or nil;
69
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
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
37 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
38
69
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
39 function riddim.plugins.pubsub2room(bot)
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
40 local bare_jid = require "util.jid".bare;
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
41 bot:add_plugin("pubsub");
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
42
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
43 local config = bot.config.pubsub2room;
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
44 bot:hook("pubsub/event", function(event)
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
45 local conf = config[event.from .. "#" .. event.node];
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
46 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
47 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
48 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
49
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
50 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
51 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
52
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
53 -- 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
54 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
55 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
56 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
57 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
58 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
59 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
60 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
61 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
62 end
69
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
63 end);
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
64
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
65 -- FIXME When to unsubscribe?
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
66 bot:hook("started", function()
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
67 local jid = bare_jid(bot.stream.jid);
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
68 for hostnode in pairs(config) do
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
69 local host, node = hostnode:match("^([^#]+)#(.*)");
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
70 bot.pubsub:subscribe(host, node, jid, print);
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 end);
2d7c29310a28 plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
73 end

mercurial