/**
*
* Examples:
* One-shot model
* User: Alexa, get today horoscope for Leo.
* Alexa: You will attempt to reschedule your daily routine to be able to make the most of your day. While it is easy to make plans, implementing
* them and sticking to them depends on your own discipline and determination. You will become more aware about health issues and pay closer
* attention to your diet. You will spend an enjoyable time with your family, says Ganesha.
*
* Dialog model:
* User: Alexa, ask Good Luck Guru.
* Alexa: Welcome to the Good Luck Guru. What is your horoscope?
* User: Leo
* Alexa: You will attempt to reschedule your daily routine to be able to make the most of your day. While it is easy to make plans, implementing
* them and sticking to them depends on your own discipline and determination. You will become more aware about health issues and pay closer
* attention to your diet. You will spend an enjoyable time with your family, says Ganesha.
*
*/
'use strict';
/**
* App ID for the skill
*/
var APP_ID = "your_app_id";
/**
* The key to find the current index from the session attributes
*/
var KEY_CURRENT_INDEX = "current";
var HOROSCOPES = [
"aries",
"taurus",
"geminiemini",
"cancer",
"leo",
"virgo",
"libra",
"scorpio",
"sagittarius",
"capricorn",
"aquarius",
"pisces"
];
var http = require("http");
var optionsGet = {
host : 'horoscope-api.herokuapp.com',
port : 80,
path : '',
method : 'GET'
};
/**
* The AlexaSkill prototype and helper functions
*/
var AlexaSkill = require('./AlexaSkill');
/**
* GoodLuckGuru is a child of AlexaSkill.
* To read more about inheritance in JavaScript, see the link below.
*
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript#Inheritance
*/
var GoodLuckGuru = function () {
AlexaSkill.call(this, APP_ID);
};
// Extend AlexaSkill
GoodLuckGuru.prototype = Object.create(AlexaSkill.prototype);
GoodLuckGuru.prototype.constructor = GoodLuckGuru;
GoodLuckGuru.prototype.eventHandlers.onSessionStarted = function (sessionStartedRequest, session) {
console.log("GoodLuckGuru onSessionStarted requestId: " + sessionStartedRequest.requestId
+ ", sessionId: " + session.sessionId);
// any session init logic would go here
};
GoodLuckGuru.prototype.eventHandlers.onLaunch = function (launchRequest, session, response) {
console.log("GoodLuckGuru onLaunch requestId: " + launchRequest.requestId + ", sessionId: " + session.sessionId);
getWelcomeResponse(response);
};
GoodLuckGuru.prototype.eventHandlers.onSessionEnded = function (sessionEndedRequest, session) {
console.log("GoodLuckGuru onSessionEnded requestId: " + sessionEndedRequest.requestId
+ ", sessionId: " + session.sessionId);
// any session cleanup logic would go here
};
GoodLuckGuru.prototype.intentHandlers = {
"DailyHoroscope": function (intent, session, response) {
getHoroscope(intent, session, response);
},
"AMAZON.HelpIntent": function (intent, session, response) {
helpTheUser(intent, session, response);
},
"AMAZON.StopIntent": function (intent, session, response) {
var speechOutput = "Goodbye";
response.tell(speechOutput);
},
"AMAZON.CancelIntent": function (intent, session, response) {
var speechOutput = "Goodbye";
response.tell(speechOutput);
}
};
/**
* Returns the welcome response for when a user invokes this skill.
*/
function getWelcomeResponse(response) {
// If we wanted to initialize the session to have some attributes we could add those here.
var speechText = "Welcome to the Good Luck Guru. What is your horoscope?";
var repromptText = "<speak>Please choose a horoscope by saying, " +
"leo <break time=\"0.2s\" /> " +
"libra <break time=\"0.2s\" /> " +
"scorpio <break time=\"0.2s\" /> " +
"pisces</speak>";
var speechOutput = {
speech: speechText,
type: AlexaSkill.speechOutputType.PLAIN_TEXT
};
var repromptOutput = {
speech: repromptText,
type: AlexaSkill.speechOutputType.SSML
};
response.ask(speechOutput, repromptOutput);
}
function getHoroscope(intent, session, response) {
var speechText = "",
repromptText = "",
speechOutput,
repromptOutput;
var horoscopeSlot = intent.slots.Horoscope;
if (isHoroscope(horoscopeSlot)) {
// Remove the periods to fix things like d. v. d.s to dvds
var horoscope = horoscopeSlot.value.replace(/\.\s*/g, '');
optionsGet.path = "/horoscope/today/" + horoscope;
// do the GET request
var reqGet = http.request(optionsGet, function(res) {
console.log("statusCode: ", res.statusCode);
// uncomment it for header details
// console.log("headers: ", res.headers);
res.on('data', function(d) {
console.info('GET result:\n');
process.stdout.write(d);
console.info('\n\nCall completed');
var obj = JSON.parse(d);
speechText = obj.horoscope;
repromptText = "<speak>" + obj.horoscope + "</speak>";
speechOutput = {
speech: speechText,
type: AlexaSkill.speechOutputType.PLAIN_TEXT
};
repromptOutput = {
speech: repromptText,
type: AlexaSkill.speechOutputType.SSML
};
response.ask(speechOutput, repromptOutput);
});
});
reqGet.end();
reqGet.on('error', function(e) {
console.error(e);
speechText = "speech text err";
repromptText = "reprompt text err";
speechOutput = {
speech: speechText,
type: AlexaSkill.speechOutputType.PLAIN_TEXT
};
repromptOutput = {
speech: repromptText,
type: AlexaSkill.speechOutputType.SSML
};
response.ask(speechOutput, repromptOutput);
});
} else {
// The horoscope didn't match one of our predefined horoscopes. Reprompt the user.
speechText = "I'm not sure what the horoscope is, please try again";
repromptText = "<speak>I'm not sure what the horoscope is, you can say, " +
"leo <break time=\"0.2s\" /> " +
"libra <break time=\"0.2s\" /> " +
"scorpio <break time=\"0.2s\" /> " +
"pisces.</speak>";
speechOutput = {
speech: speechText,
type: AlexaSkill.speechOutputType.PLAIN_TEXT
};
repromptOutput = {
speech: repromptText,
type: AlexaSkill.speechOutputType.SSML
};
response.ask(speechOutput, repromptOutput);
}
}
/**
* Check if horoscopeSlot has a valid input value.
*/
function isHoroscope(horoscopeSlot) {
var isHoroscope = false;
if (horoscopeSlot && horoscopeSlot.value) {
// lower case and remove spaces
var horoscope = horoscopeSlot.value.toLowerCase().replace(/ /g, '').replace(/\./g, '');
HOROSCOPES.forEach( function(item) {
if (item === horoscope) {
isHoroscope = true;
return;
}
});
}
return isHoroscope;
}
/**
* Instructs the user on how to interact with this skill.
*/
function helpTheUser(intent, session, response) {
var speechText = "You can ask for the daily horoscope. " +
"For example, get daily horoscope for leo, or you can say exit. " +
"Now, what can I help you with?";
var repromptText = "<speak> I'm sorry I didn't understand that. You can say things like, " +
"leo <break time=\"0.2s\" /> " +
"libra <break time=\"0.2s\" /> " +
"scorpio. Or you can say exit. " +
"Now, what can I help you with? </speak>";
var speechOutput = {
speech: speechText,
type: AlexaSkill.speechOutputType.PLAIN_TEXT
};
var repromptOutput = {
speech: repromptText,
type: AlexaSkill.speechOutputType.SSML
};
response.ask(speechOutput, repromptOutput);
}
// Create the handler that responds to the Alexa Request.
exports.handler = function (event, context) {
var goodLuckGuru = new GoodLuckGuru();
goodLuckGuru.execute(event, context);
};
Comments