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); }); } }); }, };