plugins/disco.lua

Fri, 09 Apr 2010 21:01:12 -0400

author
Hubert Chathi <hubert@uhoreg.ca>
date
Fri, 09 Apr 2010 21:01:12 -0400
changeset 6
b0fec41e695b
child 16
ae69cea97598
permissions
-rw-r--r--

initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)

6
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
1 -- disco.lua
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
2
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
3 -- Responds to service discovery queries (XEP-0030), and calculates the entity
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
4 -- capabilities hash (XEP-0115).
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
5
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
6 -- Fill the bot.disco.info.identities, bot.disco.info.features, and
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
7 -- bot.disco.items tables with the relevant disco data. It comes pre-populated
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
8 -- to advertise support for disco#info, disco#items, and entity capabilities,
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
9 -- and to identify itself as Riddim.
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
10
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
11 -- If you want to advertise a node, add entries to the bot.disco.nodes table
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
12 -- with the relevant data. The bot.disco.nodes table should have the same
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
13 -- format as bot.disco (without the nodes element). The nodes are NOT
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
14 -- automatically added to the base disco items, so you will need to add them
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
15 -- yourself.
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
16
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
17 -- To property implement Entity Capabilities, you should make sure that you
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
18 -- send a "c" element within presence stanzas that are sent. The correct "c"
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
19 -- element can be obtained by calling bot.caps() (or bot:caps()).
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
20
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
21 -- Hubert Chathi <hubert@uhoreg.ca>
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
22
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
23 -- This file is hereby placed in the public domain. Feel free to modify and
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
24 -- redistribute it at will
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
25
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
26 local st = require "util.stanza"
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
27 local b64 = require("mime").b64
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
28 local sha1 = require("util.hashes").sha1
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
29
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
30 function riddim.plugins.disco(bot)
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
31 bot.disco = {}
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
32 bot.disco.info = {}
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
33 bot.disco.info.identities = {
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
34 {category = 'client', type='bot', name='Riddim'},
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
35 }
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
36 bot.disco.info.features = {
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
37 {var = 'http://jabber.org/protocol/caps'},
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
38 {var = 'http://jabber.org/protocol/disco#info'},
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
39 {var = 'http://jabber.org/protocol/disco#items'},
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
40 }
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
41 bot.disco.items = {}
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
42 bot.disco.nodes = {}
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
43
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
44 bot.caps = {}
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
45 bot.caps.node = 'http://code.matthewwild.co.uk/riddim/'
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
46
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
47 local function cmp_identity(item1, item2)
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
48 if item1.category < item2.category then return true;
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
49 elseif item2.category < item1.category then return false;
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
50 end
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
51 if item1.type < item2.type then return true;
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
52 elseif item2.type < item1.type then return false;
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
53 end
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
54 if (not item1['xml:lang'] and item2['xml:lang'])
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
55 or (item2['xml:lang'] and item1['xml:lang'] < item2['xml:lang']) then
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
56 return true
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
57 end
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
58 return false
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
59 end
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
60
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
61 local function cmp_feature(item1, item2)
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
62 return item1.var < item2.var
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
63 end
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
64
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
65 local function calculate_hash()
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
66 table.sort(bot.disco.info.identities, cmp_identity)
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
67 table.sort(bot.disco.info.features, cmp_feature)
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
68 local S = ''
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
69 for key,identity in pairs(bot.disco.info.identities) do
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
70 S = S .. string.format('%s/%s/%s/%s', identity.category, identity.type,
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
71 identity['xml:lang'] or '', identity.name or '')
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
72 .. '<'
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
73 end
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
74 for key,feature in pairs(bot.disco.info.features) do
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
75 S = S .. feature.var
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
76 .. '<'
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
77 end
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
78 -- FIXME: make sure S is utf8-encoded
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
79 return (b64(sha1(S)))
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
80 end
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
81
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
82 setmetatable(bot.caps,
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
83 {
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
84 __call = function (...) -- vararg: allow calling as function or member
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
85 -- retrieve the c stanza to insert into the
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
86 -- presence stanza
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
87 local hash = calculate_hash()
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
88 return st.stanza('c',
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
89 {xmlns = 'http://jabber.org/protocol/caps',
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
90 hash = 'sha-1',
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
91 node = bot.caps.node,
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
92 ver = hash})
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
93 end})
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
94
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
95 bot:hook("iq/http://jabber.org/protocol/disco#info",
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
96 function (event)
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
97 local stanza = event.stanza
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
98 if stanza.attr.type == 'get' then
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
99 local query = stanza:child_with_name('query')
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
100 if not query then return; end
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
101 -- figure out what identities/features to send
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
102 local identities
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
103 local features
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
104 if query.attr.node then
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
105 local hash = calculate_hash()
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
106 local node = bot.disco.nodes[query.attr.node]
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
107 if node and node.info then
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
108 identities = node.info.identities or {}
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
109 features = node.info.identities or {}
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
110 elseif query.attr.node == bot.caps.node..'#'..hash then
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
111 -- matches caps hash, so use the main info
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
112 identities = bot.disco.info.identities
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
113 features = bot.disco.info.features
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
114 else
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
115 -- unknown node: give an error
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
116 local response = st.stanza('iq',
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
117 {to = stanza.attr.from,
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
118 from = stanza.attr.to,
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
119 id = stanza.attr.id,
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
120 type = 'error'})
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
121 response:tag('query',{xmlns = 'http://jabber.org/protocol/disco#info'}):reset()
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
122 response:tag('error',{type = 'cancel'})
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
123 :tag('item-not-found',{xmlns = 'urn:ietf:params:xml:ns:xmpp-stanzas'})
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
124 bot:send(response)
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
125 return true
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
126 end
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
127 else
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
128 identities = bot.disco.info.identities
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
129 features = bot.disco.info.features
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
130 end
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
131 -- construct the response
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
132 local result = st.stanza('query',
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
133 {xmlns = 'http://jabber.org/protocol/disco#info',
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
134 node = query.attr.node})
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
135 for key,identity in pairs(identities) do
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
136 result:tag('identity', identity):reset()
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
137 end
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
138 for key,feature in pairs(features) do
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
139 result:tag('feature', feature):reset()
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
140 end
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
141 bot:send(st.stanza('iq',
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
142 {to = stanza.attr.from,
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
143 from = stanza.attr.to,
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
144 id = stanza.attr.id,
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
145 type = 'result'})
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
146 :add_child(result))
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
147 return true
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
148 end
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
149 end);
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
150
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
151 bot:hook("iq/http://jabber.org/protocol/disco#items",
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
152 function (event)
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
153 local stanza = event.stanza
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
154 if stanza.attr.type == 'get' then
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
155 local query = stanza:child_with_name('query')
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
156 if not query then return; end
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
157 -- figure out what items to send
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
158 local items
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
159 if query.attr.node then
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
160 local node = bot.disco.nodes[query.attr.node]
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
161 if node then
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
162 items = node.items or {}
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
163 else
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
164 -- unknown node: give an error
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
165 local response = st.stanza('iq',
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
166 {to = stanza.attr.from,
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
167 from = stanza.attr.to,
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
168 id = stanza.attr.id,
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
169 type = 'error'})
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
170 response:tag('query',{xmlns = 'http://jabber.org/protocol/disco#items'}):reset()
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
171 response:tag('error',{type = 'cancel'})
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
172 :tag('item-not-found',{xmlns = 'urn:ietf:params:xml:ns:xmpp-stanzas'})
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
173 bot:send(response)
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
174 return true
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
175 end
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
176 else
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
177 items = bot.disco.items
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
178 end
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
179 -- construct the response
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
180 local result = st.stanza('query',
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
181 {xmlns = 'http://jabber.org/protocol/disco#items',
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
182 node = query.attr.node})
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
183 for key,item in pairs(items) do
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
184 result:tag('item', item):reset()
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
185 end
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
186 bot:send(st.stanza('iq',
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
187 {to = stanza.attr.from,
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
188 from = stanza.attr.to,
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
189 id = stanza.attr.id,
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
190 type = 'result'})
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
191 :add_child(result))
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
192 return true
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
193 end
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
194 end);
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
195 end
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
196
b0fec41e695b initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
diff changeset
197 -- end of disco.lua

mercurial