142 lines
4.7 KiB
JavaScript
142 lines
4.7 KiB
JavaScript
/* 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 gOLD mINE');
|
|
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();
|
|
}
|
|
);
|
|
}
|
|
};
|