Skip to content

Commit cca7295

Browse files
committed
Merge branch 'release/0.1.5'
2 parents 7f7c104 + 8452a83 commit cca7295

File tree

4 files changed

+102
-37
lines changed

4 files changed

+102
-37
lines changed

package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "botstack",
3-
"version": "0.1.4",
3+
"version": "0.1.5",
44
"description": "Bot Stack",
55
"main": "index.js",
66
"scripts": {
@@ -48,7 +48,6 @@
4848
"eslint-plugin-import": "^2.2.0",
4949
"eslint-plugin-jsx-a11y": "^4.0.0",
5050
"eslint-plugin-react": "^6.9.0",
51-
"locus": "^2.0.1",
5251
"mocha": "^3.4.2",
5352
"nyc": "^11.0.3"
5453
}

src/botstack.js

Lines changed: 73 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1+
const _ = require('lodash');
12
const fs = require('fs');
23
const path = require('path');
3-
const lodash = require('lodash');
44
const restify = require('restify');
55
const rp = require('request-promise');
66

@@ -158,7 +158,7 @@ class BotStack {
158158
return async function (req, res, next) { // eslint-disable-line func-names, no-unused-vars
159159
res.end();
160160
/* eslint-disable no-restricted-syntax, no-continue, no-await-in-loop */
161-
for (const msg of lodash.get(req.body, 'messages', [])) {
161+
for (const msg of _.get(req.body, 'messages', [])) {
162162
// message schema
163163
// https://docs.smooch.io/rest/?javascript#schema44
164164
if (msg.role !== 'appUser') {
@@ -168,8 +168,8 @@ class BotStack {
168168
module: 'botstack:smoochWebhook',
169169
message: msg
170170
});
171-
const text = lodash.get(msg, 'text');
172-
const authorID = lodash.get(msg, 'authorId');
171+
const text = _.get(msg, 'text');
172+
const authorID = _.get(msg, 'authorId');
173173
let apiAiResponse = null;
174174
let result = null;
175175
try {
@@ -224,12 +224,20 @@ class BotStack {
224224
return async function (req, res, next) { // eslint-disable-line no-unused-vars
225225
res.end();
226226
await self._syncFbMessageToBackChat(req); // eslint-disable-line no-underscore-dangle
227-
const entries = req.body.entry;
227+
const entries = _.get(req, 'body.entry', []);
228228
for (const entry of entries) {
229-
const messages = entry.messaging;
229+
const messages = _.get(entry, 'messaging', []);
230230
for (const message of messages) {
231-
const senderID = message.sender.id;
232-
const isEcho = !!lodash.get(message, 'message.is_echo');
231+
// The sender object is not included for messaging_optins events triggered by the checkbox plugin.
232+
// https://developers.facebook.com/docs/messenger-platform/reference/webhook-events/messaging_optins
233+
let isMessagingOptins = false;
234+
let recipientUserRef = null;
235+
const senderID = _.get(message, 'sender.id');
236+
if ((!senderID) && (_.has(message, 'optin.user_ref'))) {
237+
isMessagingOptins = true;
238+
recipientUserRef = _.get(message, 'optin.user_ref');
239+
}
240+
const isEcho = !!_.get(message, 'message.is_echo');
233241
if (isEcho) {
234242
continue; // eslint-disable-line no-continue
235243
}
@@ -239,17 +247,18 @@ class BotStack {
239247
});
240248
const isNewSession = await sessionStore.checkExists(senderID);
241249
const isPostbackMessage = !!message.postback;
242-
const isQuickReplyPayload = !!lodash.get(message, 'message.quick_reply.payload');
243-
const isTextMessage = !!(!isQuickReplyPayload && lodash.get(message, 'message.text'));
244-
const isGeoLocationMessage = !!lodash.get(message, 'message.attachments[0].payload.coordinates');
250+
const isQuickReplyPayload = !!_.get(message, 'message.quick_reply.payload');
251+
const isTextMessage = !!(!isQuickReplyPayload && _.get(message, 'message.text'));
252+
const isGeoLocationMessage = !!_.get(message, 'message.attachments[0].payload.coordinates');
245253
log.debug('Detect kind of message', {
246254
module: 'botstack:webhookPost',
247255
senderID,
248256
isNewSession,
249257
isPostbackMessage,
250258
isQuickReplyPayload,
251259
isTextMessage,
252-
isGeoLocationMessage
260+
isGeoLocationMessage,
261+
isMessagingOptins
253262
});
254263
await sessionStore.set(senderID);
255264
if (isQuickReplyPayload) {
@@ -268,6 +277,8 @@ class BotStack {
268277
} else {
269278
await self.postbackMessage(message, senderID);
270279
}
280+
} else if (isMessagingOptins) {
281+
await self.messagingOptins(message, recipientUserRef);
271282
} else {
272283
await self.fallback(message, senderID);
273284
}
@@ -346,7 +357,7 @@ class BotStack {
346357
}
347358

348359
async quickReplyPayload(message, senderID) {
349-
const text = lodash.get(message, 'message.quick_reply.payload');
360+
const text = _.get(message, 'message.quick_reply.payload');
350361
this.log.debug('Process quick reply payload', {
351362
module: 'botstack: quickReplyPayload',
352363
senderId: senderID,
@@ -389,6 +400,55 @@ class BotStack {
389400
});
390401
}
391402

403+
async messagingOptins(message, recipientUserRef) {
404+
// on first request we have:
405+
// {
406+
// "recipient":{
407+
// "id":"<PAGE_ID>"
408+
// },
409+
// "timestamp":<UNIX_TIMESTAMP>,
410+
// "optin":{
411+
// "ref":"<PASS_THROUGH_PARAM>",
412+
// "user_ref":"<UNIQUE_REF_PARAM>"
413+
// }
414+
// }
415+
416+
// next send message to user using user_ref param
417+
// curl -X POST -H "Content-Type: application/json" -d '{
418+
// "recipient": {
419+
// "user_ref":"<UNIQUE_REF_PARAM>"
420+
// },
421+
// "message": {
422+
// "text":"hello, world!"
423+
// }
424+
// }' "https://graph.facebook.com/v2.6/me/messages?access_token=<PAGE_ACCESS_TOKEN>"
425+
426+
// after got result:
427+
// {
428+
// "message_id": "mid.1456970487936:c34767dfe57ee6e339"
429+
// }
430+
431+
// let's save this user_ref for future use...
432+
//
433+
this.log.debug('Process message opt-in payload', {
434+
module: 'botstack:messagingOptins',
435+
recipientUserRef
436+
});
437+
if (BotStackCheck('messagingOptins')) {
438+
BotStackEvents.emit('messagingOptins', {
439+
recipientUserRef,
440+
message
441+
});
442+
return;
443+
}
444+
this.log.debug('Sending to Dialogflow', {
445+
module: 'botstack:messagingOptins',
446+
recipientUserRef,
447+
message
448+
});
449+
await fb.reply(fb.textMessage('Hello!'), recipientUserRef, { params: { use_user_ref: true }});
450+
}
451+
392452
startServer() {
393453
const port = process.env.PORT || 1337;
394454
const self = this;

src/fb/reply.js

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,43 @@
1+
const _ = require('lodash');
12
const rp = require('request-promise');
23
const log = require('../log');
34

4-
async function reply(message, senderId) {
5+
async function reply(message, senderId, {messagingType='RESPONSE', params=null}={}) {
6+
const logData = {};
7+
const sendData = {
8+
messaging_type: messagingType,
9+
message
10+
};
11+
12+
logData['module'] = 'botstack:fb';
13+
logData['message'] = message;
14+
15+
if (_.get(params, 'use_user_ref') === true) {
16+
logData['recipientUserRef'] = senderId;
17+
sendData['recipient'] = {
18+
user_ref: senderId
19+
};
20+
} else {
21+
logData['senderId'] = senderId;
22+
sendData['recipient'] = {
23+
id: senderId
24+
};
25+
}
26+
527
if (message == null) {
6-
log.debug('This message ignored to send', {
7-
module: 'botstack:fb',
8-
senderId,
9-
message
10-
});
28+
log.debug('This message ignored to send', logData);
1129
return null;
30+
} else {
31+
log.debug('Sending message', logData);
1232
}
13-
log.debug('Sending message', {
14-
module: 'botstack:fb',
15-
senderId,
16-
message
17-
});
33+
1834
const reqData = {
1935
url: 'https://graph.facebook.com/v2.9/me/messages',
2036
qs: {
2137
access_token: process.env.FB_PAGE_ACCESS_TOKEN
2238
},
2339
method: 'POST',
24-
json: {
25-
recipient: {
26-
id: senderId
27-
},
28-
message
29-
},
40+
json: sendData,
3041
resolveWithFullResponse: true
3142
};
3243
const res = await rp(reqData);

src/webhook_post.js

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,6 @@ const dashbot = require('dashbot')(process.env.DASHBOT_API_KEY).facebook;
55
const sessionStore = require('./session.js')();
66
const log = require('./log.js');
77

8-
function processWelcomeMessage(messageText, senderID) {
9-
10-
}
11-
128
module.exports = (req, res, next) => {
139
console.log(' ');
1410
console.log('===Received a message from FB');
@@ -53,4 +49,3 @@ module.exports = (req, res, next) => {
5349
console.log('===');
5450
return next();
5551
};
56-

0 commit comments

Comments
 (0)