368 lines
15 KiB
JavaScript
368 lines
15 KiB
JavaScript
var fs = require('fs');
|
|
module.exports = function (s, config, lang, getSnapshot) {
|
|
const { getEventBasedRecordingUponCompletion } =
|
|
require('../events/utils.js')(s, config, lang);
|
|
|
|
if (config.pushover === true) {
|
|
const Pushover = require('pushover-notifications');
|
|
try {
|
|
const sendMessage = async function (sendBody, files, groupKey) {
|
|
var pushover = s.group[groupKey].pushover;
|
|
if (!pushover) {
|
|
s.userLog(
|
|
{ ke: groupKey, mid: '$USER' },
|
|
{
|
|
type: lang.NotifyErrorText,
|
|
msg: lang.DiscordNotEnabledText,
|
|
}
|
|
);
|
|
return;
|
|
}
|
|
if (pushover && pushover.send) {
|
|
try {
|
|
var msg = {
|
|
// These values correspond to the parameters detailed on https://pushover.net/api
|
|
// 'message' is required. All other values are optional.
|
|
message: sendBody.description, // required
|
|
title: 'Shinobi: ' + sendBody.title,
|
|
sound: 'siren',
|
|
// we do not support devices here. use group identifiers instead.
|
|
// device: 'devicename',
|
|
priority: 1,
|
|
};
|
|
if (files.length > 0) {
|
|
// sadly pushover allows only ONE single attachment
|
|
msg.file = {
|
|
name: files[0].name,
|
|
data: files[0].attachment,
|
|
};
|
|
}
|
|
pushover.send(msg, function (err, result) {
|
|
if (err) {
|
|
throw err;
|
|
}
|
|
console.log(result);
|
|
});
|
|
} catch (err) {
|
|
s.userLog(
|
|
{ ke: groupKey, mid: '$USER' },
|
|
{ type: lang.NotifyErrorText, msg: err }
|
|
);
|
|
}
|
|
} else {
|
|
s.userLog(
|
|
{
|
|
ke: groupKey,
|
|
mid: '$USER',
|
|
},
|
|
{
|
|
type: lang.NotifyErrorText,
|
|
msg: lang['Check the Recipient ID'],
|
|
}
|
|
);
|
|
}
|
|
};
|
|
|
|
const loadPushoverForUser = function (user) {
|
|
const userDetails = s.parseJSON(user.details);
|
|
if (
|
|
!s.group[user.ke].pushover &&
|
|
config.pushover === true &&
|
|
userDetails.pushover === '1' &&
|
|
userDetails.pushover_token !== '' &&
|
|
userDetails.pushover_recipient_identifier !== ''
|
|
) {
|
|
s.group[user.ke].pushover = new Pushover({
|
|
user: userDetails.pushover_recipient_identifier,
|
|
token: userDetails.pushover_token,
|
|
});
|
|
}
|
|
};
|
|
|
|
const unloadPushoverForUser = function (user) {
|
|
if (
|
|
s.group[user.ke].pushover &&
|
|
s.group[user.ke].pushover.destroy
|
|
) {
|
|
s.group[user.ke].pushover.destroy();
|
|
}
|
|
delete s.group[user.ke].pushover;
|
|
};
|
|
|
|
const onTwoFactorAuthCodeNotificationForPushover = function (r) {
|
|
// r = user
|
|
if (r.details.factor_pushover === '1') {
|
|
sendMessage(
|
|
{
|
|
title: r.lang['Enter this code to proceed'],
|
|
description:
|
|
'**' +
|
|
s.factorAuth[r.ke][r.uid].key +
|
|
'** ' +
|
|
r.lang.FactorAuthText1,
|
|
},
|
|
[],
|
|
r.ke
|
|
);
|
|
}
|
|
};
|
|
|
|
const onEventTriggerForPushover = async (d, filter) => {
|
|
const monitorConfig =
|
|
s.group[d.ke].rawMonitorConfigurations[d.id];
|
|
// d = event object
|
|
if (
|
|
s.group[d.ke].pushover &&
|
|
(filter.pushover || monitorConfig.details.notify_pushover === '1') &&
|
|
!s.group[d.ke].activeMonitors[d.id].detector_pushover
|
|
) {
|
|
var detector_pushover_timeout;
|
|
if (
|
|
!monitorConfig.details.detector_pushover_timeout ||
|
|
monitorConfig.details.detector_pushover_timeout === ''
|
|
) {
|
|
detector_pushover_timeout = 1000 * 60 * 10;
|
|
} else {
|
|
detector_pushover_timeout =
|
|
parseFloat(
|
|
monitorConfig.details.detector_pushover_timeout
|
|
) *
|
|
1000 *
|
|
60;
|
|
}
|
|
s.group[d.ke].activeMonitors[d.id].detector_pushover =
|
|
setTimeout(function () {
|
|
clearTimeout(
|
|
s.group[d.ke].activeMonitors[d.id]
|
|
.detector_pushover
|
|
);
|
|
s.group[d.ke].activeMonitors[
|
|
d.id
|
|
].detector_pushover = null;
|
|
}, detector_pushover_timeout);
|
|
await getSnapshot(d, monitorConfig);
|
|
if (d.screenshotBuffer) {
|
|
sendMessage(
|
|
{
|
|
title: lang.Event + ' - ' + d.screenshotName,
|
|
description:
|
|
lang.EventText1 + ' ' + d.currentTimestamp,
|
|
},
|
|
[
|
|
{
|
|
type: 'photo',
|
|
attachment: d.screenshotBuffer,
|
|
name: d.screenshotName + '.jpg',
|
|
},
|
|
],
|
|
d.ke
|
|
);
|
|
}
|
|
}
|
|
};
|
|
|
|
const onEventTriggerBeforeFilterForPushover = function (d, filter) {
|
|
filter.pushover = false;
|
|
};
|
|
|
|
const onDetectorNoTriggerTimeoutForPushover = function (e) {
|
|
//e = monitor object
|
|
var currentTime = new Date();
|
|
if (e.details.detector_notrigger_pushover === '1') {
|
|
var html =
|
|
'*' +
|
|
lang.NoMotionEmailText2 +
|
|
' ' +
|
|
(e.details.detector_notrigger_timeout || 10) +
|
|
' ' +
|
|
lang.minutes +
|
|
'.*\n';
|
|
html +=
|
|
'**' + lang['Monitor Name'] + '** : ' + e.name + '\n';
|
|
html += '**' + lang['Monitor ID'] + '** : ' + e.id + '\n';
|
|
html += currentTime;
|
|
sendMessage(
|
|
{
|
|
title: lang['"No Motion" Detector'],
|
|
description: html,
|
|
},
|
|
[],
|
|
e.ke
|
|
);
|
|
}
|
|
};
|
|
|
|
const onMonitorUnexpectedExitForPushover = (monitorConfig) => {
|
|
if (
|
|
monitorConfig.details.notify_pushover === '1' &&
|
|
monitorConfig.details.notify_onUnexpectedExit === '1'
|
|
) {
|
|
const ffmpegCommand =
|
|
s.group[monitorConfig.ke].activeMonitors[
|
|
monitorConfig.mid
|
|
].ffmpeg;
|
|
const description =
|
|
lang['Process Crashed for Monitor'] +
|
|
'\n' +
|
|
ffmpegCommand;
|
|
const currentTime = new Date();
|
|
sendMessage(
|
|
{
|
|
title:
|
|
lang['Process Unexpected Exit'] +
|
|
' : ' +
|
|
monitorConfig.name,
|
|
description: description,
|
|
},
|
|
[],
|
|
monitorConfig.ke
|
|
);
|
|
}
|
|
};
|
|
|
|
s.loadGroupAppExtender(loadPushoverForUser);
|
|
s.unloadGroupAppExtender(unloadPushoverForUser);
|
|
s.onTwoFactorAuthCodeNotification(
|
|
onTwoFactorAuthCodeNotificationForPushover
|
|
);
|
|
s.onEventTrigger(onEventTriggerForPushover);
|
|
s.onEventTriggerBeforeFilter(onEventTriggerBeforeFilterForPushover);
|
|
s.onDetectorNoTriggerTimeout(onDetectorNoTriggerTimeoutForPushover);
|
|
s.onMonitorUnexpectedExit(onMonitorUnexpectedExitForPushover);
|
|
s.definitions['Monitor Settings'].blocks[
|
|
'Notifications'
|
|
].info[0].info.push({
|
|
name: 'detail=notify_pushover',
|
|
field: 'Pushover',
|
|
description: '',
|
|
default: '0',
|
|
example: '',
|
|
selector: 'h_det_pushover',
|
|
fieldType: 'select',
|
|
possible: [
|
|
{
|
|
name: lang.No,
|
|
value: '0',
|
|
},
|
|
{
|
|
name: lang.Yes,
|
|
value: '1',
|
|
},
|
|
],
|
|
});
|
|
s.definitions['Monitor Settings'].blocks['Notifications'].info.push(
|
|
{
|
|
evaluation: "$user.details.use_pushover !== '0'",
|
|
isFormGroupGroup: true,
|
|
name: 'Pushover',
|
|
color: 'blue',
|
|
'section-class': 'h_det_pushover_input h_det_pushover_1',
|
|
info: [
|
|
{
|
|
name: 'detail=detector_pushover_timeout',
|
|
field:
|
|
lang['Allow Next Alert'] +
|
|
` (${lang['on Event']})`,
|
|
description: '',
|
|
default: '10',
|
|
example: '',
|
|
possible: '',
|
|
},
|
|
],
|
|
}
|
|
);
|
|
s.definitions['Account Settings'].blocks[
|
|
'2-Factor Authentication'
|
|
].info.push({
|
|
name: 'detail=factor_pushover',
|
|
field: 'Pushover',
|
|
default: '1',
|
|
example: '',
|
|
fieldType: 'select',
|
|
possible: [
|
|
{
|
|
name: lang.No,
|
|
value: '0',
|
|
},
|
|
{
|
|
name: lang.Yes,
|
|
value: '1',
|
|
},
|
|
],
|
|
});
|
|
s.definitions['Account Settings'].blocks['Pushover'] = {
|
|
evaluation: "$user.details.use_pushover !== '0'",
|
|
name: 'Pushover',
|
|
color: 'blue',
|
|
info: [
|
|
{
|
|
name: 'detail=pushover',
|
|
selector: 'u_pushover',
|
|
field: lang.Enabled,
|
|
default: '0',
|
|
example: '',
|
|
fieldType: 'select',
|
|
possible: [
|
|
{
|
|
name: lang.No,
|
|
value: '0',
|
|
},
|
|
{
|
|
name: lang.Yes,
|
|
value: '1',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
hidden: true,
|
|
name: 'detail=pushover_token',
|
|
fieldType: 'password',
|
|
placeholder: 'azGDORePK8gMaC0QOYAMyEEuzJnyUi',
|
|
field: lang.Token,
|
|
'form-group-class': 'u_pushover_input u_pushover_1',
|
|
description: '',
|
|
default: '',
|
|
example: '',
|
|
possible: '',
|
|
},
|
|
{
|
|
hidden: true,
|
|
name: 'detail=pushover_recipient_identifier',
|
|
placeholder: 'uQiRzpo4DXghDmr9QzzfQu27cmVRsG',
|
|
field: lang['Recipient ID'],
|
|
'form-group-class': 'u_pushover_input u_pushover_1',
|
|
description: '',
|
|
default: '',
|
|
example: '',
|
|
possible: '',
|
|
},
|
|
],
|
|
};
|
|
s.definitions["Event Filters"].blocks["Action for Selected"].info.push({
|
|
"name": "actions=pushover",
|
|
"field": lang['Pushover'],
|
|
"fieldType": "select",
|
|
"form-group-class": "actions-row",
|
|
"default": "",
|
|
"example": "1",
|
|
"possible": [
|
|
{
|
|
"name": lang['Original Choice'],
|
|
"value": "",
|
|
"selected": true
|
|
},
|
|
{
|
|
"name": lang.Yes,
|
|
"value": "1",
|
|
}
|
|
]
|
|
})
|
|
} catch (err) {
|
|
console.log(err);
|
|
console.log(
|
|
'Could not start pushover notifications, please run "npm install pushover-notifications" inside the Shinobi folder.'
|
|
);
|
|
}
|
|
}
|
|
};
|