plugins/xkcd.lua

Sun, 23 Mar 2014 15:35:57 +0100

author
Kim Alvefur <zash@zash.se>
date
Sun, 23 Mar 2014 15:35:57 +0100
changeset 109
1c94ed0bfdec
parent 108
70db447e3669
child 115
6498ca5ed831
permissions
-rw-r--r--

plugins.xkcd: Change list of comics to have both map of number to name and name to number, allowing some optimizations

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 require "net.httpclient_listener";
766f4225110b plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
8 local http = require("net.http");
766f4225110b plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
9 bot:hook("commands/xkcd", function(command)
766f4225110b plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
10 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
11 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
12 if code == 200 then
766f4225110b plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
13 xkcd_list_updated_at = os.time();
766f4225110b plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
14 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
15 parse_xkcd_list(data);
766f4225110b plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
16 elseif code == 304 then
766f4225110b plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
17 xkcd_list_updated_at = os.time();
766f4225110b plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
18 else
766f4225110b plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
19 if code > 0 then
766f4225110b plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
20 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
21 else
766f4225110b plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
22 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
23 end
766f4225110b plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
24 return;
766f4225110b plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
25 end
766f4225110b plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
26 command:reply(handle_xkcd_command(command));
766f4225110b plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
27 end);
766f4225110b plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
28 else
766f4225110b plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
29 return handle_xkcd_command(command);
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 end
766f4225110b plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
33
766f4225110b plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
34 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
35 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
36 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
37 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
38 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
39 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
40 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
41 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
42 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
43 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
44 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
45
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 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
47 :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
48 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
49
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 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
51 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
52 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
53 end
97
a532667d596e plugins.xkcd: If no argument is given, return the latest strip
Kim Alvefur <zash@zash.se>
parents: 78
diff changeset
54 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
55
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 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
57 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
58 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
59 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
60 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
61 -- 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
62 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
63 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
64 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
65 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
66 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
67 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
68 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
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 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
71 -- 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
72 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
73 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
74 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
75 return xkcd..", http://xkcd.org/"..xkcdnum.."/";
57
766f4225110b plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
76 end
766f4225110b plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
77
766f4225110b plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
78 function parse_xkcd_list(t)
766f4225110b plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
79 if not t then return nil; end
766f4225110b plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
80 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
81 number = tonumber(number);
98
1f365028aae1 plugins.xkcd: Make really sure that strip numbers are numbers
Kim Alvefur <zash@zash.se>
parents: 97
diff changeset
82 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
83 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
84 xkcd_list[number] = name;
1f365028aae1 plugins.xkcd: Make really sure that strip numbers are numbers
Kim Alvefur <zash@zash.se>
parents: 97
diff changeset
85 end
57
766f4225110b plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
86 end
766f4225110b plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
87 return true;
766f4225110b plugins.xkcd: New plugin, guess what it does ;)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
88 end

mercurial