mirror of
				https://github.com/node-red/node-red-nodes.git
				synced 2025-03-01 10:37:43 +00:00 
			
		
		
		
	Add Pushover Node - with credentials support.
This commit is contained in:
		| @@ -23,6 +23,11 @@ | ||||
|         <label for="node-input-priority"><i class="icon-tag"></i> Priority</label> | ||||
|         <input type="text" id="node-input-priority" placeholder="0"> | ||||
|     </div> | ||||
|     <div class="form-row"> | ||||
|         <label for="node-config-input-pushkey"><i class="icon-lock"></i> API Key</label> | ||||
|         <input type="password" id="node-config-input-pushkey"> | ||||
|     </div> | ||||
|     <br/> | ||||
|     <div class="form-row"> | ||||
|         <label for="node-input-name"><i class="icon-tag"></i> Name</label> | ||||
|         <input type="text" id="node-input-name" placeholder="Name"> | ||||
| @@ -30,13 +35,12 @@ | ||||
| </script> | ||||
|  | ||||
| <script type="text/x-red" data-help-name="prowl"> | ||||
| 	<p>Uses Prowl to push the <b>msg.payload</b> to an Apple device that has the prowl app installed.</p> | ||||
| 	<p>Optionally uses <b>msg.topic</b> to set the title. You can also set <b>msg.priority</b> to confgure the urgency from -2 (low), through 0 (normal) to 2 (urgent).</p> | ||||
| 	<p>You MUST configure your prowl API key into either the settings.js file like this</p> | ||||
| 	<p><pre>prowl: { prowlkey:'My-API-KEY' },</pre></p> | ||||
| 	<p>Or into a pushkey.js file in the directory <b>above</b> node-red.</p> | ||||
| 	<p><pre>module.exports = { prowlkey:'My-API-KEY' }</pre></p> | ||||
| 	<p>Uses Prowl so see <i><a href="https://www.prowlapp.com" target="_new">this link</a></i> for more details.</p> | ||||
|     <p>Uses Prowl to push the <b>msg.payload</b> to an Apple device that has the prowl app installed.</p> | ||||
|     <p>Optionally uses <b>msg.topic</b> to set the title. You can also set <b>msg.priority</b> to confgure the urgency from -2 (low), through 0 (normal) to 2 (urgent).</p> | ||||
|     <p>The API Key is stored in a separate credentials file.</p> | ||||
|     <p>The old method of storing your Prowl API key in the pushkey.js file in the directory <b>above</b> node-red has been deprecated.</p> | ||||
|     <!-- <p><pre>module.exports = { prowlkey:'My-API-KEY' }</pre></p> --> | ||||
|     <p>Uses Prowl. See <i><a href="https://www.prowlapp.com" target="_new">this link</a></i> for more details.</p> | ||||
| </script> | ||||
|  | ||||
| <script type="text/javascript"> | ||||
| @@ -57,7 +61,35 @@ | ||||
|         }, | ||||
|         labelStyle: function() { | ||||
|             return this.name?"node_label_italic":""; | ||||
|         }, | ||||
|         oneditprepare: function() { | ||||
|             $.getJSON('prowl/'+this.id,function(data) { | ||||
|                 if (data.hasPassword) { | ||||
|                     $('#node-config-input-pushkey').val('__PWRD__'); | ||||
|                 } else { | ||||
|                     $('#node-config-input-pushkey').val(''); | ||||
|                 } | ||||
|             }); | ||||
|         }, | ||||
|         oneditsave: function() { | ||||
|             var credentials = {}; | ||||
|             var newPass = $('#node-config-input-pushkey').val(); | ||||
|             if (newPass != '__PWRD__') { | ||||
|                 credentials.pushkey = newPass; | ||||
|                 $.ajax({ | ||||
|                     url: 'prowl/'+this.id, | ||||
|                     type: 'POST', | ||||
|                     data: credentials, | ||||
|                     success: function(result){} | ||||
|                 }); | ||||
|             } | ||||
|         }, | ||||
|         ondelete: function() { | ||||
|             $.ajax({ | ||||
|                 url: 'prowl/'+this.id, | ||||
|                 type: 'DELETE', | ||||
|                 success: function(result) {} | ||||
|             }); | ||||
|         } | ||||
|     }); | ||||
|  | ||||
| </script> | ||||
|   | ||||
| @@ -24,15 +24,9 @@ var util = require('util'); | ||||
| //    module.exports = {prowlkey:'My-API-KEY'} | ||||
|  | ||||
| try { | ||||
|     var pushkey = RED.settings.prowl || require(process.env.NODE_RED_HOME+"/../pushkey.js"); | ||||
| } | ||||
| catch(err) { | ||||
|     util.log("[57-prowl.js] Error: Failed to load Prowl credentials"); | ||||
| } | ||||
|  | ||||
| if (pushkey) { | ||||
|     if (pushkey.prowlkey) { var prowl = new Prowl(pushkey.prowlkey); } | ||||
|     var pushkeys = RED.settings.prowl || require(process.env.NODE_RED_HOME+"/../pushkey.js"); | ||||
| } | ||||
| catch(err) { } | ||||
|  | ||||
| function ProwlNode(n) { | ||||
|     RED.nodes.createNode(this,n); | ||||
| @@ -40,7 +34,16 @@ function ProwlNode(n) { | ||||
|     this.priority = parseInt(n.priority); | ||||
|     if (this.priority > 2) this.priority = 2; | ||||
|     if (this.priority < -2) this.priority = -2; | ||||
|     var credentials = RED.nodes.getCredentials(n.id); | ||||
|     if ((credentials) && (credentials.hasOwnProperty("pushkey"))) { this.pushkey = credentials.pushkey; } | ||||
|     else { | ||||
|         if (pushkeys) { this.pushkey = pushkeys.prowlkey; } | ||||
|         else { this.error("No Prowl credentials set."); } | ||||
|     } | ||||
|     this.prowl = false; | ||||
|     if (this.pushkey) { this.prowl = new Prowl(this.pushkey); } | ||||
|     var node = this; | ||||
|  | ||||
|     this.on("input",function(msg) { | ||||
|         var titl = this.title||msg.topic||"Node-RED"; | ||||
|         var pri = msg.priority||this.priority; | ||||
| @@ -48,9 +51,9 @@ function ProwlNode(n) { | ||||
|             msg.payload = JSON.stringify(msg.payload); | ||||
|         } | ||||
|         else { msg.payload = msg.payload.toString(); } | ||||
|         if (pushkey.prowlkey) { | ||||
|         if (node.pushkey) { | ||||
|             try { | ||||
|                 prowl.push(msg.payload, titl, { priority: pri }, function(err, remaining) { | ||||
|                 node.prowl.push(msg.payload, titl, { priority: pri }, function(err, remaining) { | ||||
|                     if (err) node.error(err); | ||||
|                     node.log( remaining + ' calls to Prowl api during current hour.' ); | ||||
|                 }); | ||||
| @@ -60,8 +63,42 @@ function ProwlNode(n) { | ||||
|             } | ||||
|         } | ||||
|         else { | ||||
|             node.warn("Prowl credentials not set/found. See node info."); | ||||
|             node.warn("Prowl credentials not set."); | ||||
|         } | ||||
|     }); | ||||
| } | ||||
| RED.nodes.registerType("prowl",ProwlNode); | ||||
|  | ||||
| var querystring = require('querystring'); | ||||
|  | ||||
| RED.httpAdmin.get('/prowl/:id',function(req,res) { | ||||
|     var credentials = RED.nodes.getCredentials(req.params.id); | ||||
|     if (credentials) { | ||||
|         res.send(JSON.stringify({hasPassword:(credentials.pushkey&&credentials.pushkey!="")})); | ||||
|     } else { | ||||
|         res.send(JSON.stringify({})); | ||||
|     } | ||||
| }); | ||||
|  | ||||
| RED.httpAdmin.delete('/prowl/:id',function(req,res) { | ||||
|     RED.nodes.deleteCredentials(req.params.id); | ||||
|     res.send(200); | ||||
| }); | ||||
|  | ||||
| RED.httpAdmin.post('/prowl/: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.pushkey == "") { | ||||
|             delete credentials.pushkey; | ||||
|         } else { | ||||
|             credentials.pushkey = newCreds.pushkey||credentials.pushkey; | ||||
|         } | ||||
|         RED.nodes.addCredentials(req.params.id,credentials); | ||||
|         res.send(200); | ||||
|     }); | ||||
| }); | ||||
|   | ||||
							
								
								
									
										109
									
								
								social/pushover/57-pushover.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										109
									
								
								social/pushover/57-pushover.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,109 @@ | ||||
| <!-- | ||||
|   Copyright 2014 IBM Corp. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|   http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
| --> | ||||
|  | ||||
| <script type="text/x-red" data-template-name="pushover"> | ||||
|     <div class="form-row"> | ||||
|         <label for="node-input-title"><i class="icon-flag"></i> Title</label> | ||||
|         <input type="text" id="node-input-title" placeholder="Node-RED"> | ||||
|     </div> | ||||
|     <div class="form-row"> | ||||
|         <label for="node-input-priority"><i class="icon-bell"></i> Priority</label> | ||||
|         <input type="text" id="node-input-priority" placeholder="0" style="width:50px;"> | ||||
|     </div> | ||||
|     <div class="form-row"> | ||||
|         <label for="node-config-input-deviceid"><i class="icon-user"></i> User key</label> | ||||
|         <input type="text" id="node-config-input-deviceid"> | ||||
|     </div> | ||||
|     <div class="form-row"> | ||||
|         <label for="node-config-input-pushkey"><i class="icon-lock"></i> API token</label> | ||||
|         <input type="password" id="node-config-input-pushkey"> | ||||
|     </div> | ||||
|     <br/> | ||||
|     <div class="form-row"> | ||||
|         <label for="node-input-name"><i class="icon-tag"></i> Name</label> | ||||
|         <input type="text" id="node-input-name" placeholder="Name"> | ||||
|     </div> | ||||
|     <div class="form-tips" id="node-tip">Tip: Leave title blank to set using <b>msg.topic</b> and <b>msg.priority</b>.<br/> | ||||
|     Only supports priorities 2, 1, 0, and -1.</div> | ||||
| </script> | ||||
|  | ||||
| <script type="text/x-red" data-help-name="pushover"> | ||||
|     <p>Uses Pushover to push the <b>msg.payload</b> to a device that has the Pushover app installed.</p> | ||||
|     <p>Optionally uses <b>msg.topic</b> to set the title, and <b>msg.priority</b> to set the priority, if not already set in the properties.</p> | ||||
|     <p>The User-key and API-token are stored in a separate credentials file.</p> | ||||
|     <p>Uses Pushover. See <i><a href="https://pushover.net" target="_new">this link</a></i> for more details.</p> | ||||
| </script> | ||||
|  | ||||
| <script type="text/javascript"> | ||||
|     RED.nodes.registerType('pushover',{ | ||||
|         category: 'output', | ||||
|         defaults: { | ||||
|             title: {value:""}, | ||||
|             name: {value:""}, | ||||
|             priority: {value:0} | ||||
|         }, | ||||
|         color:"#a7c9a0", | ||||
|         inputs:1, | ||||
|         outputs:0, | ||||
|         icon: "pushover.png", | ||||
|         align: "right", | ||||
|         label: function() { | ||||
|             return this.name||this.title||"pushover"; | ||||
|         }, | ||||
|         labelStyle: function() { | ||||
|             return this.name?"node_label_italic":""; | ||||
|         }, | ||||
|         oneditprepare: function() { | ||||
|             $("#node-input-priority").spinner({ | ||||
|                 min:-1, | ||||
|                 max:2 | ||||
|             }); | ||||
|             $.getJSON('pushover/'+this.id,function(data) { | ||||
|                 if (data.deviceid) { | ||||
|                     $('#node-config-input-deviceid').val(data.deviceid); | ||||
|                 } | ||||
|                 if (data.hasPassword) { | ||||
|                     $('#node-config-input-pushkey').val('__PWRD__'); | ||||
|                 } else { | ||||
|                     $('#node-config-input-pushkey').val(''); | ||||
|                 } | ||||
|  | ||||
|             }); | ||||
|         }, | ||||
|         oneditsave: function() { | ||||
|             var credentials = {}; | ||||
|             var newUser = $('#node-config-input-deviceid').val(); | ||||
|             var newPass = $('#node-config-input-pushkey').val(); | ||||
|             credentials.deviceid = newUser; | ||||
|             if (newPass != '__PWRD__') { | ||||
|                 credentials.pushkey = newPass; | ||||
|             } | ||||
|             $.ajax({ | ||||
|                 url: 'pushover/'+this.id, | ||||
|                 type: 'POST', | ||||
|                 data: credentials, | ||||
|                 success: function(result){} | ||||
|             }); | ||||
|         }, | ||||
|         ondelete: function() { | ||||
|             $.ajax({ | ||||
|                 url: 'pushover/'+this.id, | ||||
|                 type: 'DELETE', | ||||
|                 success: function(result) {} | ||||
|             }); | ||||
|         } | ||||
|     }); | ||||
| </script> | ||||
							
								
								
									
										110
									
								
								social/pushover/57-pushover.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								social/pushover/57-pushover.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,110 @@ | ||||
| /** | ||||
|  * Copyright 2014 IBM Corp. | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  **/ | ||||
|  | ||||
| var RED = require(process.env.NODE_RED_HOME+"/red/red"); | ||||
| var PushOver = require('pushover-notifications'); | ||||
| var util = require('util'); | ||||
|  | ||||
| function PushoverNode(n) { | ||||
|     RED.nodes.createNode(this,n); | ||||
|     this.title = n.title; | ||||
|     this.priority = n.priority; | ||||
|     var credentials = RED.nodes.getCredentials(n.id); | ||||
|     if ((credentials) && (credentials.hasOwnProperty("pushkey"))) { this.pushkey = credentials.pushkey; } | ||||
|     else { this.error("No Pushover api token set"); } | ||||
|     if ((credentials) && (credentials.hasOwnProperty("deviceid"))) { this.deviceid = credentials.deviceid; } | ||||
|     else { this.error("No Pushover user key set"); } | ||||
|     var pusher = false; | ||||
|     if (this.pushkey && this.deviceid) { | ||||
|         pusher = new PushOver({ | ||||
|             user: this.deviceid, | ||||
|             token: this.pushkey, | ||||
|             onerror: function(err) { | ||||
|                 util.log('[57-pushover.js] Error: '+err); | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
|     var node = this; | ||||
|  | ||||
|     this.on("input",function(msg) { | ||||
|         var titl = this.title || msg.topic || "Node-RED"; | ||||
|         var pri = this.priority || msg.priority || 0; | ||||
|         if (isNaN(pri)) {pri=0;} | ||||
|         if (pri > 2) {pri = 2;} | ||||
|         if (pri < -1) {pri = -1;} | ||||
|         if (typeof(msg.payload) === 'object') { | ||||
|             msg.payload = JSON.stringify(msg.payload); | ||||
|         } | ||||
|         else { msg.payload = msg.payload.toString(); } | ||||
|         if (pusher) { | ||||
|             var pushmsg = { | ||||
|                 message: msg.payload, | ||||
|                 title: titl, | ||||
|                 priority: pri, | ||||
|                 retry: 30, | ||||
|                 expire: 600 | ||||
|             }; | ||||
|             //console.log("Sending",pushmsg); | ||||
|             pusher.send( pushmsg, function(err, response) { | ||||
|                 if (err) node.error("Pushover Error: "+err); | ||||
|                 //console.log(response); | ||||
|             }); | ||||
|         } | ||||
|         else { | ||||
|             node.warn("Pushover credentials not set."); | ||||
|         } | ||||
|     }); | ||||
| } | ||||
| RED.nodes.registerType("pushover",PushoverNode); | ||||
|  | ||||
| var querystring = require('querystring'); | ||||
|  | ||||
| RED.httpAdmin.get('/pushover/:id',function(req,res) { | ||||
|     var credentials = RED.nodes.getCredentials(req.params.id); | ||||
|     if (credentials) { | ||||
|         res.send(JSON.stringify({deviceid:credentials.deviceid,hasPassword:(credentials.pushkey&&credentials.pushkey!="")})); | ||||
|     } else { | ||||
|         res.send(JSON.stringify({})); | ||||
|     } | ||||
| }); | ||||
|  | ||||
| RED.httpAdmin.delete('/pushover/:id',function(req,res) { | ||||
|     RED.nodes.deleteCredentials(req.params.id); | ||||
|     res.send(200); | ||||
| }); | ||||
|  | ||||
| RED.httpAdmin.post('/pushover/: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.deviceid == null || newCreds.deviceid == "") { | ||||
|             delete credentials.deviceid; | ||||
|         } else { | ||||
|             credentials.deviceid = newCreds.deviceid; | ||||
|         } | ||||
|         if (newCreds.pushkey == "") { | ||||
|             delete credentials.pushkey; | ||||
|         } else { | ||||
|             credentials.pushkey = newCreds.pushkey||credentials.pushkey; | ||||
|         } | ||||
|         RED.nodes.addCredentials(req.params.id,credentials); | ||||
|         res.send(200); | ||||
|     }); | ||||
| }); | ||||
		Reference in New Issue
	
	Block a user