aboutsummaryrefslogtreecommitdiffstats
path: root/server/src/serverLib
diff options
context:
space:
mode:
authormarzavec <admin@marzavec.com>2019-03-19 07:36:21 +0100
committermarzavec <admin@marzavec.com>2019-03-19 07:36:21 +0100
commitc634e03cb553e21158fddc6d4221a54aa799de79 (patch)
tree74f303d4ab65b08c7ec316fb713146cc99024c00 /server/src/serverLib
parentMerge pull request #56 from paulgreg/manifest (diff)
downloadhackchat-c634e03cb553e21158fddc6d4221a54aa799de79.tar.gz
hackchat-c634e03cb553e21158fddc6d4221a54aa799de79.zip
refactoring 1 of 2
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.js89
-rw-r--r--server/src/serverLib/CoreApp.js66
-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.js8
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')
+};