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