You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
2.3 KiB
JavaScript
102 lines
2.3 KiB
JavaScript
/**
|
|
* Node.js wrapper for "notify-send".
|
|
*/
|
|
var os = require('os');
|
|
var which = require('which');
|
|
var utils = require('../lib/utils');
|
|
|
|
var EventEmitter = require('events').EventEmitter;
|
|
var util = require('util');
|
|
|
|
var notifier = 'notify-send';
|
|
var hasNotifier;
|
|
|
|
module.exports = NotifySend;
|
|
|
|
function NotifySend(options) {
|
|
options = utils.clone(options || {});
|
|
if (!(this instanceof NotifySend)) {
|
|
return new NotifySend(options);
|
|
}
|
|
|
|
this.options = options;
|
|
|
|
EventEmitter.call(this);
|
|
}
|
|
util.inherits(NotifySend, EventEmitter);
|
|
|
|
function noop() {}
|
|
function notifyRaw(options, callback) {
|
|
options = utils.clone(options || {});
|
|
callback = callback || noop;
|
|
|
|
if (typeof callback !== 'function') {
|
|
throw new TypeError(
|
|
'The second argument must be a function callback. You have passed ' +
|
|
typeof callback
|
|
);
|
|
}
|
|
|
|
if (typeof options === 'string') {
|
|
options = { title: 'node-notifier', message: options };
|
|
}
|
|
|
|
if (!options.message) {
|
|
callback(new Error('Message is required.'));
|
|
return this;
|
|
}
|
|
|
|
if (os.type() !== 'Linux' && !os.type().match(/BSD$/)) {
|
|
callback(new Error('Only supported on Linux and *BSD systems'));
|
|
return this;
|
|
}
|
|
|
|
if (hasNotifier === false) {
|
|
callback(new Error('notify-send must be installed on the system.'));
|
|
return this;
|
|
}
|
|
|
|
if (hasNotifier || !!this.options.suppressOsdCheck) {
|
|
doNotification(options, callback);
|
|
return this;
|
|
}
|
|
|
|
try {
|
|
hasNotifier = !!which.sync(notifier);
|
|
doNotification(options, callback);
|
|
} catch (err) {
|
|
hasNotifier = false;
|
|
return callback(err);
|
|
}
|
|
|
|
return this;
|
|
}
|
|
|
|
Object.defineProperty(NotifySend.prototype, 'notify', {
|
|
get: function() {
|
|
if (!this._notify) this._notify = notifyRaw.bind(this);
|
|
return this._notify;
|
|
}
|
|
});
|
|
|
|
var allowedArguments = ['urgency', 'expire-time', 'icon', 'category', 'hint', 'app-name'];
|
|
|
|
function doNotification(options, callback) {
|
|
var initial, argsList;
|
|
|
|
options = utils.mapToNotifySend(options);
|
|
options.title = options.title || 'Node Notification:';
|
|
|
|
initial = [options.title, options.message];
|
|
delete options.title;
|
|
delete options.message;
|
|
|
|
argsList = utils.constructArgumentList(options, {
|
|
initial: initial,
|
|
keyExtra: '-',
|
|
allowedArguments: allowedArguments
|
|
});
|
|
|
|
utils.command(notifier, argsList, callback);
|
|
}
|