Sun, 24 Jul 2011 19:16:40 +0700
plugins/version improvements
39
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1 | --local bugs = {}; |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
2 | local s_match = string.match; |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
3 | local t_insert = table.insert; |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
4 | local to_json = require "json".encode; |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
5 | |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
6 | function riddim.plugins.trac(bot) |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
7 | local trac = bot.config.trac; |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
8 | if not trac then return end |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
9 | |
43 | 10 | require "net.httpclient_listener"; |
11 | local http = require("net.http"); | |
39
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
12 | |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
13 | bot:hook("commands/ticket", function(command) |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
14 | if not command.param then return end |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
15 | local bug_id = s_match(command.param, "%d+"); |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
16 | if not bug_id then return end |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
17 | local format = s_match(command.param, "%w+$"); |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
18 | local url = trac .. '/ticket/' .. bug_id; |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
19 | http.request(url .. '?format=csv', nil, function (data, code) |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
20 | if code ~= 200 then return end |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
21 | if data:sub(1,3) ~= "id," then return end |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
22 | local ticket = map_table(parse_csv(data)); |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
23 | command:reply( |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
24 | format == "raw" and to_json(ticket) or |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
25 | ticket[format] or |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
26 | ( ticket.component .. " / " |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
27 | .. ticket.summary .. ": " |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
28 | .. (ticket.status == "closed" |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
29 | and ticket.resolution |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
30 | or ticket.status == "assigned" and "" |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
31 | or ticket.status) .. " " |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
32 | .. ticket.priority .. " " |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
33 | .. ticket.type .. |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
34 | ( ticket.status == "assigned" |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
35 | and " assigned till ".. ticket.owner or "") |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
36 | .. " - <" .. url .. ">" |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
37 | )); |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
38 | end); |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
39 | end); |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
40 | end |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
41 | |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
42 | function parse_csv(s) |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
43 | s = s -- ending comma |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
44 | local t, l = {{}}, 1 -- table to collect fields |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
45 | local fieldstart = 1 |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
46 | repeat |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
47 | -- next field is quoted? (start with `"'?) |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
48 | if string.find(s, '^"', fieldstart) then |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
49 | local a, c |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
50 | local i = fieldstart |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
51 | repeat |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
52 | -- find closing quote |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
53 | a, i, c = string.find(s, '"("?)', i+1) |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
54 | until c ~= '"' -- quote not followed by quote? |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
55 | if not i then error('unmatched "') end |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
56 | local f = string.sub(s, fieldstart+1, i-1) |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
57 | if not t[l] then t[l] = {} end |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
58 | table.insert(t[l], (string.gsub(f, '""', '"'))) |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
59 | fieldstart = string.find(s, ',', i) + 1 |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
60 | else -- unquoted; find next comma |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
61 | local nexti = math.min(string.find(s, ',', fieldstart) or #s, string.find(s, "\r\n", fieldstart) or #s) |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
62 | if not t[l] then t[l] = {} end |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
63 | table.insert(t[l], string.sub(s, fieldstart, nexti-1)) |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
64 | if string.sub(s, nexti, nexti +1) == "\r\n" then l = l + 1; nexti = nexti +1 end |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
65 | fieldstart = nexti + 1 |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
66 | end |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
67 | until fieldstart > string.len(s) |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
68 | return t |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
69 | end |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
70 | |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
71 | function map_table(t) |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
72 | local ret = {}; |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
73 | if not t[1] then return nil end |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
74 | if not t[2] then return nil end |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
75 | |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
76 | for i,v in ipairs(t[1]) do |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
77 | ret[t[1][i]] = t[2][i] or ""; |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
78 | end |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
79 | return ret |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
80 | end |
b80a9b1d73f1
plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
81 |