/* jslint node: true */ 'use strict'; // ENiGMA½ const Art = require('./art.js'); const { getActiveConnections } = require('./client_connections.js'); const ANSI = require('./ansi_term.js'); const { pipeToAnsi } = require('./color_codes.js'); // deps const _ = require('lodash'); module.exports = class UserInterruptQueue { constructor(client) { this.client = client; this.queue = []; } 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); }); } queueItem(interruptItem) { if(!_.isString(interruptItem.contents) && !_.isString(interruptItem.text)) { return; } // pause defaulted on interruptItem.pause = _.get(interruptItem, 'pause', true); try { this.client.currentMenuModule.attemptInterruptNow(interruptItem, (err, ateIt) => { if(err) { // :TODO: Log me } else if(true !== ateIt) { this.queue.push(interruptItem); } }); } catch(e) { this.queue.push(interruptItem); } } hasItems() { return this.queue.length > 0; } displayNext(options, cb) { if(!cb && _.isFunction(options)) { cb = options; options = {}; } const interruptItem = this.queue.pop(); if(!interruptItem) { return cb(null); } Object.assign(interruptItem, options); return interruptItem ? this.displayWithItem(interruptItem, cb) : cb(null); } displayWithItem(interruptItem, cb) { if(interruptItem.cls) { this.client.term.rawWrite(ANSI.resetScreen()); } else { this.client.term.rawWrite('\r\n\r\n'); } const maybePauseAndFinish = () => { if(interruptItem.pause) { this.client.currentMenuModule.pausePrompt( () => { return cb(null); }); } else { return cb(null); } }; if(interruptItem.contents) { Art.display(this.client, interruptItem.contents, err => { if(err) { return cb(err); } //this.client.term.rawWrite('\r\n\r\n'); // :TODO: Prob optional based on contents vs text maybePauseAndFinish(); }); } else { this.client.term.write(pipeToAnsi(`${interruptItem.text}\r\n\r\n`, this.client), true, () => { maybePauseAndFinish(); }); } } };