This app provides monitoring and information features for the common freifunk user and the technical stuff of a freifunk community.
Code base is taken from a TUM Practical Course project and added here to see if Freifunk Altdorf can use it.
https://www.freifunk-altdorf.de
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
2.4 KiB
100 lines
2.4 KiB
/** |
|
* Wrapper for the toaster (https://github.com/nels-o/toaster) |
|
*/ |
|
var path = require('path'); |
|
var notifier = path.resolve(__dirname, '../vendor/snoreToast/SnoreToast.exe'); |
|
var utils = require('../lib/utils'); |
|
var Balloon = require('./balloon'); |
|
|
|
var EventEmitter = require('events').EventEmitter; |
|
var util = require('util'); |
|
|
|
var fallback = void 0; |
|
|
|
module.exports = WindowsToaster; |
|
|
|
function WindowsToaster(options) { |
|
options = utils.clone(options || {}); |
|
if (!(this instanceof WindowsToaster)) { |
|
return new WindowsToaster(options); |
|
} |
|
|
|
this.options = options; |
|
|
|
EventEmitter.call(this); |
|
} |
|
util.inherits(WindowsToaster, EventEmitter); |
|
|
|
function noop() {} |
|
|
|
var timeoutMessage = 'the toast has timed out'; |
|
var successMessage = 'user clicked on the toast'; |
|
|
|
function hasText(str, txt) { |
|
return str && str.indexOf(txt) !== -1; |
|
} |
|
|
|
WindowsToaster.prototype.notify = function(options, callback) { |
|
options = utils.clone(options || {}); |
|
callback = callback || noop; |
|
|
|
if (typeof options === 'string') { |
|
options = { title: 'node-notifier', message: options }; |
|
} |
|
|
|
if (typeof callback !== 'function') { |
|
throw new TypeError( |
|
'The second argument must be a function callback. You have passed ' + |
|
typeof fn |
|
); |
|
} |
|
|
|
var actionJackedCallback = utils.actionJackerDecorator( |
|
this, |
|
options, |
|
function cb(err, data) { |
|
// Needs to filter out timeout. Not an actual error. |
|
if (err && hasText(data, timeoutMessage)) { |
|
return callback(null, data); |
|
} |
|
callback(err, data); |
|
}, |
|
function mapper(data) { |
|
if (hasText(data, successMessage)) { |
|
return 'click'; |
|
} |
|
if (hasText(data, timeoutMessage)) { |
|
return 'timeout'; |
|
} |
|
return false; |
|
} |
|
); |
|
|
|
options.title = options.title || 'Node Notification:'; |
|
if ( |
|
typeof options.message === 'undefined' && |
|
typeof options.close === 'undefined' |
|
) { |
|
callback(new Error('Message or ID to close is required.')); |
|
return this; |
|
} |
|
|
|
if (!utils.isWin8() && !!this.options.withFallback) { |
|
fallback = fallback || new Balloon(this.options); |
|
return fallback.notify(options, callback); |
|
} |
|
|
|
options = utils.mapToWin8(options); |
|
var argsList = utils.constructArgumentList(options, { |
|
explicitTrue: true, |
|
wrapper: '', |
|
keepNewlines: true, |
|
noEscape: true |
|
}); |
|
utils.fileCommand( |
|
this.options.customPath || notifier, |
|
argsList, |
|
actionJackedCallback |
|
); |
|
return this; |
|
};
|
|
|