Skip to content

Instantly share code, notes, and snippets.

@softwarechido
Last active April 24, 2020 17:13
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 softwarechido/7b35c8ea12379f4c43701be3f9c8b4b4 to your computer and use it in GitHub Desktop.
Save softwarechido/7b35c8ea12379f4c43701be3f9c8b4b4 to your computer and use it in GitHub Desktop.
Curiosidades Espaciales V3
/* eslint-disable func-names */
/* eslint-disable no-console */
const Alexa = require('ask-sdk-core');
var persistenceAdapter = getPersistenceAdapter("CuriosidadesEspaciales");
function getPersistenceAdapter(tableName) {
const {DynamoDbPersistenceAdapter} = require('ask-sdk-dynamodb-persistence-adapter');
return new DynamoDbPersistenceAdapter({
tableName: tableName,
createTable: true
});
}
const GetNewFactHandler = {
canHandle(handlerInput) {
const request = handlerInput.requestEnvelope.request;
return request.type === 'LaunchRequest'
|| (request.type === 'IntentRequest'
&& request.intent.name === 'GetNewFactIntent');
},
handle(handlerInput) {
const randomFact = getRandomFact();
const prompt = ' Si quieres otro dato, di el nombre de un planeta o di dame un dato para escuchar otro aleatorio. ';
const speechOutput = GET_FACT_MESSAGE + randomFact + prompt;
const repromptOutput = ' Di el nombre de un planeta para escuchar un dato o di salir para terminar. ';
storePastFactInDB(handlerInput, randomFact);
return handlerInput.responseBuilder
.speak(speechOutput)
.withSimpleCard(SKILL_NAME, randomFact)
.reprompt(repromptOutput)
.getResponse();
},
};
const GetFactByPlanetHandler = {
canHandle(handlerInput) {
console.log("in get fact by planeta");
const request = handlerInput.requestEnvelope.request;
return (request.type === 'IntentRequest'
&& request.intent.name === 'GetFactByPlanetIntent');
},
async handle(handlerInput) {
console.log("in get fact by planeta");
const planet = getSlotValue(handlerInput);
console.log("out of slot value");
let speechOutput;
let planetFact;
const prompt = ' Si quieres otro dato, di el nombre de un planeta o di dame un dato para escuchar otro aleatorio. ';
const repromptOutput = ' Di el nombre de un planeta para escuchar un dato o di salir para terminar. ';
if(planet&&(planet!==undefined)){
planetFact = getFactByPlanet(planet);
speechOutput = GET_FACT_MESSAGE + planetFact + prompt;
await storePastFactInDB(handlerInput, planetFact);
} else{
planetFact = '';
speechOutput = 'Por favor di el nombre del algun cuerpo celeste. O quiero un dato para escuchar uno aleatorio. ';
}
return handlerInput.responseBuilder
.speak(speechOutput)
.withSimpleCard(SKILL_NAME, planetFact)
.reprompt(repromptOutput)
.getResponse();
},
};
const RepeatIntentHandler = {
canHandle(handlerInput) {
const request = handlerInput.requestEnvelope.request;
return (request.type === 'IntentRequest'
&& request.intent.name === 'AMAZON.RepeatIntent');
},
handle(handlerInput){
let lastFact;
const prompt = ' Si quieres otro dato, di el nombre de un planeta o di dame un dato para escuchar otro aleatorio. ';
const repromptOutput = ' Di el nombre de un planeta para escuchar un dato o di salir para terminar. ';
let {pastFact} = handlerInput.attributesManager.getSessionAttributes();
if(pastFact){
lastFact = pastFact;
}else{
lastFact = 'Lo siento, no lo recuerdo. ';
}
const speechOutput = lastFact + prompt;
return handlerInput.responseBuilder
.speak(speechOutput)
.withSimpleCard(SKILL_NAME, speechOutput)
.reprompt(repromptOutput)
.getResponse();
}
};
const LaunchRequestHandler ={
canHandle(handlerInput){
const request = handlerInput.requestEnvelope.request;
return request.type === 'LaunchRequest';
},
handle(handlerInput){
const speechOutput = ' Bienvenido a curiosidades espaciales, la skill con datos del espacio. Puedes decir el nombre de un planeta o dame un dato para escuchar uno aleatorio. ¿Cómo te puedo ayudar?';
const repromptOutput = ' Dime que cuerpo celeste te interesa. ';
return handlerInput.responseBuilder
.speak(speechOutput)
.reprompt(repromptOutput)
.getResponse();
}
};
const HelpHandler = {
canHandle(handlerInput) {
const request = handlerInput.requestEnvelope.request;
return request.type === 'IntentRequest'
&& request.intent.name === 'AMAZON.HelpIntent';
},
handle(handlerInput) {
return handlerInput.responseBuilder
.speak(HELP_MESSAGE)
.reprompt(HELP_REPROMPT)
.getResponse();
},
};
const ExitHandler = {
canHandle(handlerInput) {
const request = handlerInput.requestEnvelope.request;
return request.type === 'IntentRequest'
&& (request.intent.name === 'AMAZON.CancelIntent'
|| request.intent.name === 'AMAZON.StopIntent');
},
handle(handlerInput) {
return handlerInput.responseBuilder
.speak(STOP_MESSAGE)
.getResponse();
},
};
const SessionEndedRequestHandler = {
canHandle(handlerInput) {
const request = handlerInput.requestEnvelope.request;
return request.type === 'SessionEndedRequest';
},
handle(handlerInput) {
console.log(`Session ended with reason: ${handlerInput.requestEnvelope.request.reason}`);
return handlerInput.responseBuilder.getResponse();
},
};
const ErrorHandler = {
canHandle() {
return true;
},
handle(handlerInput, error) {
console.log(`Error: ${error.message}`);
return handlerInput.responseBuilder
.speak('Una disculpa, hubo un error.')
.reprompt('Ocurrió un error.')
.getResponse();
},
};
const LoadSessionFromDBRequestInterceptor ={
async process(handlerInput){
if(!handlerInput.attributesManager.getSessionAttributes().lastFact){
await loadSessionFromDB(handlerInput);
}
}
};
const SKILL_NAME = ' Curiosidades Espaciales ';
const GET_FACT_MESSAGE = ' Aqui esta tu dato: ';
const HELP_MESSAGE = ' Puedes pedir un dato, o decir cerrar... ¿Como te puedo ayudar? ';
const HELP_REPROMPT = ' Creo que pediste ayuda. Si quieres un dato, pidemelo o di salir para cerrar la skill. ';
const STOP_MESSAGE = ' ¡Adios! ';
const data = [
'Un año en Mercurio solo dura 88 dias.',
'A pesar de estar mas lejos del Sol, la temperatura en Venus es más alta que en Mercurio. ',
'El sentido de la rotacion de Venus es contra-reloj, possiblemente a causa de una colisión de un asteroide. ',
'Desde Marte la apariencia del Sol es aproximadamente la mitad del tamaño que desde la Tierra.',
'La Tierra es el unico planeta que no fue nombrado como un Dios.',
'Jupiter tiene el dia mas corto de todos los planetas.',
'La Via Lactea hara colisión con la galaxia Andromeda en alrededor de 5 billones de años.',
'El 99.86% de la masa del sistema solar esta contenida en el Sol.',
'El Sol es una esfera casi perfecta.',
'Los eclipses solares totales pueden suceder una vez cada 1 o 2 años. Esto los hace eventos poco comunes.',
'Saturno irradia al espacio 2.5 veces más energia de la que recibe del sol.',
'La temperatura en el interior del Sol puede alcanzar 15 millones de grados Centigrados.',
'La Luna se esta alejando de la Tierra 3.8 cm al año.',
];
const sol_data = [,
'Desde Marte la apariencia del Sol es aproximadamente la mitad del tamaño que desde la Tierra.',
'La Via Lactea hara colisión con la galaxia Andromeda en alrededor de 5 billones de años.',
'El 99.86% de la masa del sistema solar esta contenida en el Sol.',
'El Sol es una esfera casi perfecta.',
'Los eclipses solares totales pueden suceder una vez cada 1 o 2 años. Esto los hace eventos poco comunes.',
'La temperatura en el interior del Sol puede alcanzar 15 millones de grados Centigrados.',
];
const mercurio_data = [
'Un año en Mercurio solo dura 88 dias.',
'A pesar de estar mas lejos del Sol, la temperatura en Venus es más alta que en Mercurio. ',
'La Via Lactea hara colisión con la galaxia Andromeda en alrededor de 5 billones de años.',
];
const venus_data = [
'A pesar de estar mas lejos del Sol, la temperatura en Venus es más alta que en Mercurio. ',
'El sentido de la rotacion de Venus es contra-reloj, possiblemente a causa de una colisión de un asteroide. ',
'La Via Lactea hara colisión con la galaxia Andromeda en alrededor de 5 billones de años.',
];
const tierra_data = [
'Desde Marte la apariencia del Sol es aproximadamente la mitad del tamaño que desde la Tierra.',
'La Tierra es el unico planeta que no fue nombrado como un Dios.',
'La Via Lactea hara colisión con la galaxia Andromeda en alrededor de 5 billones de años.',
'Los eclipses solares totales pueden suceder una vez cada 1 o 2 años. Esto los hace eventos poco comunes.',
'La Luna se esta alejando de la Tierra 3.8 cm al año.',
];
const luna_data = [
'La Via Lactea hara colisión con la galaxia Andromeda en alrededor de 5 billones de años.',
'Los eclipses solares totales pueden suceder una vez cada 1 o 2 años. Esto los hace eventos poco comunes.',
'La Luna se esta alejando de la Tierra 3.8 cm al año.',
];
const marte_data = [
'Desde Marte la apariencia del Sol es aproximadamente la mitad del tamaño que desde la Tierra.',
'La Via Lactea hara colisión con la galaxia Andromeda en alrededor de 5 billones de años.',
];
const jupiter_data = [
'Jupiter tiene el dia mas corto de todos los planetas.',
'La Via Lactea hara colisión con la galaxia Andromeda en alrededor de 5 billones de años.',
];
const saturno_data = [
'La Via Lactea hara colisión con la galaxia Andromeda en alrededor de 5 billones de años.',
'Saturno irradia al espacio 2.5 veces más energia de la que recibe del sol.',
];
const urano_data = [
'La Via Lactea hara colisión con la galaxia Andromeda en alrededor de 5 billones de años.',
];
const neptuno_data = [
'La Via Lactea hara colisión con la galaxia Andromeda en alrededor de 5 billones de años.',
];
//===== Helper Functions
function getRandomFact(){
const factArr = data;
const factIndex = Math.floor(Math.random() * factArr.length);
const randomFact = factArr[factIndex];
return randomFact;
}
function getFactByPlanet(planet){
let factArr;
switch (planet) {
case 'sol':
factArr = sol_data;
break;
case 'mercurio':
factArr = mercurio_data;
break;
case 'venus':
factArr = venus_data;
break;
case 'tierra':
factArr = tierra_data;
break;
case 'luna':
factArr = luna_data;
break;
case 'marte':
factArr = marte_data;
break;
case 'jupiter':
factArr = jupiter_data;
break;
case 'saturno':
factArr = saturno_data;
break;
case 'urano':
factArr = urano_data;
break;
case 'neptuno':
factArr = neptuno_data;
break;
default:
factArr = data;
break;
}
const factIndex = Math.floor(Math.random() * factArr.length);
const randomFact = factArr[factIndex];
return randomFact;
}
function getSlotValue(handlerInput) {
let slotValue;
try {
let entityResolutionCode = handlerInput.requestEnvelope.request.intent.slots.planeta.resolutions.resolutionsPerAuthority[0].status.code;
if(entityResolutionCode === 'ER_SUCCESS_MATCH'){
slotValue = handlerInput.requestEnvelope.request.intent.slots.planeta.resolutions.resolutionsPerAuthority[0].values[0].value.name.toLowerCase();
}else{
slotValue = null;
}
} catch (error) {
slotValue = null;
}
return slotValue;
}
async function loadSessionFromDB(handlerInput){
let persistentAttributes = await handlerInput.attributesManager.getPersistentAttributes();
handlerInput.attributesManager.setSessionAttributes(persistentAttributes);
}
async function storePastFactInDB(handlerInput, pastFact){
await loadSessionFromDB(handlerInput);
let persistentAttributes = handlerInput.attributesManager.getSessionAttributes();
persistentAttributes.pastFact = pastFact;
handlerInput.attributesManager.setPersistentAttributes(persistentAttributes);
handlerInput.attributesManager.savePersistentAttributes();
}
const skillBuilder = Alexa.SkillBuilders.custom();
exports.handler = skillBuilder
.addRequestHandlers(
LaunchRequestHandler,
GetNewFactHandler,
GetFactByPlanetHandler,
RepeatIntentHandler,
HelpHandler,
ExitHandler,
SessionEndedRequestHandler
)
.addErrorHandlers(ErrorHandler)
.withPersistenceAdapter(persistenceAdapter)
.addRequestInterceptors(LoadSessionFromDBRequestInterceptor)
.lambda();
{
"interactionModel": {
"languageModel": {
"invocationName": "curiosidades espaciales",
"intents": [
{
"name": "AMAZON.CancelIntent",
"samples": []
},
{
"name": "AMAZON.HelpIntent",
"samples": []
},
{
"name": "AMAZON.StopIntent",
"samples": []
},
{
"name": "AMAZON.NavigateHomeIntent",
"samples": []
},
{
"name": "GetNewFactIntent",
"slots": [],
"samples": [
"necesito otro dato",
"quiero escuchar algo",
"dime algo ",
"nos das un dato por favor",
"me gustaria un dato",
"dinos algo nuevo",
"cuentame algo",
"queremos saber mas",
"pidele un dato",
"dame un dato"
]
},
{
"name": "GetFactByPlanetIntent",
"slots": [
{
"name": "planeta",
"type": "ListaDeCuerposCelestes"
}
],
"samples": [
"{planeta} me interesa",
"{planeta} es el que me interesa",
"Deseo aprender más de {planeta}",
"Me interesa {planeta}",
"Nos datos un dato de {planeta}",
"Quiero saber más sobre {planeta}",
"{planeta} por favor",
"{planeta}",
"Dime sobre {planeta}"
]
},
{
"name": "AMAZON.RepeatIntent",
"samples": [
"repite el dato",
"dame el dato anterior",
"dame el dato anterior de nuevo",
"repite el dato anterior",
"repite el Último dato"
]
}
],
"types": [
{
"name": "ListaDeCuerposCelestes",
"values": [
{
"name": {
"value": "Neptuno"
}
},
{
"name": {
"value": "Urano"
}
},
{
"name": {
"value": "Saturno"
}
},
{
"name": {
"value": "Jupiter"
}
},
{
"name": {
"value": "Marte"
}
},
{
"name": {
"value": "Tierra"
}
},
{
"name": {
"value": "Venus"
}
},
{
"name": {
"value": "Mercurio"
}
},
{
"name": {
"value": "Luna"
}
},
{
"name": {
"value": "Sol"
}
}
]
}
]
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment