UNPKG

nightscout

Version:

Nightscout acts as a web-based CGM (Continuous Glucose Monitor) to allow multiple caregivers to remotely view a patients glucose data in realtime.

110 lines (101 loc) 3.52 kB
var _ = require('lodash'); var async = require('async'); function init () { console.log('Configuring Alexa...'); function alexa() { return alexa; } var intentHandlers = {}; var rollup = {}; // There is no protection for a previously handled metric - one plugin can overwrite the handler of another plugin. alexa.configureIntentHandler = function configureIntentHandler(intent, handler, metrics) { if (!intentHandlers[intent]) { intentHandlers[intent] = {}; } if (metrics) { for (var i = 0, len = metrics.length; i < len; i++) { if (!intentHandlers[intent][metrics[i]]) { intentHandlers[intent][metrics[i]] = {}; } console.log('Storing handler for intent \'' + intent + '\' for metric \'' + metrics[i] + '\''); intentHandlers[intent][metrics[i]].handler = handler; } } else { console.log('Storing handler for intent \'' + intent + '\''); intentHandlers[intent].handler = handler; } }; // This function retrieves a handler based on the intent name and metric requested. alexa.getIntentHandler = function getIntentHandler(intentName, metric) { if (metric === undefined) { console.log('Looking for handler for intent \'' + intentName + '\''); if (intentName && intentHandlers[intentName] && intentHandlers[intentName].handler ) { console.log('Found!'); return intentHandlers[intentName].handler; } } else { console.log('Looking for handler for intent \'' + intentName + '\' for metric \'' + metric + '\''); if (intentName && intentHandlers[intentName] && intentHandlers[intentName][metric] && intentHandlers[intentName][metric].handler ) { console.log('Found!'); return intentHandlers[intentName][metric].handler } } console.log('Not found!'); return null; }; alexa.addToRollup = function(rollupGroup, handler, rollupName) { if (!rollup[rollupGroup]) { console.log('Creating the rollup group: ', rollupGroup); rollup[rollupGroup] = []; } rollup[rollupGroup].push({handler: handler, name: rollupName}); }; alexa.getRollup = function(rollupGroup, sbx, slots, locale, callback) { var handlers = _.map(rollup[rollupGroup], 'handler'); console.log('Rollup array for ', rollupGroup); console.log(rollup[rollupGroup]); var nHandlers = []; _.each(handlers, function (handler) { nHandlers.push(handler.bind(null, slots, sbx)); }); async.parallelLimit(nHandlers, 10, function(err, results) { if (err) { console.error('Error: ', err); } callback(_.map(_.orderBy(results, ['priority'], ['asc']), 'results').join(' ')); }); }; // This creates the expected alexa response alexa.buildSpeechletResponse = function buildSpeechletResponse(title, output, repromptText, shouldEndSession) { return { version: '1.0', response: { outputSpeech: { type: 'PlainText', text: output }, card: { type: 'Simple', title: title, content: output }, reprompt: { outputSpeech: { type: 'PlainText', text: repromptText } }, shouldEndSession: shouldEndSession } }; }; return alexa; } module.exports = init;