2018-11-13 05:03:28 +00:00
|
|
|
/* jslint node: true */
|
|
|
|
'use strict';
|
|
|
|
|
|
|
|
// ENiGMA½
|
|
|
|
const Art = require('./art.js');
|
|
|
|
const {
|
|
|
|
getActiveConnections
|
|
|
|
} = require('./client_connections.js');
|
|
|
|
const ANSI = require('./ansi_term.js');
|
2018-11-14 04:11:33 +00:00
|
|
|
const { pipeToAnsi } = require('./color_codes.js');
|
2018-11-13 05:03:28 +00:00
|
|
|
|
|
|
|
// deps
|
|
|
|
const _ = require('lodash');
|
|
|
|
|
|
|
|
module.exports = class UserInterruptQueue
|
|
|
|
{
|
|
|
|
constructor(client) {
|
|
|
|
this.client = client;
|
|
|
|
this.queue = [];
|
|
|
|
}
|
|
|
|
|
2018-12-01 06:20:44 +00:00
|
|
|
static queue(interruptItem, opts) {
|
|
|
|
opts = opts || {};
|
|
|
|
if(!opts.clients) {
|
|
|
|
let omitNodes = [];
|
|
|
|
if(Array.isArray(opts.omit)) {
|
|
|
|
omitNodes = opts.omit;
|
|
|
|
} else if(opts.omit) {
|
|
|
|
omitNodes = [ opts.omit ];
|
|
|
|
}
|
|
|
|
omitNodes = omitNodes.map(n => _.isNumber(n) ? n : n.node);
|
|
|
|
opts.clients = getActiveConnections(true).filter(ac => !omitNodes.includes(ac.node));
|
|
|
|
}
|
|
|
|
if(!Array.isArray(opts.clients)) {
|
|
|
|
opts.clients = [ opts.clients ];
|
|
|
|
}
|
|
|
|
opts.clients.forEach(c => {
|
|
|
|
c.interruptQueue.queueItem(interruptItem);
|
2018-11-13 05:03:28 +00:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
queueItem(interruptItem) {
|
2018-11-14 04:11:33 +00:00
|
|
|
if(!_.isString(interruptItem.contents) && !_.isString(interruptItem.text)) {
|
|
|
|
return;
|
|
|
|
}
|
2018-11-15 05:47:20 +00:00
|
|
|
|
|
|
|
// pause defaulted on
|
2018-11-13 05:03:28 +00:00
|
|
|
interruptItem.pause = _.get(interruptItem, 'pause', true);
|
2018-11-15 05:47:20 +00:00
|
|
|
|
|
|
|
this.client.currentMenuModule.attemptInterruptNow(interruptItem, (err, ateIt) => {
|
|
|
|
if(err) {
|
|
|
|
// :TODO: Log me
|
|
|
|
} else if(true !== ateIt) {
|
|
|
|
this.queue.push(interruptItem);
|
|
|
|
}
|
|
|
|
});
|
2018-11-13 05:03:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
hasItems() {
|
|
|
|
return this.queue.length > 0;
|
|
|
|
}
|
|
|
|
|
2018-12-01 06:20:44 +00:00
|
|
|
displayNext(options, cb) {
|
|
|
|
if(!cb && _.isFunction(options)) {
|
|
|
|
cb = options;
|
|
|
|
options = {};
|
|
|
|
}
|
2018-11-13 05:03:28 +00:00
|
|
|
const interruptItem = this.queue.pop();
|
|
|
|
if(!interruptItem) {
|
|
|
|
return cb(null);
|
|
|
|
}
|
|
|
|
|
2018-12-01 06:20:44 +00:00
|
|
|
Object.assign(interruptItem, options);
|
2018-11-15 05:04:29 +00:00
|
|
|
return interruptItem ? this.displayWithItem(interruptItem, cb) : cb(null);
|
|
|
|
}
|
|
|
|
|
|
|
|
displayWithItem(interruptItem, cb) {
|
2018-11-13 05:03:28 +00:00
|
|
|
if(interruptItem.cls) {
|
|
|
|
this.client.term.rawWrite(ANSI.clearScreen());
|
|
|
|
} else {
|
|
|
|
this.client.term.rawWrite('\r\n\r\n');
|
|
|
|
}
|
|
|
|
|
2018-11-14 04:11:33 +00:00
|
|
|
if(interruptItem.contents) {
|
|
|
|
Art.display(this.client, interruptItem.contents, err => {
|
2018-11-15 05:47:20 +00:00
|
|
|
if(err) {
|
|
|
|
return cb(err);
|
|
|
|
}
|
|
|
|
//this.client.term.rawWrite('\r\n\r\n'); // :TODO: Prob optional based on contents vs text
|
|
|
|
this.client.currentMenuModule.pausePrompt( () => {
|
|
|
|
return cb(null);
|
|
|
|
});
|
2018-11-14 04:11:33 +00:00
|
|
|
});
|
|
|
|
} else {
|
|
|
|
return this.client.term.write(pipeToAnsi(`${interruptItem.text}\r\n\r\n`, this.client), cb);
|
|
|
|
}
|
2018-11-13 05:03:28 +00:00
|
|
|
}
|
|
|
|
};
|