diff --git a/social/twilio/56-twilio.html b/social/twilio/56-twilio.html index c73769bf..ec9f84ef 100644 --- a/social/twilio/56-twilio.html +++ b/social/twilio/56-twilio.html @@ -16,6 +16,17 @@ --> + + diff --git a/social/twilio/56-twilio.js b/social/twilio/56-twilio.js index 8aca55ff..5db40726 100644 --- a/social/twilio/56-twilio.js +++ b/social/twilio/56-twilio.js @@ -17,47 +17,97 @@ var RED = require(process.env.NODE_RED_HOME+"/red/red"); var util = require('util'); - -// Either add a line like this to settings.js -// twilio: { account:'My-ACCOUNT-SID', authtoken:'TWILIO-TOKEN',from:'FROM-NUMBER' }, -// Or as a twiliokey.js file in the directory ABOVE node-red. -// module.exports = { account:'My-ACCOUNT-SID', authtoken:'TWILIO-TOKEN',from:'FROM-NUMBER' } +var twilio = require('twilio'); try { var twiliokey = RED.settings.twilio || require(process.env.NODE_RED_HOME+"/../twiliokey.js"); } catch(err) { - util.log("[56-twilio.js] Error: Failed to load Twilio credentials"); } -if (twiliokey) { - var twilioClient = require('twilio')(twiliokey.account, twiliokey.authtoken); - var fromNumber = twiliokey.from; -} +var querystring = require('querystring'); +RED.httpAdmin.get('/twilio-api/global',function(req,res) { + res.send(JSON.stringify({hasToken:!(twiliokey && twiliokey.account && twiliokey.authtoken)})); +}); +RED.httpAdmin.get('/twilio-api/:id',function(req,res) { + var credentials = RED.nodes.getCredentials(req.params.id); + if (credentials) { + res.send(JSON.stringify({hasToken:(credentials.token&&credentials.token!="")})); + } else { + res.send(JSON.stringify({})); + } +}); + +RED.httpAdmin.delete('/twilio-api/:id',function(req,res) { + RED.nodes.deleteCredentials(req.params.id); + res.send(200); +}); + +RED.httpAdmin.post('/twilio-api/:id',function(req,res) { + var body = ""; + req.on('data', function(chunk) { + body+=chunk; + }); + req.on('end', function(){ + var newCreds = querystring.parse(body); + var credentials = RED.nodes.getCredentials(req.params.id)||{}; + if (newCreds.token == "") { + delete credentials.token; + } else { + credentials.token = newCreds.token; + } + RED.nodes.addCredentials(req.params.id,credentials); + res.send(200); + }); +}); + +function TwilioAPINode(n) { + RED.nodes.createNode(this,n); + this.sid = n.sid; + this.from = n.from; + this.name = n.name; + var credentials = RED.nodes.getCredentials(n.id); + if (credentials) { + this.token = credentials.token; + } +} +RED.nodes.registerType("twilio-api",TwilioAPINode); + + function TwilioOutNode(n) { RED.nodes.createNode(this,n); this.number = n.number; + + this.api = RED.nodes.getNode(n.twilio); + + if (this.api) { + this.twilioClient = twilio(this.api.sid,this.api.token); + this.fromNumber = this.api.from; + } else if (twiliokey) { + this.twilioClient = twilio(twiliokey.account, twiliokey.authtoken); + this.fromNumber = twiliokey.from; + } else { + this.error("missing twilio credentials"); + return; + } + var node = this; this.on("input",function(msg) { if (typeof(msg.payload) == 'object') { msg.payload = JSON.stringify(msg.payload); } - if (twiliokey) { - try { - // Send SMS - var tonum = node.number || msg.topic; - twilioClient.sendMessage( {to: tonum, from: fromNumber, body: msg.payload}, function(err, response) { - if (err) node.error(err); - //console.log(response); - }); - } - catch (err) { - node.error(err); - } - } - else { - node.warn("Twilio credentials not set/found. See node info."); + try { + // Send SMS + var tonum = node.number || msg.topic; + node.twilioClient.sendMessage( {to: tonum, from: node.fromNumber, body: msg.payload}, function(err, response) { + if (err) { + node.error(err); + } + //console.log(response); + }); + } catch (err) { + node.error(err); } }); }