Last active
June 20, 2018 10:24
-
-
Save muttoni/5718854ef78b1df37fa3e8179ed3f0d6 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* IMPORTANT COPYRIGHT: Shaquilla Johnson - DO NOT COPY IDEA */ | |
// 1. Text strings ===================================================================================================== | |
// Modify these strings and messages to change the behavior of your Lambda function | |
// SEE BOTTOM FOR INTERACTION MODEL | |
var speechOutput; | |
var reprompt; | |
// 2. Skill Code ======================================================================================================= | |
"use strict"; | |
var Alexa = require('alexa-sdk'); | |
var APP_ID = undefined; // TODO replace with your app ID (OPTIONAL). | |
var speechOutput = ''; | |
var handlers = { | |
'LaunchRequest': function () { | |
this.response | |
.speak('Welcome to Math Guru. To get started, just say something like: I want to practice my 6 times tables') | |
.listen('I didnt catch that. Try saying: practice my 4 times tables.') | |
this.emit(':responseReady') | |
}, | |
'AMAZON.HelpIntent': function () { | |
speechOutput = ''; | |
reprompt = ''; | |
this.emit(':ask', speechOutput, reprompt); | |
}, | |
'AMAZON.CancelIntent': function () { | |
speechOutput = ''; | |
this.emit(':tell', speechOutput); | |
}, | |
'AMAZON.StopIntent': function () { | |
speechOutput = ''; | |
this.emit(':tell', speechOutput); | |
}, | |
'SessionEndedRequest': function () { | |
speechOutput = ''; | |
//this.emit(':saveState', true);//uncomment to save attributes to db on session end | |
this.emit(':tell', speechOutput); | |
}, | |
"AnswerIntent": function () { | |
var guess = parseInt(this.event.request.intent.slots.number.value); | |
var answer = parseInt(this.attributes.number) * parseInt(this.attributes.multiplier); | |
var response = ''; | |
if( guess && answer == guess ) { | |
var newMultiplier = getQuestion(); | |
response = 'Great job! ' + this.attributes.number + ' times ' + this.attributes.multiplier + ' is ' + answer + '. What is ' + this.attributes.number + ' times ' + newMultiplier + '?'; | |
this.attributes.multiplier = newMultiplier; | |
} else { | |
this.attributes.lives--; | |
response = 'That is incorrect. You have ' + this.attributes.lives + ' lives left. Try again.'; | |
if(this.attributes.lives < 1 ) { | |
response = 'That is incorrect. You lose! Say something like I want to practice my 4 times tables to start over'; | |
} | |
} | |
this.response.speak(response).listen(response); | |
this.emit(':responseReady'); | |
}, | |
"PracticeTimestables": function () { | |
var number = parseInt(this.event.request.intent.slots.number.value); | |
this.attributes.number = number; | |
this.attributes.multiplier = getQuestion(); | |
this.attributes.lives = 3; | |
//Your custom intent handling goes here | |
var response = 'Ok, lets practice your ' + number + ' times tables. What is ' + number + ' times ' + this.attributes.multiplier + '?'; | |
this.response.speak(response).listen(response); | |
this.emit(':responseReady'); | |
}, | |
'Unhandled': function () { | |
speechOutput = "The skill didn't quite understand what you wanted. Do you want to try something else?"; | |
this.emit(':ask', speechOutput, speechOutput); | |
} | |
}; | |
function getQuestion() { | |
return Math.floor(Math.random()*12); | |
} | |
exports.handler = (event, context) => { | |
var alexa = Alexa.handler(event, context); | |
alexa.APP_ID = APP_ID; | |
// To enable string internationalization (i18n) features, set a resources object. | |
//alexa.resources = languageStrings; | |
alexa.registerHandlers(handlers); | |
//alexa.dynamoDBTableName = 'DYNAMODB_TABLE_NAME'; //uncomment this line to save attributes to DB | |
alexa.execute(); | |
}; | |
// END of Intent Handlers {} ======================================================================================== | |
// 3. Helper Function ================================================================================================= | |
function resolveCanonical(slot){ | |
//this function looks at the entity resolution part of request and returns the slot value if a synonyms is provided | |
try{ | |
var canonical = slot.resolutions.resolutionsPerAuthority[0].values[0].value.name; | |
}catch(err){ | |
console.log(err.message); | |
var canonical = slot.value; | |
}; | |
return canonical; | |
}; | |
function delegateSlotCollection(){ | |
console.log("in delegateSlotCollection"); | |
console.log("current dialogState: "+this.event.request.dialogState); | |
if (this.event.request.dialogState === "STARTED") { | |
console.log("in Beginning"); | |
var updatedIntent= null; | |
// updatedIntent=this.event.request.intent; | |
//optionally pre-fill slots: update the intent object with slot values for which | |
//you have defaults, then return Dialog.Delegate with this updated intent | |
// in the updatedIntent property | |
//this.emit(":delegate", updatedIntent); //uncomment this is using ASK SDK 1.0.9 or newer | |
//this code is necessary if using ASK SDK versions prior to 1.0.9 | |
if(this.isOverridden()) { | |
return; | |
} | |
this.handler.response = buildSpeechletResponse({ | |
sessionAttributes: this.attributes, | |
directives: getDialogDirectives('Dialog.Delegate', updatedIntent, null), | |
shouldEndSession: false | |
}); | |
this.emit(':responseReady', updatedIntent); | |
} else if (this.event.request.dialogState !== "COMPLETED") { | |
console.log("in not completed"); | |
// return a Dialog.Delegate directive with no updatedIntent property. | |
//this.emit(":delegate"); //uncomment this is using ASK SDK 1.0.9 or newer | |
//this code necessary is using ASK SDK versions prior to 1.0.9 | |
if(this.isOverridden()) { | |
return; | |
} | |
this.handler.response = buildSpeechletResponse({ | |
sessionAttributes: this.attributes, | |
directives: getDialogDirectives('Dialog.Delegate', updatedIntent, null), | |
shouldEndSession: false | |
}); | |
this.emit(':responseReady'); | |
} else { | |
console.log("in completed"); | |
console.log("returning: "+ JSON.stringify(this.event.request.intent)); | |
// Dialog is now complete and all required slots should be filled, | |
// so call your normal intent handler. | |
return this.event.request.intent; | |
} | |
} | |
function randomPhrase(array) { | |
// the argument is an array [] of words or phrases | |
var i = 0; | |
i = Math.floor(Math.random() * array.length); | |
return(array[i]); | |
} | |
function isSlotValid(request, slotName){ | |
var slot = request.intent.slots[slotName]; | |
//console.log("request = "+JSON.stringify(request)); //uncomment if you want to see the request | |
var slotValue; | |
//if we have a slot, get the text and store it into speechOutput | |
if (slot && slot.value) { | |
//we have a value in the slot | |
slotValue = slot.value.toLowerCase(); | |
return slotValue; | |
} else { | |
//we didn't get a value in the slot. | |
return false; | |
} | |
} | |
//These functions are here to allow dialog directives to work with SDK versions prior to 1.0.9 | |
//will be removed once Lambda templates are updated with the latest SDK | |
function createSpeechObject(optionsParam) { | |
if (optionsParam && optionsParam.type === 'SSML') { | |
return { | |
type: optionsParam.type, | |
ssml: optionsParam['speech'] | |
}; | |
} else { | |
return { | |
type: optionsParam.type || 'PlainText', | |
text: optionsParam['speech'] || optionsParam | |
}; | |
} | |
} | |
function buildSpeechletResponse(options) { | |
var alexaResponse = { | |
shouldEndSession: options.shouldEndSession | |
}; | |
if (options.output) { | |
alexaResponse.outputSpeech = createSpeechObject(options.output); | |
} | |
if (options.reprompt) { | |
alexaResponse.reprompt = { | |
outputSpeech: createSpeechObject(options.reprompt) | |
}; | |
} | |
if (options.directives) { | |
alexaResponse.directives = options.directives; | |
} | |
if (options.cardTitle && options.cardContent) { | |
alexaResponse.card = { | |
type: 'Simple', | |
title: options.cardTitle, | |
content: options.cardContent | |
}; | |
if(options.cardImage && (options.cardImage.smallImageUrl || options.cardImage.largeImageUrl)) { | |
alexaResponse.card.type = 'Standard'; | |
alexaResponse.card['image'] = {}; | |
delete alexaResponse.card.content; | |
alexaResponse.card.text = options.cardContent; | |
if(options.cardImage.smallImageUrl) { | |
alexaResponse.card.image['smallImageUrl'] = options.cardImage.smallImageUrl; | |
} | |
if(options.cardImage.largeImageUrl) { | |
alexaResponse.card.image['largeImageUrl'] = options.cardImage.largeImageUrl; | |
} | |
} | |
} else if (options.cardType === 'LinkAccount') { | |
alexaResponse.card = { | |
type: 'LinkAccount' | |
}; | |
} else if (options.cardType === 'AskForPermissionsConsent') { | |
alexaResponse.card = { | |
type: 'AskForPermissionsConsent', | |
permissions: options.permissions | |
}; | |
} | |
var returnResult = { | |
version: '1.0', | |
response: alexaResponse | |
}; | |
if (options.sessionAttributes) { | |
returnResult.sessionAttributes = options.sessionAttributes; | |
} | |
return returnResult; | |
} | |
function getDialogDirectives(dialogType, updatedIntent, slotName) { | |
let directive = { | |
type: dialogType | |
}; | |
if (dialogType === 'Dialog.ElicitSlot') { | |
directive.slotToElicit = slotName; | |
} else if (dialogType === 'Dialog.ConfirmSlot') { | |
directive.slotToConfirm = slotName; | |
} | |
if (updatedIntent) { | |
directive.updatedIntent = updatedIntent; | |
} | |
return [directive]; | |
} | |
/* | |
{ | |
"intents": [ | |
{ | |
"name": "AMAZON.CancelIntent", | |
"samples": [] | |
}, | |
{ | |
"name": "AMAZON.HelpIntent", | |
"samples": [] | |
}, | |
{ | |
"name": "AMAZON.StopIntent", | |
"samples": [] | |
}, | |
{ | |
"name": "AnswerIntent", | |
"samples": [ | |
"{number}", | |
"i think the answer is {number}", | |
"the answer is {number}", | |
"is it {number}", | |
"my answer is {number}", | |
"i guess {number}", | |
"i guess the answer is {number}", | |
"maybe {number}", | |
"my response is {number}" | |
], | |
"slots": [ | |
{ | |
"name": "number", | |
"type": "AMAZON.NUMBER", | |
"samples": [] | |
} | |
] | |
}, | |
{ | |
"name": "PracticeTimestables", | |
"samples": [ | |
"I want to practice my {number} times tables", | |
"practice the {number} times tables", | |
"practice multiplications with {number}", | |
"switch to {number} times table", | |
"now let us practice with {number}" | |
], | |
"slots": [ | |
{ | |
"name": "number", | |
"type": "AMAZON.NUMBER", | |
"samples": [] | |
} | |
] | |
} | |
] | |
} | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment