...
This commit is contained in:
205
backend/components/alexa.js
Normal file
205
backend/components/alexa.js
Normal file
@@ -0,0 +1,205 @@
|
||||
var alexa = require ('alexa-app');
|
||||
const config = require ('../config/config');
|
||||
var databaseHelper = require ('../helpers/database');
|
||||
|
||||
//User data for sending message, this is skill-related and will be in some skill container
|
||||
var Name = null;
|
||||
var Email = null;
|
||||
var Message = null;
|
||||
var State = 0; // states should be defined in seperate file. (Not sending message, Waiting for name, Waiting for email, Waiting for message)
|
||||
//For now (this is not long term solution)
|
||||
// 0 : Not sending Message
|
||||
// 1 : Waiting for name
|
||||
// 2 : Waiting for email
|
||||
// 3 : Waiting for message
|
||||
|
||||
var alexaApp = new alexa.app ('saburly'); // this means we still work with one skill
|
||||
|
||||
module.exports = {
|
||||
init: function (express) {
|
||||
|
||||
alexaApp.express ({
|
||||
expressApp: express,
|
||||
|
||||
// verifies requests come from amazon alexa. Must be enabled for production.
|
||||
// You can disable this if you're running a dev environment and want to POST
|
||||
// things to test behavior. enabled by default.
|
||||
checkCert: false,
|
||||
|
||||
// sets up a GET route when set to true. This is handy for testing in
|
||||
// development, but not recommended for production. disabled by default
|
||||
debug: true,
|
||||
});
|
||||
},
|
||||
|
||||
updateIntentsJSON: function () {
|
||||
databaseHelper
|
||||
.loadSkill (config.SKILL_DB_ID)
|
||||
.then (skill => {
|
||||
skill.intents.map (intent => {
|
||||
alexaApp.intent (
|
||||
intent.intentName,
|
||||
{
|
||||
slots: [],
|
||||
utterances: intent.questions,
|
||||
},
|
||||
function (request, response) {
|
||||
return response.say (intent.answer).shouldEndSession (false);
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
alexaApp.launch ((request, response) => {
|
||||
return response.say (skill.invocationAnswer).shouldEndSession (false);
|
||||
});
|
||||
|
||||
alexaApp.intent (
|
||||
'EmailIntentLaunch',
|
||||
{
|
||||
slots: [],
|
||||
utterances: [
|
||||
'I want to send a message',
|
||||
'I would like to send a message',
|
||||
'I would like to leave a message',
|
||||
'Leave a message',
|
||||
],
|
||||
},
|
||||
function (request, response) {
|
||||
Name = null;
|
||||
Email = null;
|
||||
Message = null;
|
||||
State = 1;
|
||||
|
||||
return response
|
||||
.say ('Ok. What is your name')
|
||||
.shouldEndSession (false);
|
||||
}
|
||||
);
|
||||
|
||||
//TODO : Watch out for this intent. It will make trouble with other regular intents
|
||||
//if other intents have utterance with just one slot like {Data}
|
||||
//It should be taken care somwhere before this, to check if Email Intent is invoked
|
||||
//This is problem only if we introduce slot options for regular intents for users
|
||||
alexaApp.intent (
|
||||
'EmailIntent',
|
||||
{
|
||||
slots: {
|
||||
Name: 'AMAZON.US_FIRST_NAME',
|
||||
Email: 'AMAZON.LITERAL',
|
||||
Message: 'AMAZON.LITERAL',
|
||||
Data: 'AMAZON.LITERAL',
|
||||
},
|
||||
utterances: [
|
||||
'My name is {-|Name}',
|
||||
'I am {-|Name}',
|
||||
'{dawdw at dwd wdw|Data}',
|
||||
'My email is {wadwwdw at wadwwd wdw|Email}',
|
||||
'Send replay to {fkofkeofe at dppfam wd|Email}',
|
||||
'My message is {Quick brown fox jumps over lazy dog|Message}',
|
||||
],
|
||||
},
|
||||
function (request, response) {
|
||||
let Data = undefined;
|
||||
try {
|
||||
if (!Name) Name = request.slot ('Name');
|
||||
} catch (e) {
|
||||
console.log ('Error. No name slot ');
|
||||
Name = undefined;
|
||||
}
|
||||
try {
|
||||
if (!Email) Email = request.slot ('Email');
|
||||
} catch (e) {
|
||||
console.log ('Error. No Email slot');
|
||||
Email = undefined;
|
||||
}
|
||||
try {
|
||||
if (!Message) Message = request.slot ('Message');
|
||||
} catch (e) {
|
||||
console.log ('Error. No Message slot');
|
||||
Message = undefined;
|
||||
}
|
||||
try {
|
||||
Data = request.slot ('Data');
|
||||
} catch (e) {
|
||||
console.log ('Error. No Data slot');
|
||||
Data = undefined;
|
||||
}
|
||||
console.log ('State : ' + State);
|
||||
|
||||
//TODO : Responses could be configurable for each skill ?
|
||||
|
||||
if (State === 1) {
|
||||
//Was waiting for name, so if Name is null, name is probably in Data
|
||||
if ((!Name && Data) || Name) {
|
||||
//got the name, let's continue for the email
|
||||
if (!Name) Name = Data;
|
||||
State = 2;
|
||||
return response
|
||||
.say ('Ok ' + Name + '. What is your email ?')
|
||||
.shouldEndSession (false);
|
||||
} else {
|
||||
//Something is wrong, ask for name again
|
||||
return response
|
||||
.say (
|
||||
'Sorry, I didnt understand your name. Can you say it again ?'
|
||||
)
|
||||
.shouldEndSession (false);
|
||||
}
|
||||
} else if (State === 2) {
|
||||
//was waiting for email, so if Email is null, email is probably in Data
|
||||
if ((!Email && Data) || Email) {
|
||||
//Got the email, first verify email and than continue to message
|
||||
if (!Email) Email = Data;
|
||||
//TODO : verify email
|
||||
State = 3;
|
||||
return response
|
||||
.say ('Great. Whats the message ?')
|
||||
.shouldEndSession (false);
|
||||
} else {
|
||||
//Something is wrong, ask for the email again
|
||||
return response
|
||||
.say (
|
||||
'Sorry, I didnt understan you email. Can you say it again ?'
|
||||
)
|
||||
.shouldEndSession (false);
|
||||
}
|
||||
} else if (State === 3) {
|
||||
//Was waiting for message, so if Message is null, message is probably in Data
|
||||
if ((!Message && Data) || Message) {
|
||||
//Ok, we got all informations. Exit email intent
|
||||
if (!Message) Message = Data;
|
||||
State = 0;
|
||||
//TODO : Send email
|
||||
console.log (
|
||||
'Name : ' +
|
||||
Name +
|
||||
' | Email : ' +
|
||||
Email +
|
||||
' | Message : ' +
|
||||
Message
|
||||
);
|
||||
return response.say (
|
||||
'Message sent. Someone will contact you ASAP'
|
||||
);
|
||||
} else {
|
||||
//Something is wrong, ask for the message again
|
||||
return response
|
||||
.say (
|
||||
'Sorry, I didnt understand your message. Can you say it again ?'
|
||||
)
|
||||
.shouldEndSession (false);
|
||||
}
|
||||
} else {
|
||||
console.log ('State strange ! ' + State);
|
||||
}
|
||||
}
|
||||
);
|
||||
})
|
||||
.catch (err => {
|
||||
console.log (err);
|
||||
alexaApp.launch ((request, response) => {
|
||||
return response.say ('Sorry, there was no skill with that name');
|
||||
});
|
||||
});
|
||||
},
|
||||
};
|
||||
Reference in New Issue
Block a user