Hardware components | ||||||
| × | 1 | ||||
Software apps and online services | ||||||
| ||||||
|
I created this project because I have always been fascinated by mars, and wanted to share some knowledge.
About the skillThis is a simple skill that when asked it gives a random interesting fact about mars. This skill is published so you can find it on the Alexa app to use on your echo. You can find it here.
After creating an Amazon developer account and an Amazon web serves account I started with the help of the Amazon Skill Kit, and the getting started guide. From here I used some of the code provided to make my Mars skill. To find my facts I looked through my old school projects that i have as well as a bit of research to make a short list of interesting facts that have to do with Mars.
From here I created a lambda function through amazon web serves. Full instructions on uploading a lambda function are found here. Once I finished this I went to the Amazon developer page and filled in all of the required information then I submitted it for review. The first skill you make might not be approved on the first try but they send a vary helpful email to you showing what you need to fix to get the certification. Once you get certified then your skill gets added to the store and then anyone can download it and use it on there Amazon Echo
/**
Copyright 2014-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with the License. A copy of the License is located at
http://aws.amazon.com/apache2.0/
or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
*/
/**
* This simple sample has no external dependencies or session management, and shows the most basic
* example of how to create a Lambda function for handling Alexa Skill requests.
*
* Examples:
* One-shot model:
* User: "Alexa, ask Space Geek for a space fact"
* Alexa: "Here's your space fact: ..."
*/
/**
* App ID for the skill
*/
var APP_ID = "amzn1.echo-sdk-ams.app.9aa6e4df-f709-422c-b6bb-fa24b462f0c4"; //OPTIONAL: replace with "amzn1.echo-sdk-ams.app.[your-unique-value-here]";
/**
* Array containing space facts.
*/
var FACTS = [
"Mars is the fourth planet from the Sun.",
"Mars is named after the Roman god of war.",
"Mars has two moons, Phobos and Deimos.",
"On Mars, the Sun appears about half the size as it does on Earth.",
"on Mars there are 687 days in a year.",
"A day on mars is called a sol.",
"Mars has the tallest mountain in the solar system.",
"Mars's gravity is 37% of the Earth’s.",
"At one time Mars had water on it surface.",
"there have been 40 missions to Mars but only 18 have been successful.",
"the mars rover Opportunity has travled over 26 miles on the surface.",
"the ice caps on mars are made of frozen CO2.",
"Mars orbets 143,000,000 miles form the sun.",
];
/**
* The AlexaSkill prototype and helper functions
*/
var AlexaSkill = require('./AlexaSkill');
/**
* SpaceGeek 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 Fact = function () {
AlexaSkill.call(this, APP_ID);
};
// Extend AlexaSkill
Fact.prototype = Object.create(AlexaSkill.prototype);
Fact.prototype.constructor = Fact;
Fact.prototype.eventHandlers.onSessionStarted = function (sessionStartedRequest, session) {
//console.log("onSessionStarted requestId: " + sessionStartedRequest.requestId + ", sessionId: " + session.sessionId);
// any initialization logic goes here
};
Fact.prototype.eventHandlers.onLaunch = function (launchRequest, session, response) {
//console.log("onLaunch requestId: " + launchRequest.requestId + ", sessionId: " + session.sessionId);
handleNewFactRequest(response);
};
/**
* Overridden to show that a subclass can override this function to teardown session state.
*/
Fact.prototype.eventHandlers.onSessionEnded = function (sessionEndedRequest, session) {
//console.log("onSessionEnded requestId: " + sessionEndedRequest.requestId + ", sessionId: " + session.sessionId);
// any cleanup logic goes here
};
Fact.prototype.intentHandlers = {
"GetNewFactIntent": function (intent, session, response) {
handleNewFactRequest(response);
},
"AMAZON.HelpIntent": function (intent, session, response) {
response.ask("You can say tell me a Mars fact, or, you can say exit... What can I help you with?", "What can I help you with?");
},
"AMAZON.StopIntent": function (intent, session, response) {
var speechOutput = "Goodbye";
response.tell(speechOutput);
},
"AMAZON.CancelIntent": function (intent, session, response) {
var speechOutput = "Goodbye";
response.tell(speechOutput);
}
};
/**
* Gets a random new fact from the list and returns to the user.
*/
function handleNewFactRequest(response) {
// Get a random space fact from the space facts list
var factIndex = Math.floor(Math.random() * FACTS.length);
var randomFact = FACTS[factIndex];
// Create speech output
var speechOutput = "Here's your fact: " + randomFact;
var cardTitle = "Your Fact";
response.tellWithCard(speechOutput, cardTitle, speechOutput);
}
// Create the handler that responds to the Alexa Request.
exports.handler = function (event, context) {
// Create an instance of the SpaceGeek skill.
var fact = new Fact();
fact.execute(event, context);
};
/**
Copyright 2014-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with the License. A copy of the License is located at
http://aws.amazon.com/apache2.0/
or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
*/
'use strict';
function AlexaSkill(appId) {
this._appId = appId;
}
AlexaSkill.speechOutputType = {
PLAIN_TEXT: 'PlainText',
SSML: 'SSML'
}
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 invokes 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;
};
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
}
}
}
Response.prototype = (function () {
var buildSpeechletResponse = function (options) {
var alexaResponse = {
outputSpeech: createSpeechObject(options.output),
shouldEndSession: options.shouldEndSession
};
if (options.reprompt) {
alexaResponse.reprompt = {
outputSpeech: createSpeechObject(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;
Comments