MS Bot Framework: Detectar cuándo un bot ha sido añadido/eliminado de una conversación

Cuando llevas tiempo trabajando con Microsoft Bot Framework empiezan a surgir escenarios de todo tipo. Uno de ellos es que el bot sea capaz de detectar cuándo un usuario va a comenzar una conversación con él a través de algún canal. De esta forma, es posible que sea él quien comience la conversación con un saludo, presentando las opciones disponibles, almacenando este comportamiento dentro de tus métricas, o cualquier otro mensaje. En este post voy a mostrarte el código necesario para lograrlo.

El módulo botbuilder tiene numerosas propiedades y eventos de los que podemos sacar provecho. Algunos de ellos son conversationUpdate y contactRelationUpdate (echa un vistazo a este fragmento de código del botbuilder en GitHub), que nos permiten identificar una nueva conversación o cuándo un usuario nos ha agregado o eliminado a su lista de contactos, dependiendo del canal.

//Modules
var restify = require('restify'),
    builder = require('botbuilder');

//Connection with MS Bot Framework
var connector = new builder.ChatConnector({
    appId: 'YOUR_APP_ID',
    appPassword: 'YOUR_APP_PASSWORD'
});

var bot = new builder.UniversalBot(connector);

var server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, function () {
    console.log('server up & running');
});

server.post('/api/messages', connector.listen());


//Event handler
bot.on('conversationUpdate', function (message) {
    console.log('conversationUpdate');
    console.dir(message);
    bot.send(new builder.Message()
        .address(message.address)
        .text('Hey %s!', message.address.user.name));
});

bot.on('contactRelationUpdate', function (message) {
    console.log('contactRelationUpdate');
    console.dir(message);
    if (message.action == 'add') {
        bot.send(new builder.Message()
            .address(message.address)
            .text('The bot was added from a users contact list'));

        bot.send(new builder.Message()
            .address(message.address)
            .text('Hey %s! Action %s', message.address.user.name, message.action));
    }
    else{
        //The user stops to use your bot snif
    }
});

bot.dialog('/',function(session){
    session.send('Hey!');
});

Por ejemplo, en Skype, contactRelationUpdate se lanza cuando agregas o eliminas al bot de tu lista de contactos. En el web chat el evento que se lanza es conversationUpdate ya que no existe el concepto de agregar al bot a ninguna lista de usuarios para comenzar la conversación con él.

El bot ha sido eliminado de la lista de contactos del usuario
El bot ha sido eliminado de la lista de contactos del usuario

Gracias a estos eventos no solo podemos enviar mensajes al usuario de bienvenida, sino que también podemos analizar el comportamiento con los mismos, incluso si han decidido dejar de utilizar nuestro servicio.

¡Saludos!