-
Notifications
You must be signed in to change notification settings - Fork 0
/
facebook.js
124 lines (111 loc) · 4.08 KB
/
facebook.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
116
117
118
119
120
121
122
123
124
'use strict';
const facebookApi = require('facebook-api');
const lexApi = require('lex-api');
const richMessages = require('rich-messages');
const VerifyToken = process.env.VERIFY_TOKEN;
const PageId = process.env.PAGE_ID;
const db = require('db');
module.exports.get = function (event, context, callback) {
let query = event.queryStringParameters;
if (query && query['hub.mode']) {
if (query['hub.verify_token'] === VerifyToken) {
callback(null, {
statusCode: 200,
body: query['hub.challenge']
});
} else {
callback(null, {
statusCode: 503,
body: 'Error, wrong validation token'
});
}
}
callback(null, {
statusCode: 403,
body: 'Error, wrong validation token'
});
};
module.exports.post = function (event, context, callback) {
console.log(`POST: ${event.body}`);
let data = JSON.parse(event.body);
// Make sure this is a page subscription
if (data.object === 'page') {
// Iterate over each entry - there may be multiple if batched
data.entry.forEach(function (entry) {
if (entry.id === PageId) {
// Iterate over each messaging event
entry.messaging.forEach(function (msg) {
if (msg.message && ! msg.message.is_echo) {
processMessage(msg);
} else {
console.log(`Webhook received unknown event: ${JSON.stringify(msg)}`);
}
});
} else {
console.log(`Invalid page id: ${entry.id}`);
}
});
}
callback(null, {statusCode: 200, body: 'ok'});
};
function isAudio(attachment) {
return attachment.type === 'audio';
}
function sendMessageToLex(message) {
let attachments = message.message.attachments;
if (attachments && attachments.some(isAudio)) {
return lexApi.sendAudio(message.sender.id, attachments.find(isAudio).payload.url);
} else if (message.message.text) {
let text = message.message.quick_reply && message.message.quick_reply.payload
? message.message.quick_reply.payload
: message.message.text;
return lexApi.sendText(message.sender.id, text);
}
return Promise.reject('Unsupported message type');
}
function sendRichMessages(userId, messages) {
let p = Promise.resolve();
if (messages) {
messages.forEach(rm => {
console.log(`RichMessage: ${JSON.stringify(rm)}`);
if (rm.type === richMessages.Types.text) {
let quickReplies = null;
if (rm.options) {
quickReplies = rm.options.map(option => {
return {
content_type: 'text',
title: option.text,
payload: option.value
}
});
}
p = p.then(() => facebookApi.sendText(userId, rm.text, quickReplies));
} else if (rm.type === richMessages.Types.audio) {
p = p.then(() => facebookApi.sendAudio(userId, rm.url));
} else if (rm.type === richMessages.Types.image) {
p = p.then(() => facebookApi.sendImage(userId, rm.url));
}
})
}
return p;
}
function sendSimpleMessage(userId, text) {
return facebookApi.sendText(userId, text);
}
function processMessage(message) {
facebookApi.sendTyping(message.sender.id);
sendMessageToLex(message)
.then(lexResult => {
console.log(`Lex response: ${JSON.stringify(lexResult)}`);
let rm = richMessages.parse(lexResult.message);
if (rm) {
return sendRichMessages(message.sender.id, rm);
} else {
return sendSimpleMessage(message.sender.id, lexResult.message);
}
})
.catch(err => {
console.error(err);
facebookApi.sendText(message.sender.id, `Sorry, I didn't understand`);
});
}