diff options
Diffstat (limited to '')
-rw-r--r-- | server/src/serverLib/CommandManager.js (renamed from server/src/managers/commands.js) | 5 | ||||
-rw-r--r-- | server/src/serverLib/ConfigManager.js | 89 | ||||
-rw-r--r-- | server/src/serverLib/CoreApp.js | 66 | ||||
-rw-r--r-- | server/src/serverLib/ImportsManager.js (renamed from server/src/managers/imports-manager.js) | 29 | ||||
-rw-r--r-- | server/src/serverLib/MainServer.js (renamed from server/src/core/server.js) | 8 | ||||
-rw-r--r-- | server/src/serverLib/RateLimiter.js (renamed from server/src/core/rateLimiter.js) | 6 | ||||
-rw-r--r-- | server/src/serverLib/StatsManager.js (renamed from server/src/managers/stats.js) | 10 | ||||
-rw-r--r-- | server/src/serverLib/index.js | 8 |
8 files changed, 178 insertions, 43 deletions
diff --git a/server/src/managers/commands.js b/server/src/serverLib/CommandManager.js index 434a16e..71c8884 100644 --- a/server/src/managers/commands.js +++ b/server/src/serverLib/CommandManager.js @@ -8,7 +8,6 @@ */ const path = require('path'); -const chalk = require('chalk'); const didYouMean = require('didyoumean2').default; class CommandManager { @@ -33,7 +32,7 @@ class CommandManager { const core = this.core; - const commandImports = core.managers.dynamicImports.getImport('src/commands'); + const commandImports = core.dynamicImports.getImport('src/commands'); let cmdErrors = ''; Object.keys(commandImports).forEach(file => { let command = commandImports[file]; @@ -61,7 +60,7 @@ class CommandManager { } if (!command.category) { - let base = path.join(this.core.managers.dynamicImports.base, 'commands'); + let base = path.join(this.core.dynamicImports.base, 'commands'); let category = 'Uncategorized'; if (file.indexOf(path.sep) > -1) { diff --git a/server/src/serverLib/ConfigManager.js b/server/src/serverLib/ConfigManager.js new file mode 100644 index 0000000..ebec050 --- /dev/null +++ b/server/src/serverLib/ConfigManager.js @@ -0,0 +1,89 @@ +/** + * Server configuration manager, handling loading, creation, parsing and saving + * of the main config.json file + * + * Version: v2.0.0 + * Developer: Marzavec ( https://github.com/marzavec ) + * License: WTFPL ( http://www.wtfpl.net/txt/copying/ ) + * + */ +const dateFormat = require('dateformat'); +const fse = require('fs-extra'); +const path = require('path'); + +class ConfigManager { + /** + * Create a `ConfigManager` instance for managing application settings + * + * @param {String} base executing directory name; __dirname + */ + constructor (base = __dirname) { + this.configPath = path.resolve(base, 'config/config.json'); + + if (!fse.existsSync(this.configPath)){ + fse.ensureFileSync(this.configPath); + } + } + + /** + * (Re)builds the config.json (main server config), or loads the config into mem + * if rebuilding, process will exit- this is to allow a process manager to take over + * + * @param {Boolean} reconfiguring set to true by `scripts/configure.js`, will exit if true + */ + async load () { + try { + this.config = fse.readJsonSync(this.configPath); + } catch (e) { + return false; + } + + return this.config; + } + + /** + * Creates backup of current config into configPath + * + */ + async backup () { + const backupPath = `${this.configPath}.${dateFormat('dd-mm-yy-HH-MM-ss')}.bak`; + fse.copySync(this.configPath, backupPath); + + return backupPath; + } + + /** + * First makes a backup of the current `config.json`, then writes current config + * to disk + * + */ + async save () { + const backupPath = await this.backup(); + + try { + fse.writeJSONSync(this.configPath, this.config); + fse.removeSync(backupPath); + + return true; + } catch (err) { + console.log(`Failed to save config file: ${err}`); + + return false; + } + } + + /** + * Updates current config[`key`] with `value` then writes changes to disk + * + * @param {*} key arbitrary configuration key + * @param {*} value new value to change `key` to + */ + async set (key, value) { + const realKey = `${key}`; + this.config[realKey] = value; + + return await this.save(); + } +} + +module.exports = ConfigManager; diff --git a/server/src/serverLib/CoreApp.js b/server/src/serverLib/CoreApp.js new file mode 100644 index 0000000..012ae44 --- /dev/null +++ b/server/src/serverLib/CoreApp.js @@ -0,0 +1,66 @@ +/** + * The core / global reference object + * + * Version: v2.0.0 + * Developer: Marzavec ( https://github.com/marzavec ) + * License: WTFPL ( http://www.wtfpl.net/txt/copying/ ) + * + */ + +const path = require('path'); +const { + CommandManager, + ConfigManager, + ImportsManager, + MainServer, + StatsManager +} = require('./'); + +class CoreApp { + /** + * Create the main core instance. + */ + constructor () { + + } + + async init () { + await this.buildConfigManager(); + + this.buildImportManager(); + this.buildCommandsManager(); + this.buildStatsManager(); + this.buildMainServer(); + } + + async buildConfigManager () { + this.configManager = new ConfigManager(path.join(__dirname, '../..')); + this.config = await this.configManager.load(); + + if (this.config === false) { + console.error('Missing config.json, have you run: npm run config'); + process.exit(0); + } + } + + buildImportManager () { + this.dynamicImports = new ImportsManager(path.join(__dirname, '../..')); + this.dynamicImports.init(); + } + + buildCommandsManager () { + this.commands = new CommandManager(this); + this.commands.loadCommands(); + } + + buildStatsManager () { + this.stats = new StatsManager(this); + this.stats.set('start-time', process.hrtime()); + } + + buildMainServer () { + this.server = new MainServer(this); + } +} + +module.exports = CoreApp; diff --git a/server/src/managers/imports-manager.js b/server/src/serverLib/ImportsManager.js index d8b2144..a049d5c 100644 --- a/server/src/managers/imports-manager.js +++ b/server/src/serverLib/ImportsManager.js @@ -14,24 +14,12 @@ class ImportsManager { /** * Create a `ImportsManager` instance for (re)loading classes and config * - * @param {Object} core reference to the global core object * @param {String} base executing directory name; __dirname */ - constructor (core, base) { - this._core = core; + constructor (base) { this._base = base; this._imports = {}; - this._optionalConfigs = {}; - } - - /** - * Pull core reference - * - * @type {Object} readonly - */ - get core () { - return this._core; } /** @@ -44,15 +32,6 @@ class ImportsManager { } /** - * Pull optional (none-core) config options - * - * @type {Object} - */ - get optionalConfigs () { - return Object.assign({}, this._optionalConfigs); - } - - /** * Initialize this class and start loading target directories * */ @@ -89,12 +68,6 @@ class ImportsManager { return errorText; } - if (imported.configs) { - imported.configs.forEach(config => { - this._optionalConfigs[config.name] = config; - }); - } - if (!this._imports[dirName]) { this._imports[dirName] = {}; } diff --git a/server/src/core/server.js b/server/src/serverLib/MainServer.js index 4132b55..628d8ab 100644 --- a/server/src/core/server.js +++ b/server/src/serverLib/MainServer.js @@ -12,10 +12,10 @@ const socketReady = require('ws').OPEN; const crypto = require('crypto'); const ipSalt = [...Array(Math.floor(Math.random()*128)+128)].map(i=>(~~(Math.random()*36)).toString(36)).join(''); const internalCmdKey = [...Array(Math.floor(Math.random()*128)+128)].map(i=>(~~(Math.random()*36)).toString(36)).join(''); -const Police = require('./rateLimiter'); +const RateLimiter = require('./RateLimiter'); const pulseSpeed = 16000; // ping all clients every X ms -class server extends wsServer { +class MainServer extends wsServer { /** * Create a HackChat server instance. * @@ -26,7 +26,7 @@ class server extends wsServer { this._core = core; this._hooks = {}; - this._police = new Police(); + this._police = new RateLimiter(); this._cmdBlacklist = {}; this._cmdKey = internalCmdKey; @@ -431,4 +431,4 @@ class server extends wsServer { } } -module.exports = server; +module.exports = MainServer; diff --git a/server/src/core/rateLimiter.js b/server/src/serverLib/RateLimiter.js index 0c2a384..87a1f3a 100644 --- a/server/src/core/rateLimiter.js +++ b/server/src/serverLib/RateLimiter.js @@ -8,7 +8,7 @@ * */ -class Police { +class RateLimiter { /** * Create a ratelimiter instance. */ @@ -94,10 +94,10 @@ class Police { if (typeof this._hashes[id] !== 'undefined') { id = this._hashes[id]; } - + let record = this.search(id); record.arrested = false; } } -module.exports = Police; +module.exports = RateLimiter; diff --git a/server/src/managers/stats.js b/server/src/serverLib/StatsManager.js index 20f1ae3..4ec7ddf 100644 --- a/server/src/managers/stats.js +++ b/server/src/serverLib/StatsManager.js @@ -7,13 +7,13 @@ * */ -class Stats { +class StatsManager { /** * Create a stats instance. * */ constructor () { - this._stats = {}; + this.data = {}; } /** @@ -22,7 +22,7 @@ class Stats { * @param {String} key Reference to the arbitrary store name */ get (key) { - return this._stats[key]; + return this.data[key]; } /** @@ -32,7 +32,7 @@ class Stats { * @param {Number} value New value for `key` */ set (key, value) { - this._stats[key] = value; + this.data[key] = value; } /** @@ -56,4 +56,4 @@ class Stats { } } -module.exports = Stats; +module.exports = StatsManager; diff --git a/server/src/serverLib/index.js b/server/src/serverLib/index.js new file mode 100644 index 0000000..4583de6 --- /dev/null +++ b/server/src/serverLib/index.js @@ -0,0 +1,8 @@ +module.exports = { + CommandManager: require('./CommandManager'), + ConfigManager: require('./ConfigManager'), + ImportsManager: require('./ImportsManager'), + MainServer: require('./MainServer'), + RateLimiter: require('./RateLimiter'), + StatsManager: require('./StatsManager') +}; |