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