-
Notifications
You must be signed in to change notification settings - Fork 255
/
Copy pathsetup.js
115 lines (100 loc) · 5.06 KB
/
setup.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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
'use strict';
const prompt = require('souffleur');
const rp = require('minimal-request-promise');
const qs = require('querystring');
const slackReply = require('./reply');
const slackParse = require('./parse');
const color = require('../console-colors');
module.exports = function slackSetup(api, bot, logError, optionalParser, optionalResponder) {
let parser = optionalParser || slackParse;
let responder = optionalResponder || slackReply;
// Hanlde Slack ssl_check GET request, info: https://api.slack.com/slash-commands#ssl
api.get('/slack/slash-command', () => 'OK');
api.post('/slack/slash-command', request => {
if ((request.post.command &&
(request.post.token === request.env.slackToken || request.post.token === request.env.slackVerificationToken))
||
(request.post.trigger_word && request.post.token === request.env.slackWebhookToken))
return bot(parser(request.post), request)
.then((botResponse) => responder(botResponse, request.env.slackToken))
.catch(logError);
else
return responder('unmatched token' + ' ' + request.post.token);
});
api.post('/slack/message-action', request => {
const payload = JSON.parse(request.post.payload);
if (payload.token === request.env.slackVerificationToken || payload.token === request.env.slackToken)
return bot(parser(payload), request)
.then(botResponder => {
return responder(botResponder, payload.type);
})
.catch(logError);
else
return responder('unmatched token' + ' ' + payload.token);
});
api.get('/slack/landing', request => {
return rp.post('https://slack.com/api/oauth.access', {
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: qs.encode({
client_id: request.env.slackClientId,
client_secret: request.env.slackClientSecret,
code: request.queryString.code,
redirect_uri: request.env.slackRedirectUrl
})
})
.then(() => request.env.slackHomePageUrl);
}, {
success: 302
});
api.addPostDeployStep('slackSlashCommand', (options, lambdaDetails, utils) => {
return Promise.resolve().then(() => {
if (options['configure-slack-slash-command']) {
console.log(`\n\n${color.green}Slack slash command setup${color.reset}\n`);
console.log(`\nFollowing info is required for the setup, for more info check the documentation.\n`);
console.log(`\nNote that you can add one token for a slash command, and a second token for an outgoing webhook.\n`);
console.log(`\nYour Slack slash command Request URL (POST only) is ${color.cyan}${lambdaDetails.apiUrl}/slack/slash-command${color.reset}\n`);
console.log(`${color.dim}If you are building full-scale Slack app instead of just a slash command for your team, restart with --configure-slack-slash-app${color.reset} \n`);
return prompt(['Slack token', 'Outgoing webhook token'])
.then(results => {
const deployment = {
restApiId: lambdaDetails.apiId,
stageName: lambdaDetails.alias,
variables: {
slackToken: results['Slack token'],
slackWebhookToken: results['Outgoing webhook token']
}
};
console.log(`\n`);
return utils.apiGatewayPromise.createDeploymentPromise(deployment);
});
}
if (options['configure-slack-slash-app']) {
console.log(`\n\n${color.green}Slack App slash command setup${color.reset}\n`);
console.log(`\nFollowing info is required for the setup, for more info check the documentation.\n`);
console.log(`\nYour Slack redirect URL is ${color.cyan}${lambdaDetails.apiUrl}/slack/landing${color.reset}\n`);
console.log(`\nYour Slack slash command Request URL (POST only) is ${color.cyan}${lambdaDetails.apiUrl}/slack/slash-command${color.reset}\n`);
console.log(`\nIf you are using buttons, your Action URL is ${color.cyan}${lambdaDetails.apiUrl}/slack/message-action${color.reset}\n`);
console.log(`${color.dim}If you are building just a slash command integration for your team and you don't need full-scale Slack app restart with --configure-slack-slash-command${color.reset} \n`);
return prompt(['Slack Client ID', 'Slack Client Secret', 'Slack verification token', 'Home page URL'])
.then(results => {
const deployment = {
restApiId: lambdaDetails.apiId,
stageName: lambdaDetails.alias,
variables: {
slackClientId: results['Slack Client ID'],
slackClientSecret: results['Slack Client Secret'],
slackVerificationToken: results['Slack verification token'],
slackHomePageUrl: results['Home page URL'],
slackRedirectUrl: `${lambdaDetails.apiUrl}/slack/landing`
}
};
console.log(`\n`);
return utils.apiGatewayPromise.createDeploymentPromise(deployment);
});
}
})
.then(() => `${lambdaDetails.apiUrl}/slack/slash-command`);
});
};