diff --git a/app.js b/app.js index 9931a25..0b4bb3b 100644 --- a/app.js +++ b/app.js @@ -9,6 +9,7 @@ var config = require('./config'); var Manager = require('./lib/manager'); var Missions = require('./lib/missions'); var Mods = require('./lib/mods'); +var SteamMods = require('./lib/steam_mods'); var Logs = require('./lib/logs'); var app = express(); @@ -31,13 +32,13 @@ app.use(serveStatic(path.join(__dirname, 'public'))); var logs = new Logs(config); -var manager = new Manager(config, logs); -manager.load(); - var missions = new Missions(config); -var mods = new Mods(config); +var mods = new SteamMods(config); mods.updateMods(); +var manager = new Manager(config, logs, mods); +manager.load(); + app.use('/api/logs', require('./routes/logs')(logs)); app.use('/api/missions', require('./routes/missions')(missions)); app.use('/api/mods', require('./routes/mods')(mods)); diff --git a/config.js.example b/config.js.example index dbe2265..d1c084e 100644 --- a/config.js.example +++ b/config.js.example @@ -12,6 +12,9 @@ module.exports = { '@mod1', '@mod2', ], + steam: { + path: 'path-to-main-steam-folder', + }, auth: { // If both username and password is set, HTTP Basic Auth will be used username: '', // Username for HTTP Basic Auth password: '', // Password for HTTP Basic Auth diff --git a/lib/manager.js b/lib/manager.js index ea3b245..fa0153e 100644 --- a/lib/manager.js +++ b/lib/manager.js @@ -5,9 +5,10 @@ var Server = require('./server'); var filePath = "servers.json"; -var Manager = function (config, logs) { +var Manager = function (config, logsManager, modsManager) { this.config = config; - this.logs = logs; + this.logsManager = logsManager; + this.modsManager = modsManager; this.serversArr = []; this.serversHash = {}; }; @@ -41,7 +42,7 @@ Manager.prototype.removeServer = (function (id) { }); Manager.prototype._addServer = (function (data) { - var server = new Server(this.config, this.logs, data); + var server = new Server(this.config, this.logsManager, this.modsManager, data); this.serversArr.push(server); this.serversArr.sort(function(a, b) { return a.title.localeCompare(b.title); diff --git a/lib/mods.js b/lib/mods.js index 9ae5685..4f69e4e 100644 --- a/lib/mods.js +++ b/lib/mods.js @@ -74,6 +74,12 @@ Mods.prototype.download = function (mod, cb) { }); }; +Mods.prototype.find = function (id) { + this.mods.find(function (mod) { + return mod.id == id; + }) +}; + Mods.prototype.updateMods = function () { var self = this; fs.readdir(self.config.path, function (err, files) { @@ -89,8 +95,10 @@ Mods.prototype.updateMods = function () { var modPath = path.join(self.config.path, mod); self.isPlayWithSixMod(modPath, function (isPlayWithSixMod) { cb(null, { + id: mod, name: mod, outdated: outdatedMods && outdatedMods.indexOf(mod) >= 0, + path: mod, progress: null, playWithSix: isPlayWithSixMod, }); diff --git a/lib/server.js b/lib/server.js index 535c175..4673b79 100644 --- a/lib/server.js +++ b/lib/server.js @@ -32,9 +32,10 @@ var createServerTitle = function(title) { return title; }; -var Server = function (config, logs, options) { +var Server = function (config, logsManager, modsManager, options) { this.config = config; - this.logs = logs; + this.logsManager = logsManager; + this.modsManager = modsManager; this.update(options); }; @@ -92,7 +93,15 @@ Server.prototype.queryStatus = function() { }; Server.prototype.start = function() { + var self = this; var parameters = []; + var mods = this.mods.map(function (mod) { + return self.modsManager.find(mod); + }).filter(function (mod) { + return mod; + }).map(function (mod) { + return mod.path; + }); if (config.parameters && Array.isArray(config.parameters)) { parameters = parameters.concat(config.parameters); @@ -111,7 +120,7 @@ Server.prototype.start = function() { hostname: createServerTitle(this.title), localClient: this.headless ? ["127.0.0.1"] : null, missions: this.missions, - mods: this.mods, + mods: mods, parameters: parameters, password: this.password, passwordAdmin: this.admin_password, @@ -124,11 +133,10 @@ Server.prototype.start = function() { }); server.writeServerConfig(); var instance = server.start(); - var self = this; var logStream = null; if (this.config.type === 'linux') { - logStream = fs.createWriteStream(this.logs.generateLogFilePath(), { + logStream = fs.createWriteStream(this.logsManager.generateLogFilePath(), { 'flags': 'a' }); } @@ -172,7 +180,7 @@ Server.prototype.start = function() { var headless = new ArmaServer.Headless({ game: config.game, host: "127.0.0.1", - mods: this.mods, + mods: mods, parameters: parameters, password: this.password, path: this.config.path, diff --git a/lib/steam_mods.js b/lib/steam_mods.js new file mode 100644 index 0000000..f8282f2 --- /dev/null +++ b/lib/steam_mods.js @@ -0,0 +1,56 @@ +var async = require('async'); +var events = require('events'); +var filesize = require('filesize'); +var fs = require('fs.extra'); +var _ = require('lodash'); +var path = require('path'); +var ArmaSteamWorkshop = require('arma-steam-workshop'); + +var SteamMods = function (config) { + this.config = config; + this.armaSteamWorkshop = new ArmaSteamWorkshop(this.config.steam); + this.mods = []; +}; + +SteamMods.prototype = new events.EventEmitter(); + +SteamMods.prototype.delete = function (mod, cb) { + cb(new Error('not implemented')); +}; + +SteamMods.prototype.find = function (id) { + return this.mods.find(function (mod) { + return mod.id == id; + }); +}; + +SteamMods.prototype.download = function (mod, cb) { + cb(new Error('not implemented')); +}; + +SteamMods.prototype.resolveMods = function (mods, cb) { + cb(null, mods); +}; + +SteamMods.prototype.search = function (query, cb) { + cb(new Error('not implemented')); +}; + +SteamMods.prototype.updateMods = function () { + var self = this; + this.armaSteamWorkshop.mods(function (err, mods) { + if (!err) { + mods.map(function (mod) { + mod.id = mod.id + ''; + mod.playWithSix = null; + mod.progress = null; + mod.outdated = false; + }); + + self.mods = mods; + self.emit('mods', mods); + } + }); +}; + +module.exports = SteamMods; diff --git a/package.json b/package.json index 648b545..9fd6a20 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ }, "dependencies": { "arma-server": "0.0.5", + "arma-steam-workshop": "https://github.com/Dahlgren/node-arma-steam-workshop/tarball/0f31c36ad2fa68e1ca0bf937cfea02c0c30ba9fd", "async": "^0.9.0", "body-parser": "^1.17.1", "express": "^4.15.2", diff --git a/public/js/app/models/mod.js b/public/js/app/models/mod.js index 3fa1006..5453235 100644 --- a/public/js/app/models/mod.js +++ b/public/js/app/models/mod.js @@ -8,9 +8,11 @@ define(function (require) { return Backbone.Model.extend({ defaults: { - name: '' + id: '', + name: '', + path: '', }, - idAttribute: 'name', + idAttribute: 'id', urlRoot: '/api/mods/', }); diff --git a/public/js/app/views/servers/info.js b/public/js/app/views/servers/info.js index efa111a..0915969 100644 --- a/public/js/app/views/servers/info.js +++ b/public/js/app/views/servers/info.js @@ -54,5 +54,16 @@ define(function (require) { }); }); }, + + templateHelpers: function() { + var self = this; + return { + mods: self.options.mods.filter(function (mod) { + return self.model.get('mods').indexOf(mod.get('id')) >= 0; + }).map(function (mod) { + return mod.get('name'); + }), + }; + }, }); }); diff --git a/public/js/app/views/servers/mods/list_item.js b/public/js/app/views/servers/mods/list_item.js index d06e603..c72a53a 100644 --- a/public/js/app/views/servers/mods/list_item.js +++ b/public/js/app/views/servers/mods/list_item.js @@ -17,7 +17,7 @@ define(function (require) { templateHelpers: function(){ return { - enabled: this.options.server.get('mods').indexOf(this.model.get('name')) > -1 + enabled: this.options.server.get('mods').indexOf(this.model.get('id')) > -1 } }, }); diff --git a/public/js/app/views/servers/view.js b/public/js/app/views/servers/view.js index 00e9e0a..1ab5c3b 100644 --- a/public/js/app/views/servers/view.js +++ b/public/js/app/views/servers/view.js @@ -42,7 +42,7 @@ define(function (require) { }, onRender: function() { - this.infoView.show(new InfoView({model: this.model})); + this.infoView.show(new InfoView({model: this.model, mods: this.mods})); this.missionsView.show(new MissionsView({missions: this.missions, server: this.model})); this.modsView.show(new ModsListView({collection: this.mods, server: this.model})); this.parametersView.show(new ParametersListView({server: this.model})); diff --git a/public/js/tpl/servers/mods/list_item.html b/public/js/tpl/servers/mods/list_item.html index 9c28210..4d20e17 100644 --- a/public/js/tpl/servers/mods/list_item.html +++ b/public/js/tpl/servers/mods/list_item.html @@ -1,7 +1,7 @@