diff --git a/app.js b/app.js index d8f8584..2da480b 100644 --- a/app.js +++ b/app.js @@ -2,7 +2,7 @@ var express = require('express'); var Resource = require('express-resource'); var config = require('./config'); -var manager = require('./manager'); +var Manager = require('./lib/manager'); var app = express(); var server = require('http').Server(app); @@ -14,7 +14,9 @@ app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.static(__dirname + '/public')); -var servers = require('./routes/servers'); +var manager = new Manager(config); +manager.load(); +var servers = require('./routes/servers')(manager); app.resource('api/logs', require('./routes/logs')); app.resource('api/missions', require('./routes/missions')); diff --git a/configs/Anrop-se-Test b/configs/Anrop-se-Test new file mode 100644 index 0000000..7ca7882 --- /dev/null +++ b/configs/Anrop-se-Test @@ -0,0 +1,59 @@ + +// Servername visible in the game browser. +hostname = "Anrop.se - Test"; + + + + + + + + + + + + + + + + + + + + + +// If set to 1, Voice over Net will not be available +disableVoN = 1; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/manager.js b/lib/manager.js new file mode 100644 index 0000000..5e0e91d --- /dev/null +++ b/lib/manager.js @@ -0,0 +1,116 @@ +var events = require('events'); +var fs = require('fs'); + +var Server = require('./server'); + +var filePath = "servers.json"; + +var Manager = function (config) { + this.config = config; + this.serversArr = []; + this.serversHash = {}; +}; + +Manager.prototype = new events.EventEmitter(); + +Manager.prototype.addServer = (function (options) { + var server = this._addServer(options); + this.save(); + return server; +}); + +Manager.prototype.removeServer = (function (id) { + var server = this.serversHash[id]; + + if (!server) { + return {}; + } + + var index = this.serversArr.indexOf(server); + if (index > -1) { + this.serversArr.splice(index, 1); + } + this.save(); + + if (server.pid) { + server.stop(); + } + + return server; +}); + +Manager.prototype._addServer = (function (data) { + var server = new Server(this.config.path, this.config.type, data); + this.serversArr.push(server); + this.serversArr.sort(function(a, b) { + return a.title.localeCompare(b.title); + }); + this.serversHash[server.id] = server; + + var self = this; + var statusChanged = function () { + self.emit('servers'); + }; + server.on('state', statusChanged); + + return server; +}); + +Manager.prototype.getServer = (function (id) { + return this.serversHash[id]; +}); + +Manager.prototype.getServers = (function () { + return this.serversArr; +}); + +Manager.prototype.load = (function () { + var self = this; + + fs.readFile(filePath, function (err, data) { + if (err) { + console.log(err); + return; + } + + try { + JSON.parse(data).forEach(function (server) { + self._addServer(server); + }); + } catch(e) { + console.error("Manager load error: " + e); + } + }); +}); + +Manager.prototype.save = (function () { + var data = []; + var self = this; + + this.serversHash = {}; + this.serversArr.forEach(function (server) { + data.push({ + admin_password: server.admin_password, + battle_eye: server.battle_eye, + max_players: server.max_players, + mods: server.mods, + password: server.password, + persistent: server.persistent, + port: server.port, + title: server.title, + von: server.von, + }); + + self.serversHash[server.id] = server; + }); + + fs.writeFile(filePath, JSON.stringify(data), function(err) { + if (err) { + throw err; + } else { + self.emit('servers'); + } + }); +}); + +module.exports = Manager; diff --git a/manager.js b/lib/server.js similarity index 51% rename from manager.js rename to lib/server.js index 43e8f74..10165af 100644 --- a/manager.js +++ b/lib/server.js @@ -1,16 +1,15 @@ var events = require('events'); -var fs = require('fs'); var gamedig = require('gamedig'); var slug = require('slug'); var spawn = require('child_process').spawn; var ArmaServer = require('arma-server'); -var config = require('./config'); -var filePath = "servers.json"; var queryInterval = 5000; -var Server = function (options) { +var Server = function (path, type, options) { + this.path = path; + this.type = type; this.update(options); }; @@ -34,21 +33,21 @@ Server.prototype.update = function (options) { Server.prototype.queryStatus = function() { var self = this; Gamedig.query( - { - type: 'arma3', - host: '127.0.0.1', - port: self.port, - }, - function(state) { - if(state.error) { - self.state = null; - } else { - self.state = state; - } - - self.emit('state'); + { + type: 'arma3', + host: '127.0.0.1', + port: self.port, + }, + function(state) { + if(state.error) { + self.state = null; + } else { + self.state = state; } - ); + + self.emit('state'); + } +); }; Server.prototype.start = function() { @@ -60,9 +59,9 @@ Server.prototype.start = function() { mods: this.mods, password: this.password, passwordAdmin: this.admin_password, - path: config.path, + path: this.path, persistent: this.persistent ? 1 : 0, - platform: config.type, + platform: this.type, players: this.max_players, port: this.port, }); @@ -145,114 +144,4 @@ Server.prototype.toJSON = function () { }; }; -var Manager = function () { - this.serversArr = []; - this.serversHash = {}; -}; - -Manager.prototype = new events.EventEmitter(); - -Manager.prototype.addServer = (function (options) { - var server = this._addServer(options); - this.save(); - return server; -}); - -Manager.prototype.removeServer = (function (id) { - var server = this.serversHash[id]; - - if (!server) { - return {}; - } - - var index = this.serversArr.indexOf(server); - if (index > -1) { - this.serversArr.splice(index, 1); - } - this.save(); - - if (server.pid) { - server.stop(); - } - - return server; -}); - -Manager.prototype._addServer = (function (data) { - var server = new Server(data); - this.serversArr.push(server); - this.serversArr.sort(function(a, b) { - return a.title.localeCompare(b.title); - }); - this.serversHash[server.id] = server; - - var self = this; - var statusChanged = function () { - self.emit('servers'); - }; - server.on('state', statusChanged); - - return server; -}); - -Manager.prototype.getServer = (function (id) { - return this.serversHash[id]; -}); - -Manager.prototype.getServers = (function () { - return this.serversArr; -}); - -Manager.prototype.load = (function () { - var self = this; - - fs.readFile(filePath, function (err, data) { - if (err) { - console.log(err); - return; - } - - try { - JSON.parse(data).forEach(function (server) { - self._addServer(server); - }); - } catch(e) { - console.error("Manager load error: " + e); - } - }); -}); - -Manager.prototype.save = (function () { - var data = []; - var self = this; - - this.serversHash = {}; - this.serversArr.forEach(function (server) { - data.push({ - admin_password: server.admin_password, - battle_eye: server.battle_eye, - max_players: server.max_players, - mods: server.mods, - password: server.password, - persistent: server.persistent, - port: server.port, - title: server.title, - von: server.von, - }); - - self.serversHash[server.id] = server; - }); - - fs.writeFile(filePath, JSON.stringify(data), function(err) { - if (err) { - throw err; - } else { - self.emit('servers'); - } - }); -}); - -var manager = new Manager(); -manager.load(); - -module.exports = manager; +module.exports = Server; diff --git a/routes/servers.js b/routes/servers.js index bf379ae..ec0fc0a 100644 --- a/routes/servers.js +++ b/routes/servers.js @@ -1,7 +1,5 @@ var playwithsix = require('playwithsix'); -var manager = require('./../manager'); - function removeDuplicates(mods) { return mods.reduce(function(a,b){ if (a.indexOf(b) < 0 ) a.push(b); @@ -20,70 +18,62 @@ function resolveMods(server, cb) { }); } -exports.index = function (req, res){ - var servers = []; +module.exports = function (manager) { + return { + index: function (req, res){ + res.send(manager.getServers()); + }, - manager.getServers().forEach(function (server) { - servers.push({ - id: server.id, - title: server.title, - port: server.port, - mods: server.mods, - pid: server.pid, - }); - }); + create: function (req, res) { + var server = manager.addServer(req.body); + if (server.mods.length > 0) { + resolveMods(server, function(err) { + res.send(server); + }); + } else { + res.send(server); + } + }, - res.send(servers); -}; - -exports.create = function (req, res){ - var server = manager.addServer(req.body); - if (server.mods.length > 0) { - resolveMods(server, function(err) { + show: function (req, res){ + var server = manager.getServer(req.params.server); res.send(server); - }); - } else { - res.send(server); - } -}; + }, -exports.show = function (req, res){ - var server = manager.getServer(req.params.server); - res.send(server); -}; + update: function(req, res){ + var server = manager.getServer(req.params.server); + server.update(req.body); + manager.save(); -exports.update = function(req, res){ - var server = manager.getServer(req.params.server); - server.update(req.body); - manager.save(); + if (server.mods.length > 0) { + resolveMods(server, function(err) { + res.send(server); + }); + } else { + res.send(server); + } + }, - if (server.mods.length > 0) { - resolveMods(server, function(err) { + destroy: function(req, res){ + var server = manager.removeServer(req.params.server); res.send(server); - }); - } else { - res.send(server); - } -}; + }, -exports.destroy = function(req, res){ - var server = manager.removeServer(req.params.server); - res.send(server); -}; + start: function (req, res){ + var server = manager.getServer(req.params.server); + server.start(); + res.send({status:"ok", pid: server.pid}); + }, -exports.start = function (req, res){ - var server = manager.getServer(req.params.server); - server.start(); - res.send({status:"ok", pid: server.pid}); -}; - -exports.stop = function (req, res){ - var server = manager.getServer(req.params.server); - server.stop(function () { - if (!server.pid) { - res.send({status: true, pid: server.pid}); - } else { - res.send({status: false, pid: server.pid}); - } - }); + stop: function (req, res){ + var server = manager.getServer(req.params.server); + server.stop(function () { + if (!server.pid) { + res.send({status: true, pid: server.pid}); + } else { + res.send({status: false, pid: server.pid}); + } + }); + }, + }; };