From ff616c384fddf4052a5d96658a7a868210858333 Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Thu, 13 Oct 2022 22:43:41 -0600 Subject: [PATCH] MenuModule.setConfigWithExtraArgs() --- core/goldmine.js | 141 ++++++++++++++++++++++++++++++++++++++++++++ core/menu_module.js | 6 ++ 2 files changed, 147 insertions(+) create mode 100644 core/goldmine.js diff --git a/core/goldmine.js b/core/goldmine.js new file mode 100644 index 00000000..7959f6a9 --- /dev/null +++ b/core/goldmine.js @@ -0,0 +1,141 @@ +/* jslint node: true */ +'use strict'; + +// enigma-bbs +const { MenuModule } = require('../core/menu_module'); +const { resetScreen } = require('../core/ansi_term'); +const { Errors } = require('../core/enig_error'); +const { trackDoorRunBegin, trackDoorRunEnd } = require('./door_util'); + +// deps +const async = require('async'); +const _ = require('lodash'); +const RLogin = require('rlogin'); + +exports.moduleInfo = { + name: 'gOLD mINE', + desc: 'gOLD mINE Community Door Server Module', + author: 'NuSkooler', +}; + +exports.getModule = class GoldmineModule extends MenuModule { + constructor(options) { + super(options); + + this.setConfigWithExtraArgs(options); + + // http://goldminebbs.com/ + this.config.host = this.config.host || '165.232.153.209'; + this.config.rloginPort = this.config.rloginPort || 513; + } + + initSequence() { + let clientTerminated = false; + + async.series( + [ + callback => { + return this.validateConfigFields( + { + host: 'string', + rloginPort: 'number', + bbsTag: 'string', + }, + callback + ); + }, + callback => { + this.client.term.write(resetScreen()); + this.client.term.write('Connecting to gOLD mINE, please wait...\n'); + + const username = this.client.user.getSanitizedName(); + let doorTracking; + const rlogin = new RLogin({ + clientUsername: username, + serverUsername: `${this.config.bbsTag}${username}`, + host: this.config.host, + port: this.config.rloginPort, + terminalType: '', + terminalSpeed: '', + }); + + if ( + _.isString(this.config.directDoorCode) && + this.config.directDoorCode.length > 0 + ) { + rlogin.terminalType = `xtrn=${this.config.directDoorCode}`; + } + + const rloginSend = buffer => { + return rlogin.send(buffer); + }; + + let pipeRestored = false; + const restorePipeAndFinish = err => { + if (pipeRestored) { + return; + } + + pipeRestored = true; + + if (this.client.term.output) { + this.client.term.output.removeListener('data', rloginSend); + } + + if (doorTracking) { + trackDoorRunEnd(doorTracking); + } + + return callback(err); + }; + + rlogin.on('error', err => { + // Eat up RLogin error with terminalSpeed not being a number + if (err === 'RLogin: invalid terminalSpeed argument.') { + return; + } + + this.client.log.info( + `gOLD mINE rlogin client error: ${err.message || err}` + ); + return restorePipeAndFinish(err); + }); + + rlogin.on('disconnect', () => { + this.client.log.info('Disconnected from gOLD mINE'); + return restorePipeAndFinish(null); + }); + + rlogin.on('connect', connected => { + if (!connected) { + return callback( + Errors.General( + 'Failed to establish connection to gOLD mINE' + ) + ); + } + + this.client.log.info('Connected to CombatNet'); + this.client.term.output.on('data', rloginSend); + + doorTracking = trackDoorRunBegin(this.client); + }); + + rlogin.on('data', data => { + this.client.term.rawWrite(data); + }); + + // connect... + rlogin.connect(); + }, + ], + err => { + if (err) { + this.client.log.warn({ error: err.message }, 'gOLD mINE error'); + } + + this.prevMenu(); + } + ); + } +}; diff --git a/core/menu_module.js b/core/menu_module.js index ddcce17f..335c6e43 100644 --- a/core/menu_module.js +++ b/core/menu_module.js @@ -42,6 +42,12 @@ exports.MenuModule = class MenuModule extends PluginModule { } } + setConfigWithExtraArgs(options) { + this.config = Object.assign({}, _.get(options, 'menuConfig.config'), { + extraArgs: options.extraArgs, + }); + } + static get InterruptTypes() { return { Never: 'never',