Skip to content
This repository was archived by the owner on Sep 20, 2024. It is now read-only.
This repository was archived by the owner on Sep 20, 2024. It is now read-only.

Conversation does not work when require_delivery is true on express server #883

@KarlisJ

Description

@KarlisJ

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions