-
Notifications
You must be signed in to change notification settings - Fork 1
/
index.js
187 lines (161 loc) · 7.31 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
'use strict';
// --------------- Helpers that build all of the responses -----------------------
function buildSpeechletResponse(title, output, repromptText, shouldEndSession) {
return {
outputSpeech: {
type: 'PlainText',
text: output,
},
card: {
type: 'Simple',
title: `Cyber Discovery - ${title}`,
content: `Cyber Discovery - ${output}`,
},
reprompt: {
outputSpeech: {
type: 'PlainText',
text: repromptText,
},
},
shouldEndSession,
};
}
function buildResponse(sessionAttributes, speechletResponse) {
return {
version: '1.0',
sessionAttributes,
response: speechletResponse,
};
}
// --------------- Functions that control the skill's behavior -----------------------
function getWelcomeResponse(callback) {
// If we wanted to initialize the session to have some attributes we could add those here.
const sessionAttributes = {};
const cardTitle = 'Welcome';
const speechOutput = 'Welcome to the Cyber Discovery Buddy. ' +
'You can ask me when a stage starts or ends. You can also ask for a random tip.';
// If the user either does not reply to the welcome message or says something that is not
// understood, they will be prompted again with this text.
const repromptText = 'Please choose an option.';
const shouldEndSession = false;
callback(sessionAttributes,
buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession));
}
function handleSessionEndRequest(callback) {
const cardTitle = 'Session Ended';
const speechOutput = 'Thank you for trying the Cyber Discovery Buddy. Have a nice day!';
// Setting this to true ends the session and exits the skill.
const shouldEndSession = true;
callback({}, buildSpeechletResponse(cardTitle, speechOutput, null, shouldEndSession));
}
// --------------- Events -----------------------
/**
* Called when the session starts.
*/
function onSessionStarted(sessionStartedRequest, session) {
console.log(`onSessionStarted requestId=${sessionStartedRequest.requestId}, sessionId=${session.sessionId}`);
}
/**
* Called when the user launches the skill without specifying what they want.
*/
function onLaunch(launchRequest, session, callback) {
console.log(`onLaunch requestId=${launchRequest.requestId}, sessionId=${session.sessionId}`);
// Run skill's launch menu.
getWelcomeResponse(callback);
}
function showCard(sessionAttributes, title, content, reprompt, exit, callback) {
callback(sessionAttributes, buildSpeechletResponse(title, content, reprompt, exit));
}
/**
* Called when the user specifies an intent for this skill.
*/
function giveTip(callback) {
var tips = ["Don't be afraid to read over the source again!", "Using an unconvential approach is ok!", "Did you check server configuration files that might exist?", "Check file extensions!", "The developer console often helps.", "Have you looked at cookies?", "Maybe trying random inputs until it works is the way to go."];
var tip = tips[Math.floor(Math.random()*tips.length)];
callback({}, buildSpeechletResponse("Tip", `Your tip is: "${tip}"! Good luck with the challenge!`, "", true));
}
function onIntent(intentRequest, session, callback) {
console.log(`onIntent requestId=${intentRequest.requestId}, sessionId=${session.sessionId}`);
const intentName = intentRequest.intent.name;
switch (intentName) {
case 'assess_start_date':
showCard({}, "Assess Start Date", "Cyberstart Assess Started on the 2nd of June.", "", true, callback);
break;
case 'Assess End Date':
showCard({}, "Assess End Date", "Cyberstart Assess Ends on the 31st of October.", "", true, callback);
break;
case 'game_start_date':
showCard({}, "Game Start Date", "Cyberstart Game Started on the 2nd of June.", "", true, callback);
break;
case 'essentials_start_date':
showCard({}, "Essentials Start Date", "Cyberstart Essentials Starts on the 15th of September.", "", true, callback);
break;
case 'essentials_end_date':
showCard({}, "Essentials End Date", "Cyberstart Essentials Ends on the 31st of March.", "", true, callback);
break;
case 'AMAZON.HelpIntent':
getWelcomeResponse(callback);
break;
case 'AMAZON.StopIntent':
case 'AMAZON.CancelIntent':
handleSessionEndRequest(callback);
break;
case 'elite_dates':
showCard({}, "Cyberstart Elite Dates", "Cyberstart Elite Dates for Year 3 of the program are on the Mondays, Wednesdays and Fridays from 27th July to 7th August 2020 for younger elite qualifiers.For the older elite participants, elite runs on every weekday from 27th July to &th August 2020. On the 8th August 2020, there is a Elite CTF running from 9am to 5pm, for both age groups.", "", true, callback);
break;
case 'get_tip':
giveTip(callback);
break;
case 'no_deobfuscation':
showCard({}, "Deobfuscation", "Deobfuscation shouldn't be attempted unless the challenge states you should.", "", true, callback);
break;
default :
throw new Error('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 cleanup logic here
}
// --------------- Main handler -----------------------
// Route the incoming request based on type (LaunchRequest, IntentRequest,
// etc.) The JSON body of the request is provided in the event parameter.
exports.handler = (event, context, callback) => {
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.[unique-value-here]') {
callback('Invalid Application ID');
}
*/
if (event.session.new) {
onSessionStarted({ requestId: event.request.requestId }, event.session);
}
if (event.request.type === 'LaunchRequest') {
onLaunch(event.request,
event.session,
(sessionAttributes, speechletResponse) => {
callback(null, buildResponse(sessionAttributes, speechletResponse));
});
} else if (event.request.type === 'IntentRequest') {
onIntent(event.request,
event.session,
(sessionAttributes, speechletResponse) => {
callback(null, buildResponse(sessionAttributes, speechletResponse));
});
} else if (event.request.type === 'SessionEndedRequest') {
onSessionEnded(event.request, event.session);
callback();
}
} catch (err) {
callback(err);
}
};