157 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			157 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * 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';
 | |
|   }
 | |
| }
 |