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.

129 lines (105 loc) 3.82 kB
'use strict'; var _ = require('lodash'); var async = require('async'); var request = require('request'); var times = require('../times'); function init (env) { var keys = env.extendedSettings && env.extendedSettings.maker && env.extendedSettings.maker.key && env.extendedSettings.maker.key.split(' '); var announcementKeys = (env.extendedSettings && env.extendedSettings.maker && env.extendedSettings.maker.announcementKey && env.extendedSettings.maker.announcementKey.split(' ')) || keys; var maker = { }; var lastAllClear = 0; maker.sendAllClear = function sendAllClear (notify, callback) { if (Date.now() - lastAllClear > times.mins(30).msecs) { lastAllClear = Date.now(); //can be used to prevent maker/twitter deduping (add to IFTTT tweet text) var shortTimestamp = Math.round(Date.now() / 1000 / 60); maker.makeKeyRequests({ value1: (notify && notify.title) || 'All Clear' , value2: notify && notify.message && '\n' + notify.message , value3: '\n' + shortTimestamp }, 'ns-allclear', function allClearCallback (err) { if (err) { lastAllClear = 0; callback(err); } else if (callback) { callback(null, {sent: true}); } }); } else if (callback) { callback(null, {sent: false}); } }; maker.sendEvent = function sendEvent (event, callback) { if (!event || !event.name) { callback('No event name found'); } else if (!event.level) { callback('No event level found'); } else { maker.makeRequests(event, function sendCallback (err, response) { if (err) { callback(err); } else { lastAllClear = 0; callback(null, response); } }); } }; //exposed for testing maker.valuesToQuery = function valuesToQuery (event) { var query = ''; for (var i = 1; i <= 3; i++) { var name = 'value' + i; var value = event[name]; lastAllClear = 0; if (value) { if (query) { query += '&'; } else { query += '?'; } query += name + '=' + encodeURIComponent(value); } } return query; }; maker.makeRequests = function makeRequests(event, callback) { function sendGeneric (callback) { maker.makeKeyRequests(event, 'ns-event', callback); } function sendByLevel (callback) { maker.makeKeyRequests (event, 'ns-' + event.level, callback); } function sendByLevelAndName (callback) { maker.makeKeyRequests(event, 'ns' + ((event.level && '-' + event.level) || '') + '-' + event.name, callback); } //since maker events only filter on name, we are sending multiple events and different levels of granularity async.series([sendGeneric, sendByLevel, sendByLevelAndName], callback); }; maker.makeKeyRequests = function makeKeyRequests(event, eventName, callback) { var selectedKeys = event.isAnnouncement ? announcementKeys : keys; _.each(selectedKeys, function eachKey(key) { maker.makeKeyRequest(key, event, eventName, callback); }); }; maker.makeKeyRequest = function makeKeyRequest(key, event, eventName, callback) { var url = 'https://maker.ifttt.com/trigger/' + eventName + '/with/key/' + key + maker.valuesToQuery(event); request .get(url) .on('response', function (response) { console.info('sent maker request: ', url); callback(null, response); }) .on('error', function (err) { callback(err); }); }; if (keys && keys.length > 0) { return maker; } else { return null; } } module.exports = init;