Es importante tener una mecanismo para guardar información de sesión para no tener que preguntarle al usuario lo mismo más de una vez. Algunos ejemplos:

  • Si es un juego, se puede querer guardar el estado, si ya ha comenzado o no, si el tiempo se ha cumplido …
  • Si es un juego de palabras encadenadas, como el mío, se deben guardar las palabras ya utilizadas por el usuario y por Alexa para que no se repitan.

‘alexa-sdk’ implementa esta funcionalidad de una manera muy sencilla. En una tabla (TABLE_NAME en el código de más abajo) se guarda el userId y todo lo que haya en this.attributes. Automáticamente se guarda al terminar la llamada y se recupera en la siguiente llamada.

const Alexa = require('alexa-sdk');
// Nombre de la tabla, cualquiera vale pero mejor que esté relacionado
// con el nombre de la skill
const alexaTable = TABLE_NAME; 

/////////////////////////
exports.handler = function (event, context) {
    const alexa = Alexa.handler(event, context);
    alexa.appId = 'amzn1.ask.skill.xxxxxx';
    alexa.resources = languageStrings;
    alexa.dynamoDBTableName = alexaTable;
    alexa.registerHandlers( handlers );
    alexa.execute();
};

const handlers = {
    'NewSession' : function () {
        // Attributes contiene lo guardado en la ultima ejecucion
        console.log( "Attrs = " + JSON.stringify(this.attributes));
        if( this.attributes.state === undefined ) // ejemplo
            this.attributes.state = 'NOT_STARTED'; 
        .....
    },
    'SessionEndedRequest': function () {
        console.log('session ended!');
        this.emit(':saveState', true);
        this.emit(':tell', 'Sesión finalizada' );
    }
}

Aunque los atributos de sesión se guardan y recuperan automáticamente en cada intent, se debe hacer la llamada explícita a that.emit(‘:saveState’, true) cuando la sesión termine.