Wed, 20 Jul 2011 01:04:31 +0200
plugins.xeps: Re-indent
27
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
1 | local parse_xeps, xeps_updated_at; |
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
2 | local xeps = {}; |
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
3 | |
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
4 | function riddim.plugins.xeps(bot) |
32
7e79b03f10e1
plugins.xeps: Use net.http
Florian Zeitz <florob@babelmonkeys.de>
parents:
27
diff
changeset
|
5 | require "net.httpclient_listener"; |
7e79b03f10e1
plugins.xeps: Use net.http
Florian Zeitz <florob@babelmonkeys.de>
parents:
27
diff
changeset
|
6 | local http = require("net.http"); |
27
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
7 | bot:hook("commands/xep", function(command) |
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
8 | -- Cache XEP list for an hour |
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
9 | if os.difftime(os.time(), xeps_updated_at) > (60 * 60) then -- Not refreshed within 1 hour |
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
10 | http.request('http://xmpp.org/extensions/xeps.xml', nil, function (data, code) |
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
11 | if code ~= 200 then |
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
12 | if code > 0 then |
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
13 | command:reply("Received HTTP "..code.." error trying to fetch the XEP list"); |
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
14 | else |
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
15 | command:reply("Unable to fetch the XEP list from xmpp.org: "..data:gsub("%-", " ")); |
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
16 | end |
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
17 | return; |
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
18 | end |
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
19 | xeps_updated_at = os.time(); |
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
20 | parse_xeps(data); |
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
21 | command:reply(handle_xep_command(command)); |
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
22 | end); |
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
23 | else |
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
24 | return handle_xep_command(command); |
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
25 | end |
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
26 | end); |
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
27 | end |
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
28 | |
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
29 | function handle_xep_command(command) |
83 | 30 | local xepnum = command.param; |
31 | if not xepnum then return "Please supply an XEP number or a search string :)"; end | |
32 | if not tonumber(xepnum) then -- Search for an XEP | |
33 | if xepnum:match("^(%d+) ex%S* (%d+)$") then | |
34 | local num, example = xepnum:match("^(%d+) ex%S* (%d+)$"); | |
35 | return "http://xmpp.org/extensions/xep-"..string.rep("0", 4-num:len())..num..".html#example-"..tostring(example); | |
36 | end | |
37 | local results = {}; | |
38 | for x, xep in pairs(xeps) do | |
39 | name = " "..xep.name:lower().." "; | |
40 | if name:match(xepnum:lower():gsub("%-", "%%-")) then | |
41 | table.insert(results, x); | |
42 | --return commands.xep(msg, x); | |
27
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
43 | end |
83 | 44 | end |
45 | if #results == 0 then | |
46 | return "Sorry, I couldn't find a match"; | |
47 | elseif #results == 1 then | |
48 | command.param = results[1]; | |
49 | return handle_xep_command(command); | |
50 | else | |
51 | -- We have more than one match | |
52 | local ret = "Multiple matches:"; | |
53 | for _, x in ipairs(results) do | |
54 | local xepnum = tostring(tonumber(x)); | |
55 | xepnum = string.rep("0", 4-x:len())..x; | |
56 | local xep = xeps[tostring(x)]; | |
57 | ret = string.format("%s XEP-%s: %s%s", ret, xep.number, xep.name, ((_ < #results) and ",") or ""); | |
58 | if _ > 5 then ret = ret .. " " .. (#results - 5) .. " more"; break; end | |
59 | end | |
60 | return ret; | |
61 | end | |
62 | end | |
63 | -- Check that xepnum is a valid number | |
64 | xepnum = tostring(tonumber(xepnum)); | |
65 | if not xepnum then return "What XEP? or enter a search string."; end | |
66 | -- Expand to full 4 char number | |
67 | xepnum = string.rep("0", 4-xepnum:len())..xepnum; | |
68 | xep = xeps[tostring(xepnum)]; | |
69 | if not xep then return "Sorry, I don't think there is a XEP-"..xepnum; end | |
70 | return "XEP-"..xep.number..": "..xep.name.." is "..xep.type.." ("..xep.status..", "..xep.updated..") See: http://xmpp.org/extensions/xep-"..xep.number..".html"; | |
27
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
71 | end |
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
72 | |
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
73 | function parse_xeps(t) |
83 | 74 | if not t then return nil; end |
75 | local currxep = {}; | |
76 | for b in string.gmatch(t,"<xep>(.-)</xep>") do | |
77 | for k,v in string.gmatch(b,"<(%w+)>(.-)</%1>") do | |
78 | currxep[k] = v; | |
79 | end | |
27
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
80 | xeps[currxep.number] = { }; |
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
81 | for k, v in pairs(currxep) do xeps[currxep.number][k] = v end |
83 | 82 | end |
27
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
83 | xeps["0028"] = { number = "0028", name = "XSF Plans for World Domination", type="Top Secret", status = "Hidden", updated = "Work ongoing" }; |
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
84 | return true; |
2c137706d42c
plugins.xeps: Add 'xep' command for looking up XMPP extensions by name or number
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
85 | end |