plugins/trac.lua

Thu, 22 Oct 2020 15:37:43 +0100

author
Matthew Wild <mwild1@gmail.com>
date
Thu, 22 Oct 2020 15:37:43 +0100
changeset 161
c4df517edbc1
parent 115
6498ca5ed831
permissions
-rw-r--r--

config.docker.lua: Require RIDDIM_DEBUG=1 to enable debug mode

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
dd99a0dde016 plugins.trac: Remove curl hack
Kim Alvefur <zash@zash.se>
parents: 39
diff changeset
10 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
11
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
12 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
13 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
14 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
15 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
16 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
17 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
18 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
19 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
20 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
21 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
22 command:reply(
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
23 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
24 ticket[format] or
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
25 ( ticket.component .. " / "
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
26 .. ticket.summary .. ": "
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
27 .. (ticket.status == "closed"
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
28 and ticket.resolution
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
29 or ticket.status == "assigned" and ""
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
30 or ticket.status) .. " "
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
31 .. ticket.priority .. " "
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
32 .. ticket.type ..
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
33 ( ticket.status == "assigned"
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
34 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
35 .. " - <" .. url .. ">"
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
36 ));
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
37 end);
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
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
41 function parse_csv(s)
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
42 s = s -- ending comma
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
43 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
44 local fieldstart = 1
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
45 repeat
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
46 -- 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
47 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
48 local a, c
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
49 local i = fieldstart
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
50 repeat
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
51 -- find closing quote
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
52 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
53 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
54 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
55 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
56 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
57 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
58 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
59 else -- unquoted; find next comma
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
60 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
61 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
62 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
63 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
64 fieldstart = nexti + 1
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
65 end
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
66 until fieldstart > string.len(s)
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
67 return t
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
68 end
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
69
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
70 function map_table(t)
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
71 local ret = {};
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
72 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
73 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
74
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
75 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
76 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
77 end
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
78 return ret
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
79 end
b80a9b1d73f1 plugins.trac: New plugin to fetch ticket info from trac
Kim Alvefur <zash@zash.se>
parents:
diff changeset
80

mercurial