diff --git a/social/pushover/57-pushover.html b/social/pushover/57-pushover.html index 6ef780fc..4f8721d6 100644 --- a/social/pushover/57-pushover.html +++ b/social/pushover/57-pushover.html @@ -79,6 +79,7 @@

msg.topic: set the title

msg.device: set the device

msg.priority: set the priority

+

msg.attachment: attach an image (Buffer or file path)

msg.url: to add a web address

msg.url_title: to add a url title if not already set in the properties

msg.sound: set the notification sound, see the available options

diff --git a/social/pushover/57-pushover.js b/social/pushover/57-pushover.js index 9e879263..f32ff8cb 100644 --- a/social/pushover/57-pushover.js +++ b/social/pushover/57-pushover.js @@ -3,6 +3,7 @@ module.exports = function(RED) { "use strict"; var PushOver = require('pushover-notifications'); var util = require('util'); + var fs = require('fs'); function PushoverNode(n) { RED.nodes.createNode(this,n); @@ -30,13 +31,14 @@ module.exports = function(RED) { var node = this; this.on("input",function(msg) { - var titl = this.title || msg.topic || "Node-RED"; - var pri = this.priority || msg.priority || 0; - var dev = this.device || msg.device; - var sound = this.sound || msg.sound || null; - var url = this.url || msg.url || null; - var url_title = this.url_title || msg.url_title || null; - var html = this.html || false; + var title = node.title || msg.topic || "Node-RED"; + var pri = node.priority || msg.priority || 0; + var dev = node.device || msg.device; + var sound = node.sound || msg.sound || null; + var url = node.url || msg.url || null; + var url_title = node.url_title || msg.url_title || null; + var html = node.html || false; + var attachment = msg.attachment || null; if (isNaN(pri)) {pri=0;} if (pri > 2) {pri = 2;} if (pri < -2) {pri = -2;} @@ -47,7 +49,7 @@ module.exports = function(RED) { if (pusher) { var pushmsg = { message: msg.payload, - title: titl, + title: title, priority: pri, retry: 30, expire: 600, @@ -58,16 +60,50 @@ module.exports = function(RED) { if (typeof(url) === 'string') { pushmsg.url = url; } if (typeof(url_title) === 'string') { pushmsg.url_title = url_title; } if (html) { pushmsg.html = 1; } - //node.log("Sending "+JSON.stringify(pushmsg)); - pusher.send( pushmsg, function(err, response) { - if (err) { node.error("Pushover Error: "+err); } - //console.log(response); - }); + if (typeof(attachment) === 'string') { + // Treat attachment as a path + fs.readFile(attachment,function(err, data) { + if (err) { + node.error("[57-pushover.js] Error: File Read Error: "+err); + return; + } + pushmsg.file = { data: data }; + pushMessage(pushmsg); + }); + return; + } + else if (attachment instanceof Buffer) { + // Is it base64 encoded or binary? + var attachmentString = attachment.toString(); + var attachmentBuffer = Buffer.from(attachmentString,'base64'); + if(attachmentString === attachmentBuffer.toString('base64')) { + // If converts back to same, then it was base64 so set to binary + // https://stackoverflow.com/a/48770228 + attachment = attachmentBuffer; + } + // Unset these temporary values + attachmentBuffer = attachmentString = undefined; + // attach the buffer + pushmsg.file = { data: attachment }; + } + else if (attachment) { + node.error("[57-pushover.js] Error: attachment property must be a path to a local file or a Buffer containing an image"); + return; + } + pushMessage(pushmsg); } else { node.warn("Pushover credentials not set."); } }); + + function pushMessage(pushmsg) { + pusher.send( pushmsg, function(err, response) { + if (err) { node.error("[57-pushover.js] Error: "+err); } + response = JSON.parse(response); + if (response.status !== 1) { node.error("[57-pushover.js] Error: "+response); } + }); + } } RED.nodes.registerType("pushover",PushoverNode,{ credentials: { diff --git a/social/pushover/README.md b/social/pushover/README.md index 158ccae7..fd948db6 100644 --- a/social/pushover/README.md +++ b/social/pushover/README.md @@ -21,6 +21,7 @@ Optionally uses `msg.topic` to set the configuration, if not already set in the - `msg.device`: to set the device - `msg.priority`: to set the priority - `msg.topic`: to set the title + - `msg.attachment`: to specify an image to attach to message (path as a string or Buffer containing image) - `msg.url`: to add a web address - `msg.url_title`: to add a url title - `msg.sound`: to set the alert sound, see the [available options](https://pushover.net/api#sounds) diff --git a/social/pushover/package.json b/social/pushover/package.json index ccc56b22..60ab9743 100644 --- a/social/pushover/package.json +++ b/social/pushover/package.json @@ -1,9 +1,9 @@ { "name" : "node-red-node-pushover", - "version" : "0.0.13", + "version" : "0.0.14", "description" : "A Node-RED node to send alerts via Pushover", "dependencies" : { - "pushover-notifications" : "~0.2.4" + "pushover-notifications" : "^1.2.0" }, "repository" : { "type":"git", @@ -20,5 +20,12 @@ "name": "Dave Conway-Jones", "email": "ceejay@vnet.ibm.com", "url": "http://nodered.org" - } + }, + "contributors": [ + { + "name": "Damien Clark", + "email": "damo.clarky@gmail.com", + "url": "https://damos.world" + } + ] }