Fri, 11 Mar 2011 22:37:06 +0100
plugins.pubsub2room: Send pubsub events to rooms.
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 | |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
13 | -- FIXME Should this really be here? |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
14 | local extractor_mt = { |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
15 | __index = function (t, k) |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
16 | local n = t.stanza; |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
17 | for x in k:gmatch("[^.]+") do |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
18 | n = n:get_child(x); |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
19 | if not n then return end |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
20 | end |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
21 | return n[1]; |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
22 | end |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
23 | }; |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
24 | |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
25 | local function new_extractor(stanza, ...) |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
26 | local st = stanza:get_child(...) |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
27 | return st and setmetatable({ stanza = st }, extractor_mt) or nil; |
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 | |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
30 | function riddim.plugins.pubsub2room(bot) |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
31 | local bare_jid = require "util.jid".bare; |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
32 | bot:add_plugin("pubsub"); |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
33 | |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
34 | local config = bot.config.pubsub2room; |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
35 | bot:hook("pubsub/event", function(event) |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
36 | local conf = config[event.from .. "#" .. event.node]; |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
37 | local room = bot.rooms[conf.room]; |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
38 | local entry = event.item and new_extractor(event.item, "entry", "http://www.w3.org/2005/Atom") |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
39 | -- FIXME or forever be limited to Atom! |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
40 | |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
41 | 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
|
42 | local message = conf.template:gsub("%${([^}]+)}", entry); |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
43 | room:send_message(message); |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
44 | end); |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
45 | |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
46 | -- FIXME When to unsubscribe? |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
47 | bot:hook("started", function() |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
48 | local jid = bare_jid(bot.stream.jid); |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
49 | for hostnode in pairs(config) do |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
50 | local host, node = hostnode:match("^([^#]+)#(.*)"); |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
51 | bot.pubsub:subscribe(host, node, jid, print); |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
52 | end |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
53 | end); |
2d7c29310a28
plugins.pubsub2room: Send pubsub events to rooms.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
54 | end |