Tue, 18 Aug 2015 15:53:48 +0200
plugins.issues: Add plugin for issue-tracker
57
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1 | local parse_xkcd_list; |
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
2 | local xkcd_list_updated_at = 0; |
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
3 | local xkcd_list = { }; |
107
441ec8dcdfde
plugins.xkcd: Forward-declare handle_xkcd_command()
Kim Alvefur <zash@zash.se>
parents:
98
diff
changeset
|
4 | local handle_xkcd_command; |
57
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
5 | |
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
6 | function riddim.plugins.xkcd(bot) |
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
7 | local http = require("net.http"); |
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
8 | bot:hook("commands/xkcd", function(command) |
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
9 | if os.difftime(os.time(), xkcd_list_updated_at) > (3 * 60 * 60) then -- Not refreshed within 3 hours |
108
70db447e3669
plugins.xkcd: Remove old comment
Kim Alvefur <zash@zash.se>
parents:
107
diff
changeset
|
10 | http.request('http://xkcd.com/archive/', { headers = { ["If-Modified-Since"] = os.date("!%a, %d %b %Y %H:%M:%S %Z", xkcd_list_updated_at) } }, function (data, code) |
57
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
11 | if code == 200 then |
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
12 | xkcd_list_updated_at = os.time(); |
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
13 | print("debug", "got "..(#data or 0).." bytes of data"); |
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
14 | parse_xkcd_list(data); |
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
15 | elseif code == 304 then |
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
16 | xkcd_list_updated_at = os.time(); |
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
17 | else |
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
18 | if code > 0 then |
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
19 | command:reply("Received HTTP "..code.." error trying to fetch the XKCD archive"); |
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
20 | else |
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
21 | command:reply("Unable to fetch the XKCD archive from xkcd.com: "..data:gsub("%-", " ")); |
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
22 | end |
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
23 | return; |
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
24 | end |
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
25 | command:reply(handle_xkcd_command(command)); |
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
26 | end); |
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
27 | else |
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
28 | return handle_xkcd_command(command); |
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
29 | end |
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
30 | end); |
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
31 | end |
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
32 | |
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
33 | function handle_xkcd_command(command) |
109
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
34 | local xkcdnum = command.param; |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
35 | if not xkcdnum then |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
36 | xkcdnum = #xkcd_list; |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
37 | elseif not tonumber(xkcdnum) then -- Search for an xkcd |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
38 | local xkcdname = xkcdnum:lower(); |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
39 | if xkcd_list[xkcdname] then |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
40 | xkcdnum = xkcd_list[xkcdname]; |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
41 | local xkcd = xkcd_list[xkcdnum]; |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
42 | return xkcd..", http://xkcd.org/"..xkcdnum.."/"; |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
43 | end |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
44 | |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
45 | local xkcdpat = xkcdname:gsub("[-()%[]", "%%%0") |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
46 | :gsub("%%(%b[])",function(s) return (#s > 2 and "" or "%") .. s end); |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
47 | local results = {}; |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
48 | |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
49 | for i, xkcd in pairs(xkcd_list) do |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
50 | if type(i) == "number" and xkcd:lower():match(xkcdpat) then |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
51 | results[#results+1] = i; |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
52 | end |
97
a532667d596e
plugins.xkcd: If no argument is given, return the latest strip
Kim Alvefur <zash@zash.se>
parents:
78
diff
changeset
|
53 | end |
109
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
54 | |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
55 | if #results == 0 then |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
56 | return "Sorry, I couldn't find a match"; |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
57 | elseif #results == 1 then |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
58 | xkcdnum = results[1]; |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
59 | else |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
60 | -- We have more than one match |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
61 | local ret = "Multiple matches:"; |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
62 | for i, xkcdnum in ipairs(results) do |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
63 | local xkcd = xkcd_list[xkcdnum]; |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
64 | ret = string.format("%s %s (%d)%s", ret, xkcd, xkcdnum, ((i < #results) and ",") or ""); |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
65 | if i > 5 then ret = ret .. " " .. (#results - 5) .. " more"; break; end |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
66 | end |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
67 | return ret; |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
68 | end |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
69 | end |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
70 | -- Check that xkcdnum is a valid number |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
71 | xkcdnum = tonumber(xkcdnum); |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
72 | local xkcd = xkcd_list[xkcdnum]; |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
73 | if not xkcd then return "Sorry, I don't think there is a XKCD #"..xkcdnum; end |
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
74 | return xkcd..", http://xkcd.org/"..xkcdnum.."/"; |
57
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
75 | end |
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
76 | |
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
77 | function parse_xkcd_list(t) |
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
78 | if not t then return nil; end |
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
79 | for number, name in string.gmatch(t,"<a [^>]*href=\"/(%d+)/\"[^>]*>([^<]+)") do |
109
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
80 | number = tonumber(number); |
98
1f365028aae1
plugins.xkcd: Make really sure that strip numbers are numbers
Kim Alvefur <zash@zash.se>
parents:
97
diff
changeset
|
81 | if number then |
109
1c94ed0bfdec
plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations
Kim Alvefur <zash@zash.se>
parents:
108
diff
changeset
|
82 | xkcd_list[name:lower()] = number; |
98
1f365028aae1
plugins.xkcd: Make really sure that strip numbers are numbers
Kim Alvefur <zash@zash.se>
parents:
97
diff
changeset
|
83 | xkcd_list[number] = name; |
1f365028aae1
plugins.xkcd: Make really sure that strip numbers are numbers
Kim Alvefur <zash@zash.se>
parents:
97
diff
changeset
|
84 | end |
57
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
85 | end |
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
86 | return true; |
766f4225110b
plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
87 | end |