Sun, 24 Jul 2011 19:16:40 +0700
plugins/version improvements
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 |