-
Notifications
You must be signed in to change notification settings - Fork 2
/
slack.js
54 lines (49 loc) · 1.79 KB
/
slack.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
const fetch = require('node-fetch');
const debug = require('util').debuglog('whoa-nelly');
const qs = require('querystring');
const VError = require('verror');
if (!process.env.SLACK_TOKEN) {
throw new Error("SLACK_TOKEN must exist in the environment");
}
var slack = module.exports = {
users: {
getByName: name => slack.users.list().then(list => list.members.find(e => e.name == stripName(name))).then(u => {
if (u && u.id) {
return u;
} else {
throw new Error("User not found");
}
}),
list: () => slackFetch(`https://slack.com/api/users.list`)
},
chat: {
postMessage: (channel, text, opts) => slackFetch(`https://slack.com/api/chat.postMessage`, Object.assign({ channel, text }, opts))
},
channels: {
list: () => slackFetch(`https://slack.com/api/channels.list`),
kick: (channel, user) => slackFetch(`https://slack.com/api/channels.kick`, { channel, user }),
info: channel => slackFetch(`https://slack.com/api/channels.info`, { channel })
},
im: {
open: user => slackFetch(`https://slack.com/api/im.open`, { user })
}
};
function stripName(name) {
return name[0] == '@' ? name.slice(1) : name;
}
function slackFetch(url, args) {
debug('fetching %j %j', url, args);
return fetch(url + "?" + qs.stringify(Object.assign({ token: process.env.SLACK_TOKEN }, args)))
.then(res => {
debug("response status %j", res.status)
if (res.status >= 400) {
throw new VError("Unexpected error %j", res.status);
}
return res.json()
})
.then(body => {
debug("got %j", body);
if (body.ok) return body;
throw new Error(body.error);
});
}