-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbot.js
More file actions
80 lines (67 loc) · 2.07 KB
/
bot.js
File metadata and controls
80 lines (67 loc) · 2.07 KB
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
const botBuilder = require('claudia-bot-builder');
const co = require('co');
const coreq = require('co-request');
const each = require('co-each');
const aws = require('aws-sdk');
const lambda = new aws.Lambda();
const slackDelayedReply = botBuilder.slackDelayedReply;
const api = botBuilder((message, apiRequest) => {
return new Promise(
(resolve, reject) => {
lambda.invoke(
lambdaInvocationParams(apiRequest, message),
(err, done) => {
if (err) return reject(err);
resolve(done);
}
);
})
.then(() => {
const noOfUrls = urlsFromSlackMessage(message).length;
return { text: `Hold on. I'm pinging ${noOfUrls} urls` }
})
.catch((ex) => {
return `Ok, something went seriously wrong...\n ${ex.message}`
});
});
api.intercept((event) => {
return co(function *() {
if (!event.slackEvent) return event;
const message = event.slackEvent; //original slack message sent to bot
const urls = urlsFromSlackMessage(message);
var pingResults = yield each(urls, pingUrl);
var attachments = yield each(pingResults, pingResultToSlackAttachement);
return slackDelayedReply(message, {
response_type: "ephemeral",
text: `Ping results:`,
attachments: attachments
})
.then(() => false); // prevents normal execution
});
});
module.exports = api;
function lambdaInvocationParams(apiRequest, originalSlackMessage) {
return {
FunctionName: apiRequest.lambdaContext.functionName,
Qualifier: apiRequest.lambdaContext.functionVersion,
InvocationType: 'Event',
Payload: JSON.stringify({ slackEvent: originalSlackMessage })
};
}
function urlsFromSlackMessage(message){
return message.text.split(',');
};
function pingResultToSlackAttachement(url){
return { text : url };
};
function pingUrl(url) {
return co(function*() {
const start = new Date();
const result = yield coreq(url);
const end = new Date() - start;
return `${url} - ${end} ms`;
})
.catch(function(err) {
return `Could not ping ${url} - '${err.message}'`;
});
};