// Alexa SDK for JavaScript v1.0.00 // Copyright (c) 2014-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved. Use is subject to license terms. 'use strict'; function AlexaSkill(appId) { this._appId = appId; } AlexaSkill.prototype.requestHandlers = { LaunchRequest: function (event, context, response) { this.eventHandlers.onLaunch.call(this, event.request, event.session, response); }, IntentRequest: function (event, context, response) { this.eventHandlers.onIntent.call(this, event.request, event.session, response); }, SessionEndedRequest: function (event, context) { this.eventHandlers.onSessionEnded(event.request, event.session); context.succeed(); } }; /** * Override any of the eventHandlers as needed */ AlexaSkill.prototype.eventHandlers = { /** * Called when the session starts. * Subclasses could have overriden this function to open any necessary resources. */ onSessionStarted: function (sessionStartedRequest, session) { }, /** * Called when the user launches the skill without specifying what they want. * The subclass must override this function and provide feedback to the user. */ onLaunch: function (launchRequest, session, response) { throw "onLaunch should be overriden by subclass"; }, /** * Called when the user specifies an intent. */ onIntent: function (intentRequest, session, response) { var intent = intentRequest.intent, intentName = intentRequest.intent.name, intentHandler = this.intentHandlers[intentName]; if (intentHandler) { console.log('dispatch intent = ' + intentName); intentHandler.call(this, intent, session, response); } else { throw 'Unsupported intent = ' + intentName; } }, /** * Called when the user ends the session. * Subclasses could have overriden this function to close any open resources. */ onSessionEnded: function (sessionEndedRequest, session) { } }; /** * Subclasses should override the intentHandlers with the functions to handle specific intents. */ AlexaSkill.prototype.intentHandlers = {}; AlexaSkill.prototype.execute = function (event, context) { try { console.log("session applicationId: " + event.session.application.applicationId); // Validate that this request originated from authorized source. if (this._appId && event.session.application.applicationId !== this._appId) { console.log("The applicationIds don't match : " + event.session.application.applicationId + " and " + this._appId); throw "Invalid applicationId"; } if (!event.session.attributes) { event.session.attributes = {}; } if (event.session.new) { this.eventHandlers.onSessionStarted(event.request, event.session); } // Route the request to the proper handler which may have been overriden. var requestHandler = this.requestHandlers[event.request.type]; requestHandler.call(this, event, context, new Response(context, event.session)); } catch (e) { console.log("Unexpected exception " + e); context.fail(e); } }; var Response = function (context, session) { this._context = context; this._session = session; }; Response.prototype = (function () { var buildSpeechletResponse = function (options) { var alexaResponse = { outputSpeech: { type: 'PlainText', text: options.output }, shouldEndSession: options.shouldEndSession }; if (options.reprompt) { alexaResponse.reprompt = { outputSpeech: { type: 'PlainText', text: options.reprompt } }; } if (options.cardTitle && options.cardContent) { alexaResponse.card = { type: "Simple", title: options.cardTitle, content: options.cardContent }; } var returnResult = { version: '1.0', response: alexaResponse }; if (options.session && options.session.attributes) { returnResult.sessionAttributes = options.session.attributes; } return returnResult; }; return { tell: function (speechOutput) { this._context.succeed(buildSpeechletResponse({ session: this._session, output: speechOutput, shouldEndSession: true })); }, tellWithCard: function (speechOutput, cardTitle, cardContent) { this._context.succeed(buildSpeechletResponse({ session: this._session, output: speechOutput, cardTitle: cardTitle, cardContent: cardContent, shouldEndSession: true })); }, ask: function (speechOutput, repromptSpeech) { this._context.succeed(buildSpeechletResponse({ session: this._session, output: speechOutput, reprompt: repromptSpeech, shouldEndSession: false })); }, askWithCard: function (speechOutput, repromptSpeech, cardTitle, cardContent) { this._context.succeed(buildSpeechletResponse({ session: this._session, output: speechOutput, reprompt: repromptSpeech, cardTitle: cardTitle, cardContent: cardContent, shouldEndSession: false })); } }; })(); module.exports = AlexaSkill;