Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const AWS = require('aws-sdk')
- var questions = [
- {
- "Reindeer have very thick coats, how many hairs per square inch do they have?": [
- "13,000",
- "1,200",
- "5,000",
- "700",
- "1,000",
- "120,000"
- ]
- },
- {
- "The 1964 classic Rudolph The Red Nosed Reindeer was filmed in:": [
- "Japan",
- "United States",
- "Finland",
- "Germany"
- ]
- },
- {
- "Santas reindeer are cared for by one of the Christmas elves, what is his name?": [
- "Wunorse Openslae",
- "Alabaster Snowball",
- "Bushy Evergreen",
- "Pepper Minstix"
- ]
- },
- {
- "If all of Santas reindeer had antlers while pulling his Christmas sleigh, they would all be:": [
- "Girls",
- "Boys",
- "Girls and boys",
- "No way to tell"
- ]
- },
- {
- "What do Reindeer eat?": [
- "Lichen",
- "Grasses",
- "Leaves",
- "Berries"
- ]
- },
- {
- "What of the following is not true?": [
- "Caribou live on all continents",
- "Both reindeer and Caribou are the same species",
- "Caribou are bigger than reindeer",
- "Reindeer live in Scandinavia and Russia"
- ]
- },
- {
- "In what year did Rudolph make his television debut?": [
- "1964",
- "1979",
- "2000",
- "1956"
- ]
- },
- {
- "Who was the voice of Rudolph in the 1964 classic?": [
- "Billie Mae Richards",
- "Burl Ives",
- "Paul Soles",
- "Lady Gaga"
- ]
- },
- {
- "In 1939 what retailer used the story of Rudolph the Red Nose Reindeer?": [
- "Montgomery Ward",
- "Sears",
- "Macys",
- "Kmart"
- ]
- },
- {
- "Santa's reindeer named Donner was originally named what?": [
- "Dunder",
- "Donny",
- "Dweedle",
- "Dreamy"
- ]
- },
- {
- "Who invented the story of Rudolph?": [
- "Robert May",
- "Johnny Marks",
- "Santa",
- "J.K. Rowling"
- ]
- },
- {
- "In what location will you not find reindeer?": [
- "North Pole",
- "Lapland",
- "Korvatunturi mountain",
- "Finland"
- ]
- },
- {
- "What Makes Santa's Reindeer Fly?": [
- "Magical Reindeer Dust",
- "Fusion",
- "Amanita muscaria",
- "Elves"
- ]
- },
- {
- "Including Rudolph, how many reindeer hooves are there?": [
- "36",
- "24",
- "16",
- "8"
- ]
- },
- {
- "Santa only has one female reindeer. Which one is it?": [
- "Vixen",
- "Clarice",
- "Cupid",
- "Cupid"
- ]
- },
- {
- "In the 1964 classic Rudolph The Red Nosed Reindeer, what was the snowman narrators name?": [
- "Sam",
- "Frosty",
- "Burl",
- "Snowy"
- ]
- },
- {
- "What was Rudolph's father's name?": [
- "Donner",
- "Dasher",
- "Blixen",
- "Comet"
- ]
- },
- {
- "In the 1964 movie, What was the name of the coach of the Reindeer Games?": [
- "Comet",
- "Blixen",
- "Donner",
- "Dasher"
- ]
- },
- {
- "In the 1964 movie, what is the name of the deer that Rudolph befriends at the reindeer games?": [
- "Fireball",
- "Clarice",
- "Jumper",
- "Vixen"
- ]
- },
- {
- "In the 1964 movie, How did Donner, Rudolph's father, try to hide Rudolph's nose?": [
- "Black mud",
- "Bag",
- "Pillow case",
- "Sock"
- ]
- },
- {
- "In the 1964 movie, what does the Misfit Elf want to be instead of a Santa Elf?": [
- "Dentist",
- "Reindeer",
- "Toy maker",
- "Candlestick maker"
- ]
- },
- {
- "In the 1964 movie,what was the Bumble's one weakness?": [
- "Could not swim",
- "Always hungry",
- "Candy canes",
- "Cross eyed"
- ]
- },
- {
- "In the 1964 movie, what is Yukon Cornelius really in search of?": [
- "Peppermint",
- "Gold",
- "India",
- "Polar Bears"
- ]
- },
- {
- "In the 1964 movie, why is the train on the Island of Misfit Toys?": [
- "Square wheels",
- "No Engine",
- "Paint does not match",
- "It does not toot"
- ]
- },
- {
- "In the 1964 movie, what is the name of the Jack in the Box?": [
- "Charlie",
- "Sam",
- "Billy",
- "Jack"
- ]
- },
- {
- "In the 1964 movie, why did Santa Claus almost cancel Christmas?": [
- "Storm",
- "No snow",
- "No toys",
- "The Reindeer were sick"
- ]
- },
- {
- "In the 1964 movie, what animal noise did the elf make to distract the Bumble?": [
- "Oink",
- "Growl",
- "Bark",
- "Meow"
- ]
- },
- {
- "In the 1964 movie, what is the name of the prospector?": [
- "Yukon Cornelius",
- "Slider Sam",
- "Bumble",
- "Jack"
- ]
- },
- {
- "How far do reindeer travel when they migrate?": [
- "3000 miles",
- "700 miles",
- "500 miles",
- "0 miles"
- ]
- },
- {
- "How fast can a reindeer run?": [
- "48 miles per hour",
- "17 miles per hour",
- "19 miles per hour",
- "14 miles per hour"
- ]
- }
- ];
- // Route the incoming request based on type (LaunchRequest, IntentRequest,
- // etc.) The JSON body of the request is provided in the event parameter.
- exports.handler = function (event, context) {
- try {
- // console.log("event.session.application.applicationId=" + event.session.application.applicationId);
- /**
- *Uncomment this if statement and populate with your skill's application ID to
- *prevent someone else from configuring a skill that sends requests to this function.
- */
- // if (event.session.application.applicationId !== "amzn1.echo-sdk-ams.app.05aecccb3-1461-48fb-a008-822ddrt6b516") {
- // context.fail("Invalid Application ID");
- // }
- // if (event.session.new) {
- // onSessionStarted({ requestId: event.request.requestId }, event.session);
- // }
- console.log("event.request: " , event.request);
- if (event.request.type === "LaunchRequest") {
- onLaunch(event.request,
- event.session,
- function callback(sessionAttributes, speechletResponse) {
- context.succeed(buildResponse(sessionAttributes, speechletResponse));
- });
- } else if (event.request.type === "IntentRequest") {
- onIntent(event.request,
- event.session,
- function callback(sessionAttributes, speechletResponse) {
- context.succeed(buildResponse(sessionAttributes, speechletResponse));
- });
- } else if (event.request.type === "SessionEndedRequest") {
- onSessionEnded(event.request, event.session);
- context.succeed();
- } else if (event.request.type === "Messaging.MessageReceived") {
- console.log("event.request.message: " , event.request.message);
- handleAnnounceReuqest(function callback(sessionAttributes, speechletResponse) {
- context.succeed(buildResponse(sessionAttributes, speechletResponse));
- });
- }
- } catch (e) {
- context.fail("Exception: " + e);
- }
- };
- /**
- * Called when the session starts.
- */
- function onSessionStarted(sessionStartedRequest, session) {
- console.log("onSessionStarted requestId=" + sessionStartedRequest.requestId
- + ", sessionId=" + session.sessionId);
- // add any session init logic here
- }
- /**
- * Called when the user invokes the skill without specifying what they want.
- */
- function onLaunch(launchRequest, session, callback) {
- console.log("onLaunch requestId=" + launchRequest.requestId
- + ", sessionId=" + session.sessionId);
- getWelcomeResponse002(callback);
- }
- /**
- * Called when the user specifies an intent for this skill.
- */
- function onIntent(intentRequest, session, callback) {
- console.log("onIntent requestId=" + intentRequest.requestId
- + ", sessionId=" + session.sessionId);
- var intent = intentRequest.intent,
- intentName = intentRequest.intent.name;
- console.log("intentName: " + intentName);
- // handle yes/no intent after the user has been prompted
- if (session.attributes && session.attributes.userPromptedToContinue) {
- delete session.attributes.userPromptedToContinue;
- if ("AMAZON.NoIntent" === intentName) {
- handleFinishSessionRequest(intent, session, callback);
- } else if ("AMAZON.YesIntent" === intentName) {
- handleRepeatRequest(intent, session, callback);
- }
- }
- // dispatch custom intents to handlers here
- if ("AnswerIntent" === intentName) {
- handleAnswerRequest(intent, session, callback);
- } else if ("AnswerOnlyIntent" === intentName) {
- handleAnswerRequest(intent, session, callback);
- } else if ("DontKnowIntent" === intentName) {
- handleAnswerRequest(intent, session, callback);
- } else if ("AMAZON.YesIntent" === intentName) {
- handleAnswerRequest(intent, session, callback);
- } else if ("AMAZON.NoIntent" === intentName) {
- handleAnswerRequest(intent, session, callback);
- } else if ("AMAZON.StartOverIntent" === intentName) {
- getWelcomeResponse002(callback);
- } else if ("AMAZON.RepeatIntent" === intentName) {
- handleRepeatRequest(intent, session, callback);
- } else if ("AMAZON.HelpIntent" === intentName) {
- handleGetHelpRequest(intent, session, callback);
- } else if ("AMAZON.StopIntent" === intentName) {
- handleFinishSessionRequest(intent, session, callback);
- } else if ("AMAZON.CancelIntent" === intentName) {
- handleFinishSessionRequest(intent, session, callback);
- } else if ("AnswerNoMeaning" === intentName) {
- handleAnswerRequest(intent, session, callback);
- } else if ("AnnounceIntent" === intentName) {
- // getWelcomeResponse002(callback);
- handleAnnounceReuqest(callback);
- } else {
- throw "Invalid intent";
- }
- }
- /**
- * Called when the user ends the session.
- * Is not called when the skill returns shouldEndSession=true.
- */
- function onSessionEnded(sessionEndedRequest, session) {
- console.log("onSessionEnded requestId=" + sessionEndedRequest.requestId
- + ", sessionId=" + session.sessionId);
- // Add any cleanup logic here
- }
- // ------- Skill specific business logic -------
- var ANSWER_COUNT = 4;
- var GAME_LENGTH = 5;
- var CARD_TITLE = "Trivia"; // Be sure to change this for your skill.
- function getWelcomeResponse002(callback) {
- var sessionAttributes = {};
- var repromptText = "";
- var speechOutput = "what announcements do you want to make";
- var shouldEndSession = false;
- callback(sessionAttributes,
- buildSpeechletResponse(CARD_TITLE, speechOutput, repromptText, shouldEndSession));
- }
- function getWelcomeResponse(callback) {
- var sessionAttributes = {},
- speechOutput = "I will ask you " + GAME_LENGTH.toString()
- + " questions, try to get as many right as you can. Just say the number of the answer. Let's begin. ",
- shouldEndSession = false,
- gameQuestions = populateGameQuestions(),
- correctAnswerIndex = Math.floor(Math.random() * (ANSWER_COUNT)), // Generate a random index for the correct answer, from 0 to 3
- roundAnswers = populateRoundAnswers(gameQuestions, 0, correctAnswerIndex),
- currentQuestionIndex = 0,
- spokenQuestion = Object.keys(questions[gameQuestions[currentQuestionIndex]])[0],
- repromptText = "Question 1. " + spokenQuestion + " ",
- i, j;
- for (i = 0; i < ANSWER_COUNT; i++) {
- repromptText += (i + 1).toString() + ". " + roundAnswers[i] + ". "
- }
- speechOutput += repromptText;
- sessionAttributes = {
- "speechOutput": repromptText,
- "repromptText": repromptText,
- "currentQuestionIndex": currentQuestionIndex,
- "correctAnswerIndex": correctAnswerIndex + 1,
- "questions": gameQuestions,
- "score": 0,
- "correctAnswerText":
- questions[gameQuestions[currentQuestionIndex]][Object.keys(questions[gameQuestions[currentQuestionIndex]])[0]][0]
- };
- callback(sessionAttributes,
- buildSpeechletResponse(CARD_TITLE, speechOutput, repromptText, shouldEndSession));
- }
- function populateGameQuestions() {
- var gameQuestions = [];
- var indexList = [];
- var index = questions.length;
- if (GAME_LENGTH > index) {
- throw "Invalid Game Length.";
- }
- for (var i = 0; i < questions.length; i++) {
- indexList.push(i);
- }
- // Pick GAME_LENGTH random questions from the list to ask the user, make sure there are no repeats.
- for (var j = 0; j < GAME_LENGTH; j++) {
- var rand = Math.floor(Math.random() * index);
- index -= 1;
- var temp = indexList[index];
- indexList[index] = indexList[rand];
- indexList[rand] = temp;
- gameQuestions.push(indexList[index]);
- }
- return gameQuestions;
- }
- function populateRoundAnswers(gameQuestionIndexes, correctAnswerIndex, correctAnswerTargetLocation) {
- // Get the answers for a given question, and place the correct answer at the spot marked by the
- // correctAnswerTargetLocation variable. Note that you can have as many answers as you want but
- // only ANSWER_COUNT will be selected.
- var answers = [],
- answersCopy = questions[gameQuestionIndexes[correctAnswerIndex]][Object.keys(questions[gameQuestionIndexes[correctAnswerIndex]])[0]],
- temp, i;
- var index = answersCopy.length;
- if (index < ANSWER_COUNT) {
- throw "Not enough answers for question.";
- }
- // Shuffle the answers, excluding the first element.
- for (var j = 1; j < answersCopy.length; j++) {
- var rand = Math.floor(Math.random() * (index - 1)) + 1;
- index -= 1;
- var temp = answersCopy[index];
- answersCopy[index] = answersCopy[rand];
- answersCopy[rand] = temp;
- }
- // Swap the correct answer into the target location
- for (i = 0; i < ANSWER_COUNT; i++) {
- answers[i] = answersCopy[i];
- }
- temp = answers[0];
- answers[0] = answers[correctAnswerTargetLocation];
- answers[correctAnswerTargetLocation] = temp;
- return answers;
- }
- function handleAnswerRequest(intent, session, callback) {
- var speechOutput = "";
- var sessionAttributes = {};
- var gameInProgress = session.attributes && session.attributes.questions;
- var answerSlotValid = isAnswerSlotValid(intent);
- var userGaveUp = intent.name === "DontKnowIntent";
- if (!gameInProgress) {
- // If the user responded with an answer but there is no game in progress, ask the user
- // if they want to start a new game. Set a flag to track that we've prompted the user.
- sessionAttributes.userPromptedToContinue = true;
- speechOutput = "There is no game in progress. Do you want to start a new game? ";
- callback(sessionAttributes,
- buildSpeechletResponse(CARD_TITLE, speechOutput, speechOutput, false));
- } else if (intent.name === "AnswerNoMeaning") {
- // This is my try for this function
- var reprompt = session.attributes.speechOutput;
- var speechOutput = "Please give it a try";
- callback(session.attributes,
- buildSpeechletResponse(CARD_TITLE, speechOutput, reprompt, false));
- } else if (!answerSlotValid && !userGaveUp) {
- // If the user provided answer isn't a number > 0 and < ANSWER_COUNT,
- // return an error message to the user. Remember to guide the user into providing correct values.
- var reprompt = session.attributes.speechOutput;
- var speechOutput = "Your answer must be a number between 1 and " + ANSWER_COUNT + ". " + reprompt;
- callback(session.attributes,
- buildSpeechletResponse(CARD_TITLE, speechOutput, reprompt, false));
- } else {
- var gameQuestions = session.attributes.questions,
- correctAnswerIndex = parseInt(session.attributes.correctAnswerIndex),
- currentScore = parseInt(session.attributes.score),
- currentQuestionIndex = parseInt(session.attributes.currentQuestionIndex),
- correctAnswerText = session.attributes.correctAnswerText;
- var speechOutputAnalysis = "";
- if (answerSlotValid && parseInt(intent.slots.Answer.value) == correctAnswerIndex) {
- currentScore++;
- speechOutputAnalysis = "correct. ";
- } else {
- if (!userGaveUp) {
- speechOutputAnalysis = "wrong. "
- }
- speechOutputAnalysis += "The correct answer is " + correctAnswerIndex + ": " + correctAnswerText + ". ";
- }
- // if currentQuestionIndex is 4, we've reached 5 questions (zero-indexed) and can exit the game session
- if (currentQuestionIndex == GAME_LENGTH - 1) {
- speechOutput = userGaveUp ? "" : "That answer is ";
- speechOutput += speechOutputAnalysis + "You got " + currentScore.toString() + " out of "
- + GAME_LENGTH.toString() + " questions correct. Thank you for playing!";
- callback(session.attributes,
- buildSpeechletResponse(CARD_TITLE, speechOutput, "", true));
- } else {
- currentQuestionIndex += 1;
- var spokenQuestion = Object.keys(questions[gameQuestions[currentQuestionIndex]])[0];
- // Generate a random index for the correct answer, from 0 to 3
- correctAnswerIndex = Math.floor(Math.random() * (ANSWER_COUNT));
- var roundAnswers = populateRoundAnswers(gameQuestions, currentQuestionIndex, correctAnswerIndex),
- questionIndexForSpeech = currentQuestionIndex + 1,
- repromptText = "Question " + questionIndexForSpeech.toString() + ". " + spokenQuestion + " ";
- for (var i = 0; i < ANSWER_COUNT; i++) {
- repromptText += (i + 1).toString() + ". " + roundAnswers[i] + ". "
- }
- speechOutput += userGaveUp ? "" : "That answer is ";
- speechOutput += speechOutputAnalysis + "Your score is " + currentScore.toString() + ". " + repromptText;
- sessionAttributes = {
- "speechOutput": repromptText,
- "repromptText": repromptText,
- "currentQuestionIndex": currentQuestionIndex,
- "correctAnswerIndex": correctAnswerIndex + 1,
- "questions": gameQuestions,
- "score": currentScore,
- "correctAnswerText":
- questions[gameQuestions[currentQuestionIndex]][Object.keys(questions[gameQuestions[currentQuestionIndex]])[0]][0]
- };
- callback(sessionAttributes,
- buildSpeechletResponse(CARD_TITLE, speechOutput, repromptText, false));
- }
- }
- }
- function uuidv4() {
- return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
- var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
- return v.toString(16);
- });
- }
- function handleAnnounceReuqest(callback) {
- console.log('handleAnnounceReuqest() starts.')
- var uuid = uuidv4();
- var params = {
- ClientRequestToken: uuid, /* required */
- Content: { /* required */
- TextList: [
- {
- Locale: 'en-US', /* required */
- Value: 'this is an announcement made from Lambda' /* required */
- }
- ]
- },
- RoomFilters: [ /* required */
- {
- Key: 'RoomArn', /* required */
- Values: [ /* required */
- 'arn:aws:a4b:us-east-1:602307824922:room/39a4ac8b07b41622dfdc2fd3dadf2fc8/52b8bb40b219bf8737126a807919ac93'
- ]
- },
- /* more items */
- ],
- TimeToLiveInSeconds: '300'
- };
- var alexaforbusiness = new AWS.AlexaForBusiness();
- alexaforbusiness.sendAnnouncement(params, function (err, data) {
- if (err) {
- console.log("error response - data: " , err, err.stack); // an error occurred
- console.log('handleAnnounceReuqest() ends 001.')
- } else {
- console.log("successful response - data: " , data); // successful response
- var sessionAttributes = {};
- var repromptText = "";
- var speechOutput = "announcement is sent";
- var shouldEndSession = false;
- callback(sessionAttributes,
- buildSpeechletResponse(CARD_TITLE, speechOutput, repromptText, shouldEndSession));
- console.log('handleAnnounceReuqest() ends 002.')
- }
- });
- console.log('handleAnnounceReuqest() ends 000.')
- }
- function handleRepeatRequest(intent, session, callback) {
- // Repeat the previous speechOutput and repromptText from the session attributes if available
- // else start a new game session
- if (!session.attributes || !session.attributes.speechOutput) {
- getWelcomeResponse002(callback);
- } else {
- callback(session.attributes,
- buildSpeechletResponseWithoutCard(session.attributes.speechOutput, session.attributes.repromptText, false));
- }
- }
- function handleGetHelpRequest(intent, session, callback) {
- // Provide a help prompt for the user, explaining how the game is played. Then, continue the game
- // if there is one in progress, or provide the option to start another one.
- // Set a flag to track that we're in the Help state.
- session.attributes.userPromptedToContinue = true;
- // Do not edit the help dialogue. This has been created by the Alexa team to demonstrate best practices.
- var speechOutput = "I will ask you " + GAME_LENGTH + " multiple choice questions. Respond with the number of the answer. "
- + "For example, say one, two, three, or four. To start a new game at any time, say, start game. "
- + "To repeat the last question, say, repeat. "
- + "Would you like to keep playing?",
- repromptText = "To give an answer to a question, respond with the number of the answer . "
- + "Would you like to keep playing?";
- var shouldEndSession = false;
- callback(session.attributes,
- buildSpeechletResponseWithoutCard(speechOutput, repromptText, shouldEndSession));
- }
- function handleFinishSessionRequest(intent, session, callback) {
- // End the session with a "Good bye!" if the user wants to quit the game
- callback(session.attributes,
- buildSpeechletResponseWithoutCard("Good bye!", "", true));
- }
- function isAnswerSlotValid(intent) {
- var answerSlotFilled = intent.slots && intent.slots.Answer && intent.slots.Answer.value;
- var answerSlotIsInt = answerSlotFilled && !isNaN(parseInt(intent.slots.Answer.value));
- return answerSlotIsInt && parseInt(intent.slots.Answer.value) < (ANSWER_COUNT + 1) && parseInt(intent.slots.Answer.value) > 0;
- }
- // ------- Helper functions to build responses -------
- function buildSpeechletResponse(title, output, repromptText, shouldEndSession) {
- return {
- outputSpeech: {
- type: "PlainText",
- text: output
- },
- card: {
- type: "Simple",
- title: title,
- content: output
- },
- reprompt: {
- outputSpeech: {
- type: "PlainText",
- text: repromptText
- }
- },
- shouldEndSession: shouldEndSession
- };
- }
- function buildSpeechletResponseWithoutCard(output, repromptText, shouldEndSession) {
- return {
- outputSpeech: {
- type: "PlainText",
- text: output
- },
- reprompt: {
- outputSpeech: {
- type: "PlainText",
- text: repromptText
- }
- },
- shouldEndSession: shouldEndSession
- };
- }
- function buildResponse(sessionAttributes, speechletResponse) {
- return {
- version: "1.0",
- sessionAttributes: sessionAttributes,
- response: speechletResponse
- };
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement