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.
156 lines
4.3 KiB
156 lines
4.3 KiB
/** |
|
* Wrapper for the notifu 1.6 (http://www.paralint.com/projects/notifu/) |
|
|
|
Usage |
|
/t <value> The type of message to display values are: |
|
info The message is an informational message |
|
warn The message is an warning message |
|
error The message is an error message |
|
/d <value> The number of milliseconds to display (omit or 0 for infinit) |
|
/p <value> The title (or prompt) of the ballon |
|
/m <value> The message text |
|
/i <value> Specify an icon to use ("parent" uses the icon of the parent process) |
|
/e Enable ballon tips in the registry (for this user only) |
|
/q Do not play a sound when the tooltip is displayed |
|
/w Show the tooltip even if the user is in the quiet period that follows his very first login (Windows 7 and up) |
|
/xp Use IUserNotification interface event when IUserNotification2 is available |
|
|
|
// Kill codes: |
|
2 = Timeout |
|
3 = Clicked |
|
4 = Closed or faded out |
|
|
|
*/ |
|
var path = require('path'); |
|
var notifier = path.resolve(__dirname, '../vendor/notifu/notifu'); |
|
var checkGrowl = require('../lib/checkGrowl'); |
|
var utils = require('../lib/utils'); |
|
var Toaster = require('./toaster'); |
|
var Growl = require('./growl'); |
|
var os = require('os'); |
|
|
|
var EventEmitter = require('events').EventEmitter; |
|
var util = require('util'); |
|
|
|
var hasGrowl = void 0; |
|
|
|
module.exports = WindowsBalloon; |
|
|
|
function WindowsBalloon(options) { |
|
options = utils.clone(options || {}); |
|
if (!(this instanceof WindowsBalloon)) { |
|
return new WindowsBalloon(options); |
|
} |
|
|
|
this.options = options; |
|
|
|
EventEmitter.call(this); |
|
} |
|
util.inherits(WindowsBalloon, EventEmitter); |
|
|
|
function noop() {} |
|
WindowsBalloon.prototype.notify = function(options, callback) { |
|
var fallback; |
|
var notifierOptions = this.options; |
|
options = utils.clone(options || {}); |
|
callback = callback || noop; |
|
|
|
if (typeof options === 'string') { |
|
options = { title: 'node-notifier', message: options }; |
|
} |
|
|
|
var actionJackedCallback = utils.actionJackerDecorator( |
|
this, |
|
options, |
|
callback, |
|
function(data) { |
|
if (data === 'activate') { |
|
return 'click'; |
|
} |
|
if (data === 'timeout') { |
|
return 'timeout'; |
|
} |
|
return false; |
|
} |
|
); |
|
|
|
if (!!this.options.withFallback && utils.isWin8()) { |
|
fallback = fallback || new Toaster(notifierOptions); |
|
return fallback.notify(options, callback); |
|
} |
|
|
|
if ( |
|
!!this.options.withFallback && |
|
(!utils.isLessThanWin8() || hasGrowl === true) |
|
) { |
|
fallback = fallback || new Growl(notifierOptions); |
|
return fallback.notify(options, callback); |
|
} |
|
|
|
if (!this.options.withFallback || hasGrowl === false) { |
|
doNotification(options, notifierOptions, actionJackedCallback); |
|
return this; |
|
} |
|
|
|
checkGrowl(notifierOptions, function(_, hasGrowlResult) { |
|
hasGrowl = hasGrowlResult; |
|
|
|
if (hasGrowl) { |
|
fallback = fallback || new Growl(notifierOptions); |
|
return fallback.notify(options, callback); |
|
} |
|
|
|
doNotification(options, notifierOptions, actionJackedCallback); |
|
}); |
|
|
|
return this; |
|
}; |
|
|
|
var allowedArguments = ['t', 'd', 'p', 'm', 'i', 'e', 'q', 'w', 'xp']; |
|
|
|
function doNotification(options, notifierOptions, callback) { |
|
var is64Bit = os.arch() === 'x64'; |
|
options = options || {}; |
|
options = utils.mapToNotifu(options); |
|
options.p = options.p || 'Node Notification:'; |
|
|
|
var fullNotifierPath = notifier + (is64Bit ? '64' : '') + '.exe'; |
|
var localNotifier = notifierOptions.customPath || fullNotifierPath; |
|
|
|
if (!options.m) { |
|
callback(new Error('Message is required.')); |
|
return this; |
|
} |
|
|
|
var argsList = utils.constructArgumentList(options, { |
|
wrapper: '', |
|
noEscape: true, |
|
explicitTrue: true, |
|
allowedArguments: allowedArguments |
|
}); |
|
|
|
if (options.wait) { |
|
return utils.fileCommand(localNotifier, argsList, function(error, data) { |
|
var action = fromErrorCodeToAction(error.code); |
|
if (action === 'error') return callback(error, data); |
|
|
|
return callback(null, action); |
|
}); |
|
} |
|
utils.immediateFileCommand(localNotifier, argsList, callback); |
|
} |
|
|
|
function fromErrorCodeToAction(errorCode) { |
|
switch (errorCode) { |
|
case 2: |
|
return 'timeout'; |
|
case 3: |
|
case 6: |
|
case 7: |
|
return 'activate'; |
|
case 4: |
|
return 'close'; |
|
default: |
|
return 'error'; |
|
} |
|
}
|
|
|