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