var events = require('events'); var gamedig = require('gamedig'); var slug = require('slug'); var spawn = require('child_process').spawn; var ArmaServer = require('arma-server'); var queryInterval = 5000; var Server = function (path, type, options) { this.path = path; this.type = type; this.update(options); }; Server.prototype = new events.EventEmitter(); Server.prototype.update = function (options) { this.admin_password = options.admin_password; this.battle_eye = options.battle_eye; this.max_players = options.max_players; this.mods = options.mods || []; this.password = options.password; this.persistent = options.persistent; this.port = options.port || 2302; this.title = options.title; this.von = options.von; this.id = slug(this.title).replace('.', '-'); this.port = parseInt(this.port, 10); // If port is a string then gamedig fails }; 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'); } ); }; Server.prototype.start = function() { var server = new ArmaServer({ battleEye: this.battle_eye ? 1 : 0, config: this.id, disableVoN: this.von ? 0 : 1, hostname: this.title, mods: this.mods, password: this.password, passwordAdmin: this.admin_password, path: this.path, persistent: this.persistent ? 1 : 0, platform: this.type, players: this.max_players, port: this.port, }); server.writeServerConfig(); var instance = server.start(); var self = this; instance.stdout.on('data', function (data) { console.log('stdout: ' + data); }); instance.stderr.on('data', function (data) { console.log('stderr: ' + data); }); instance.on('close', function (code) { console.log('child process exited with code ' + code); clearInterval(self.queryStatusInterval); self.state = null; self.pid = null; self.instance = null; self.emit('state'); }); this.pid = instance.pid; this.instance = instance; this.queryStatusInterval = setInterval(function () { self.queryStatus(); }, queryInterval); this.emit('state'); return this; }; Server.prototype.stop = function(cb) { var handled = false; var self = this; this.instance.on('close', function (code) { if (!handled) { handled = true; if (cb) { cb(); } } }); this.instance.kill(); setTimeout(function() { if (!handled) { handled = true; if (cb) { cb(); } } }, 5000); return this; }; Server.prototype.toJSON = function () { return { admin_password: this.admin_password, battle_eye: this.battle_eye, id: this.id, max_players: this.max_players, mods: this.mods, password: this.password, persistent: this.persistent, pid: this.pid, port: this.port, state: this.state, title: this.title, von: this.von, }; }; module.exports = Server;