Skip to content

Instantly share code, notes, and snippets.

@willblaschko
Created March 3, 2019 12:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save willblaschko/cc4f0019da90e8c0b388bf1ae42bca20 to your computer and use it in GitHub Desktop.
Save willblaschko/cc4f0019da90e8c0b388bf1ae42bca20 to your computer and use it in GitHub Desktop.
Inside the RequestHandler, override the ResponseBuilder to be able to send multiple "speak" requests to concat. This makes it easier to pass between different handlers/functions, each can add a preamble if required (e.g. "Game over..." + "Starting a new game").
const RequestHandler = {
process(handlerInput) {
//log our request
console.log("REQUEST ENVELOPE = " + JSON.stringify(handlerInput.requestEnvelope));
//required function taken from Alexa SDK
function trimOutputSpeech(speechOutput) {
if (!speechOutput) {
return '';
}
var speech = speechOutput.trim();
var length = speech.length;
if (speech.startsWith('<speak>') && speech.endsWith('</speak>')) {
return speech.substring(7, length - 8).trim();
}
return speech;
}
//required function taken from Alexa SDK
function isVideoAppLaunchDirectivePresent() {
let responseBuilder = handlerInput.responseBuilder;
let response = responseBuilder.getResponse();
if (!response.directives) {
return false;
}
for (var _i = 0, _a = response.directives; _i < _a.length; _i++) {
var directive = _a[_i];
if (directive.type === 'VideoApp.Launch') {
return true;
}
}
return false;
}
//add support for multiple "speak" commands to make it easier to pass requests between handlers.
handlerInput.responseBuilder.speak = function(speechOutput, playBehavior){
let responseBuilder = handlerInput.responseBuilder;
let response = responseBuilder.getResponse();
responseBuilder.outputSpeakArray = responseBuilder.outputSpeakArray || [];
responseBuilder.outputSpeakArray.push(trimOutputSpeech(speechOutput+""));
response.outputSpeech = {
type: 'SSML',
ssml: '<speak>'
+ responseBuilder.outputSpeakArray.join(" ")
+ '</speak>',
playBehavior: playBehavior,
};
if (!playBehavior) {
delete response.outputSpeech.playBehavior;
}
return this;
};
//add support for multiple "reprompt" commands to make it easier to pass requests between handlers.
handlerInput.responseBuilder.reprompt = function(repromptSpeechOutput, playBehavior){
let responseBuilder = handlerInput.responseBuilder;
let response = responseBuilder.getResponse();
responseBuilder.outputRepromptArray = responseBuilder.outputRepromptArray || [];
responseBuilder.outputRepromptArray.push(trimOutputSpeech(repromptSpeechOutput+""));
response.reprompt = {
outputSpeech: {
type: 'SSML',
ssml: '<speak>'
+ responseBuilder.outputRepromptArray.join(" ")
+ '</speak>',
playBehavior: playBehavior,
},
};
if (!playBehavior) {
delete response.reprompt.outputSpeech.playBehavior;
}
if (!isVideoAppLaunchDirectivePresent()) {
response.shouldEndSession = false;
}
return this;
};
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment