|
1 -- Plugin for querying issue-tracker |
|
2 -- |
|
3 -- Example config: |
|
4 -- issues = { |
|
5 -- ["project@conference.example.org"] = "http://example.org/issues/"; |
|
6 -- } |
|
7 |
|
8 local url = require"socket.url"; |
|
9 local json = require"util.json"; |
|
10 local http = require"net.http"; |
|
11 |
|
12 function riddim.plugins.issues(bot) |
|
13 local conf = bot.config.issues; |
|
14 |
|
15 local ex = { |
|
16 headers = { |
|
17 Accept = "application/json"; |
|
18 }; |
|
19 }; |
|
20 |
|
21 local function get_issue_url(base, id) |
|
22 local base_url = url.parse(base or "http://localhost:8006/"); |
|
23 local base_path = url.parse_path(base_url.path); |
|
24 base_path[#base_path+1] = "issue"; |
|
25 base_path[#base_path+1] = id; |
|
26 base_path.is_directory = nil; |
|
27 base_url.path = url.build_path(base_path); |
|
28 return url.build(base_url); |
|
29 end |
|
30 |
|
31 bot:hook("commands/issue", function (command) |
|
32 local issue_id = tonumber(command.param); |
|
33 if not issue_id then return; end |
|
34 local current_conf = conf[command.room and command.room.jid or "default"]; |
|
35 if not current_conf then return end |
|
36 local issue_url = get_issue_url(current_conf, issue_id); |
|
37 http.request(issue_url, ex, function (data, code) |
|
38 if code > 400 then |
|
39 return command:reply("HTTP Error "..code.." :("); |
|
40 end |
|
41 data = data and json.decode(data); |
|
42 if not data then |
|
43 return command:reply("Got invalid JSON back :("); |
|
44 end |
|
45 local issue = data.issue; |
|
46 local tags = {}; |
|
47 for tag in pairs(issue.tags) do |
|
48 table.insert(tags, tag); |
|
49 end |
|
50 command:reply(("Issue #%d %q {%s}\n%s"):format(issue.id, issue.title, table.concat(tags, ", "), issue_url)); |
|
51 end); |
|
52 return true; |
|
53 end); |
|
54 |
|
55 local function check_for_issue_id(message) |
|
56 local issue_id = message.body and message.body:match"#(%d+)"; |
|
57 if issue_id then |
|
58 return bot:event("commands/issue", { param = issue_id, reply = message.reply, room = message.room }); |
|
59 end |
|
60 end |
|
61 |
|
62 bot:hook("groupchat/joining", function (room) |
|
63 room:hook("message", check_for_issue_id); |
|
64 end); |
|
65 end |