Middlewares en Microsoft Bot Framework

Llevo ya tiempo contándote cómo trabajar con Microsoft Bot Framework para el desarrollo y la integración de bots en diferentes canales. Hoy quería contarte cómo hacer uso del concepto middleware en tus bots con el objetivo de reutilizar piezas de código que se inyectan antes de la acción a invocar.

Microsoft Bot Framework tiene una clase llamada Middleware con tres helpers para tres acciones concretas:

firstRun: se utiliza para forzar la primera acción por la que tiene que pasar un usuario antes de que comience el flujo normal:

//Adds a first run experience to a bot
bot.use(builder.Middleware.firstRun({ version: 1.0, dialogId: '*:/firstRun' }));

bot.dialog('/firstRun', [
    function (session, args) {
        builder.Prompts.text(session, "Hi! Who are you?");
    },
    function (session, results) {
        session.userData.name = results.response;
        session.endDialog('Hi %s! Nice to meet you! Please, say something else.', session.userData.name);        
    }
]);

dialogVersion: más que útil mientrás se está desarrollando el bot. Te permite forzar el reseteo del mismo, en este ejemplo, a través de la palabra reset:

//Installs a piece of middleware that manages the versioning of a bots dialogs.
bot.use(builder.Middleware.dialogVersion({ version: 1.0, resetCommand: /^reset/i, message: 'reset!' }));

sendTyping: en aquellos canales donde esté soportado, incluye la acción typing antes de responder al usuario, con el objetivo de simular una conversación real:

//Installs a piece of middleware that will always send an initial typing indication to the user.
bot.use(builder.Middleware.sendTyping());

Para cualquier otro escenario, también es posible implementar tu propio middleware. Un ejemplo bastante común sería una pieza que te permita trazar todo lo que ocurre en cada petición, sin necesidad de ir dialogo por dialogo incluyendo trazas.

bot.use({
    botbuilder: function (session, next) {
        if (/log on/g.test(session.message.text)) {
            session.userData.isLogging = true;
            session.send('Logging is now turned on');
        }
        else if (/log off/g.test(session.message.text)) {
            session.userData.isLogging = false;
            session.send('Logging is now turned off');
        }
        else {
            if (session.userData.isLogging) {
                console.dir(session.message);                
            }

            next();
        }
    }
});

¡Saludos!