-
Notifications
You must be signed in to change notification settings - Fork 2.3k
Conversation does not work when require_delivery is true on express server #883
Description
It is inportant to me that I run my messenger bot on my own express server.
I have implemented botkit+express following this stackexchange answer by @jonchurch and it is working. I can receive and send back messages.
The problem (as for lot of developers as I can see) start when I create conversation. Consider this example:
convo.addQuestion('1', function(response, convo){
convo.say('Cool, you said: ' + response.text);
convo.next();
});
convo.addQuestion('2', function(response, convo){
convo.say('Cool2, you said: ' + response.text);
convo.next();
});
I would expect the conversation like this:
bot:1
me:a
bot: cool, you said: a
bot: 2
....
but what I got was:
bot:1
me:a
bot:2
me: b
bot: cool, you said: a
bot: coll, you said:b
So I added require_delivery: true. However that breaks the conversation:
bot:1
me:a
//and at this point we are stuck until I restart the server
I found a lot of issues when require_delivery: true breaks conversations. The latest resolve was pointing out that there is need to update handleWebhookPayload function. I chencked the repository and found exact code that was suggested. After two days that leaves me out of options.
Here is full code how I set up my bot with express server.
index.js:
require('dotenv').config();
var Botkit = require('botkit');
var controller = Botkit.facebookbot({
debug: true,
access_token: process.env.access_token,
verify_token: process.env.verify_token,
require_delivery: true,
})
var db = require(__dirname + '/models/db');
db.connect( function( err ) {
if(err){
console.log('Could not connect to Mongo database: ' + err);
} else{
var webserver= require(__dirname + '/components/express_webserver.js')(controller);
//routes for web part
require('./bot/index')(controller);
}
});
express_webserver.js:
var express = require('express');
var bodyParser = require('body-parser');
var querystring = require('querystring');
var debug = require('debug')('botkit:webserver');
module.exports = function(controller, bot) {
var webserver = express();
webserver.use(bodyParser.json());
webserver.use(bodyParser.urlencoded({ extended: true }));
webserver.use(express.static('public'));
webserver.listen(process.env.port || 3000, null, function() {
console.log('Express webserver configured and listening at ',
process.env.HOSTNAME || 'http://localhost/' + ':' + process.env.PORT || 3000);
});
require('./routes/facebook-webhook')(webserver, controller)
require('./facebook_setup')(controller);
controller.webserver = webserver;
return webserver;
}
facebook-webhook.js:
module.exports = function(webserver, controller) {
webserver.post('/facebook/receive', function(req, res) {
res.status(200);
res.send('ok');
var bot = controller.spawn({});
controller.handleWebhookPayload(req, res, bot);
});
webserver.get('/facebook/receive', function(req, res) {
if (req.query['hub.mode'] == 'subscribe') {
if (req.query['hub.verify_token'] == controller.config.verify_token) {
res.send(req.query['hub.challenge']);
} else {
res.send('OK');
}
}
});
}
facebook_setup.js:
var Request = require('request');
module.exports = function (controller) {
Request.post('https://graph.facebook.com/me/subscribed_apps?access_token=' + controller.config.access_token,
function (err, res, body) {
if (err) {
controller.log('Could not subscribe to page messages')
}
else {
controller.log('Successfully subscribed to Facebook events:', body)
console.log('Botkit can now receive messages')
controller.startTicking()
}
})
}
and bot/index.js:
module.exports = function(controller){
controller.hears(['hello'], 'message_received', function(bot, message) {
bot.startConversation(message, function(err, convo){
convo.addQuestion('1', function(response, convo){
convo.say('Cool, you said: ' + response.text);
convo.next();
});
convo.addQuestion('2', function(response, convo){
convo.say('Cool2, you said: ' + response.text);
convo.next();
});
});
});
}
I will appreciate any help or guidence