forked from node-red/node-red-nodes
-
Notifications
You must be signed in to change notification settings - Fork 0
/
57-pushover.js
144 lines (140 loc) · 6.04 KB
/
57-pushover.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
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);
this.title = n.title;
this.device = n.device;
this.priority = n.priority;
this.sound = n.sound;
this.html = n.html;
if (this.sound === '') { this.sound = null; }
var credentials = this.credentials;
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 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 || msg.html || false;
var attachment = msg.attachment || null;
var retry = msg.retry || 30;
var expire = msg.expire || 600;
var callback = msg.callback || null;
var tags = msg.tags || null;
if (isNaN(pri)) {pri=0;}
if (pri > 2) {pri = 2;}
if (pri < -2) {pri = -2;}
if (isNaN(retry)) {
retry = 30;
node.warn("No valid number for retry found, using default 30s retry interval");
}
if (isNaN(expire)) {
expire = 600;
node.warn("No valid number for expire time found, using default 600s retry duration");
}
if (retry < 30) {
retry = 30;
node.warn("Retry interval too low, using minimal 30s retry interval");
}
if (expire > 10800) {
expire = 10800;
node.warn("Expire time too high, using maximum setting of 10800s (3 hours) retry duration");
}
if (typeof msg.payload === 'undefined') { msg.payload = "(undefined msg.payload)"; }
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: title,
priority: pri,
retry: retry,
expire: expire,
html: html
};
if (dev) { pushmsg.device = dev; }
if (typeof(sound) === 'string') { pushmsg.sound = sound; }
if (typeof(url) === 'string') { pushmsg.url = url; }
if (typeof(url_title) === 'string') { pushmsg.url_title = url_title; }
if (typeof(callback) === 'string') { pushmsg.callback = callback; }
if (typeof(tags) === 'string') { pushmsg.tags = tags; }
if (html) { pushmsg.html = 1; }
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,msg);
}
else {
node.warn("Pushover credentials not set.");
}
});
function pushMessage(pushmsg,msg) {
pusher.send( pushmsg, function(err, response) {
if (err) { node.error(err,msg); }
else {
try {
var responseObject = JSON.parse(response);
if (responseObject.status !== 1) { node.error("[57-pushover.js] Error: "+response); }
}
catch(e) {
node.error("[57-pushover.js] Error: "+response);
}
}
});
}
}
RED.nodes.registerType("pushover",PushoverNode,{
credentials: {
deviceid: {type:"text"},
pushkey: {type: "password"}
}
});
}