334 lines
7.2 KiB
JavaScript
334 lines
7.2 KiB
JavaScript
require ('isomorphic-fetch');
|
|
const config = require ('../config/config');
|
|
var request = require ('request');
|
|
var databaseHelper = require ('./database');
|
|
|
|
var getBuildStatus = function (skillID) {
|
|
fetch (
|
|
`https://api.amazonalexa.com/v0/skills/${skillID}/interactionModel/locales/en-US/status`,
|
|
{
|
|
method: 'GET',
|
|
headers: {
|
|
Authorization: config.TOKEN,
|
|
},
|
|
}
|
|
).then (result => {
|
|
return result.text ();
|
|
});
|
|
};
|
|
|
|
var refreshTokens = function () {
|
|
return new Promise ((resolve, reject) => {
|
|
var options = {
|
|
method: 'POST',
|
|
url: 'https://api.amazon.com/auth/o2/token',
|
|
headers: {
|
|
'cache-control': 'no-cache',
|
|
'content-type': 'application/x-www-form-urlencoded',
|
|
},
|
|
form: {
|
|
grant_type: 'refresh_token',
|
|
refresh_token: config.REFRESH_TOKEN,
|
|
client_id: config.CLIENT_ID,
|
|
client_secret: config.CLIENT_SECRET,
|
|
},
|
|
};
|
|
|
|
request (options, function (error, response, body) {
|
|
if (error) {
|
|
reject (error);
|
|
}else{
|
|
parsedResponse = JSON.parse (body);
|
|
if (parsedResponse.refresh_token){
|
|
databaseHelper.updateTokens(parsedResponse.refresh_token, parsedResponse.access_token, parsedResponse.expires_in).then(()=>{
|
|
resolve();
|
|
}).catch(e=>{
|
|
reject(e);
|
|
});
|
|
}else{
|
|
reject (body);
|
|
}
|
|
}
|
|
});
|
|
});
|
|
};
|
|
|
|
var generateInteractionModel = function (skill) {
|
|
let result = {};
|
|
let allIntents = [];
|
|
let allPrompts = [];
|
|
let dialogIntents = [];
|
|
let allTypes = [];
|
|
|
|
let defaultIntents = [
|
|
{
|
|
name: 'AMAZON.CancelIntent',
|
|
samples: [],
|
|
},
|
|
{
|
|
name: 'AMAZON.HelpIntent',
|
|
samples: [],
|
|
},
|
|
{
|
|
name: 'AMAZON.StopIntent',
|
|
samples: [],
|
|
},
|
|
];
|
|
|
|
/*
|
|
defaultIntents.map(intent=>{
|
|
allIntents.push(intent);
|
|
});
|
|
*/
|
|
|
|
skill.intents.map (intent => {
|
|
allIntents.push ({name: intent.intentName, samples: intent.questions});
|
|
});
|
|
|
|
allIntents.push({
|
|
name:'EmailIntent',
|
|
samples:['I would like to send a message', 'I want to send a message', 'Send a message'],
|
|
slots:[
|
|
{
|
|
name:'Name',
|
|
type:'AMAZON.US_FIRST_NAME',
|
|
samples:[
|
|
'My name is {Name}',
|
|
'I am {Name}',
|
|
'{Name}'
|
|
]
|
|
},
|
|
{
|
|
"name": "Email",
|
|
"type": "emailSlot",
|
|
"samples": [
|
|
"{Email}",
|
|
"My email is {Email}"
|
|
]
|
|
},
|
|
{
|
|
"name": "Message",
|
|
"type": "emailMessage",
|
|
"samples": [
|
|
"{Message}",
|
|
"My message is {Message}"
|
|
]
|
|
}
|
|
]
|
|
});
|
|
|
|
allPrompts.push(
|
|
{
|
|
"id": "Elicit.Intent-EmailIntent.IntentSlot-Name",
|
|
"variations": [
|
|
{
|
|
"type": "PlainText",
|
|
"value": "What is your name ?"
|
|
}
|
|
]
|
|
}
|
|
);
|
|
|
|
allPrompts.push(
|
|
{
|
|
"id": "Elicit.Intent-EmailIntent.IntentSlot-Color",
|
|
"variations": [
|
|
{
|
|
"type": "PlainText",
|
|
"value": "What is your email"
|
|
},
|
|
{
|
|
"type": "PlainText",
|
|
"value": "Tell me your email"
|
|
}
|
|
]
|
|
}
|
|
);
|
|
|
|
allPrompts.push(
|
|
{
|
|
"id": "Elicit.Intent-EmailIntent.IntentSlot-Message",
|
|
"variations": [
|
|
{
|
|
"type": "PlainText",
|
|
"value": "What is your message ?"
|
|
},
|
|
{
|
|
"type": "PlainText",
|
|
"value": "What is the message ?"
|
|
}
|
|
]
|
|
}
|
|
);
|
|
|
|
dialogIntents.push(
|
|
{
|
|
"name": "EmailIntent",
|
|
"confirmationRequired": false,
|
|
"prompts": {},
|
|
"slots": [
|
|
{
|
|
"name": "Name",
|
|
"type": "AMAZON.US_FIRST_NAME",
|
|
"elicitationRequired": true,
|
|
"confirmationRequired": false,
|
|
"prompts": {
|
|
"elicitation": "Elicit.Intent-EmailIntent.IntentSlot-Name"
|
|
}
|
|
},
|
|
{
|
|
"name": "Email",
|
|
"type": "emailSlot",
|
|
"elicitationRequired": true,
|
|
"confirmationRequired": false,
|
|
"prompts": {
|
|
"elicitation": "Elicit.Intent-EmailIntent.IntentSlot-Email"
|
|
}
|
|
},
|
|
{
|
|
"name": "Message",
|
|
"type": "emailMessage",
|
|
"elicitationRequired": true,
|
|
"confirmationRequired": false,
|
|
"prompts": {
|
|
"elicitation": "Elicit.Intent-EmailIntent.IntentSlot-Message"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
);
|
|
|
|
allTypes.push(
|
|
{
|
|
"name": "emailMessage",
|
|
"values": [
|
|
{
|
|
"id": null,
|
|
"name": {
|
|
"value": "Quick brown fox jumps over lazy dog. Quick brown fox jumps over lazy dog. Quick brown fox jumps over lazy dog.",
|
|
"synonyms": []
|
|
}
|
|
}
|
|
]
|
|
}
|
|
);
|
|
|
|
allTypes.push(
|
|
{
|
|
"name": "emailSlot",
|
|
"values": [
|
|
{
|
|
"id": null,
|
|
"name": {
|
|
"value": "blablablabla@blablabla.blabla.blabla",
|
|
"synonyms": []
|
|
}
|
|
}
|
|
]
|
|
}
|
|
);
|
|
|
|
|
|
|
|
|
|
//Special Email Intents :
|
|
/*
|
|
allIntents.push ({
|
|
name: 'EmailIntentLaunch',
|
|
slots: [],
|
|
samples: [
|
|
'I want to send a message',
|
|
'I would like to send a message',
|
|
'I would like to leave a message',
|
|
'Leave a message',
|
|
],
|
|
});
|
|
|
|
allIntents.push ({
|
|
name: 'EmailIntent',
|
|
slots: [
|
|
{
|
|
name: 'Name',
|
|
type: 'AMAZON.US_FIRST_NAME',
|
|
},
|
|
{
|
|
name: 'Email',
|
|
type: 'AMAZON.LITERAL',
|
|
},
|
|
{
|
|
name: 'Message',
|
|
type: 'AMAZON.LITERAL',
|
|
},
|
|
{
|
|
name: 'Data',
|
|
type: 'AMAZON.LITERAL',
|
|
},
|
|
],
|
|
|
|
samples: [
|
|
'My name is {Name}',
|
|
'I am {Name}',
|
|
'{exampleww at wwdwdw|Data}',
|
|
'My email is {example at efefegedd|Email}',
|
|
'Send replay to {example at abcdefg|Email}',
|
|
'My message is {The quick brown fox jumps over the lazy dog.The quick brown fox jumps over the lazy dog.The quick brown fox jumps over the lazy dog.|Message}',
|
|
],
|
|
});
|
|
*/
|
|
|
|
|
|
|
|
result.interactionModel = {};
|
|
|
|
result.interactionModel.languageModel = {
|
|
invocationName: skill.invocationName,
|
|
intents: allIntents,
|
|
};
|
|
|
|
result.interactionModel.types = allTypes;
|
|
result.interactionModel.prompts = allPrompts;
|
|
result.interactionModel.dialog = {};
|
|
result.interactionModel.dialog.intents = dialogIntents;
|
|
|
|
return JSON.stringify (result);
|
|
};
|
|
|
|
var uploadSkill = function (skill) {
|
|
return fetch (
|
|
`https://api.amazonalexa.com/v0/skills/${skill.skillID}/interactionModel/locales/en-US`,
|
|
{
|
|
method: 'POST',
|
|
headers: {
|
|
Authorization: config.TOKEN,
|
|
},
|
|
body: generateInteractionModel (skill),
|
|
}
|
|
);
|
|
};
|
|
|
|
module.exports = {
|
|
updateSkill: function (skill) {
|
|
return new Promise ((resolve, reject) => {
|
|
if (new Date () / 1000 > config.TOKEN_EXPIRES_IN) {
|
|
refreshTokens ()
|
|
.then (() => {
|
|
uploadSkill (skill).then (response => {
|
|
resolve (response.status);
|
|
});
|
|
})
|
|
.catch (e => {
|
|
reject (e);
|
|
});
|
|
} else {
|
|
uploadSkill (skill)
|
|
.then (response => {
|
|
resolve (response.status);
|
|
})
|
|
.catch (e => {
|
|
reject (e);
|
|
});
|
|
}
|
|
});
|
|
},
|
|
};
|