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 (l => l.text ()) .then (result => { return result; }); }; 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); parsedResponse = JSON.parse (body); if (parsedResponse.refresh_token) return databaseHelper.updateTokens ( parsedResponse.refresh_token, parsedResponse.access_token, parsedResponse.expires_in ); console.log('Token refresh failed'); console.log(body); reject(body); }); }); }; var generateInteractionModel = function (skill) { let result = {}; let allIntents = []; 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}); }); //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, }; 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); }); } }); }, };