Refactored manager and server into separate components injected as needed

This commit is contained in:
Björn Dahlgren 2015-01-21 03:18:45 +01:00
parent 0909ccce74
commit 7c4df71a90
5 changed files with 248 additions and 192 deletions

6
app.js
View File

@ -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'));

59
configs/Anrop-se-Test Normal file
View File

@ -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;

116
lib/manager.js Normal file
View File

@ -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;

View File

@ -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;

View File

@ -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});
}
});
},
};
};