maniajs
Version:
ManiaPlanet (Dedicated) Server Controller.
261 lines (211 loc) • 8.22 kB
JavaScript
/**
* UI Manager
*/
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _async = require('async');
var async = _interopRequireWildcard(_async);
var _events = require('events');
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
/**
* UI Manager
*
* @class UIManager
* @type {UIManager}
*
* @property {App} app
*
* @property {Map} interfaces Player Specifics Interfaces.
*/
var UIManager = function (_EventEmitter) {
_inherits(UIManager, _EventEmitter);
function UIManager(app) {
_classCallCheck(this, UIManager);
var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(UIManager).call(this));
_this.setMaxListeners(0);
_this.app = app;
_this.interfaces = new Map();
// Update Interval
_this.interval = null;
return _this;
}
/**
* Execute when server is started. (run mode).
*/
_createClass(UIManager, [{
key: 'start',
value: function start() {
var _this2 = this;
// Callbacks
this.app.server.on('player.disconnect', function (player) {
return _this2.playerDisconnect(player);
});
}
/**
* Called on player disconnect.
*
* @param player
*/
}, {
key: 'playerDisconnect',
value: function playerDisconnect(player) {
// Try to cleanup player's data in UI's.
this.interfaces.forEach(function (ui) {
if (ui.playerData.hasOwnProperty(player.login)) {
ui.destroy([player.login], true);
}
});
}
/**
* Update Interface.
*
* @param {InterfaceBuilder} ui
* @param {boolean} force Force update to all players?
* @param {[]} logins Array with logins to send to (better for performance).
*
* @returns {Promise}
*/
}, {
key: 'update',
value: function update(ui, force, logins) {
if (!this.interfaces.has(ui.id)) {
this.interfaces.set(ui.id, ui);
}
var sendLogins = logins.slice(0);
var sendForce = force ? true : false;
ui.forceUpdate = false;
ui.playersChanged = [];
// Update the UI ID!
return this.sendInterface(ui, sendForce, sendLogins);
}
/**
* Will send UI, parse the (players)data.
* @param {InterfaceBuilder} ui
* @param {boolean} force Force update to all players?
* @param {[]} updateLogins Array with logins to send to (better for performance).
*
* @returns {Promise}
*/
}, {
key: 'sendInterface',
value: function sendInterface(ui, force, updateLogins) {
var _this3 = this;
return new Promise(function (resolve, reject) {
var data = {}; // Holds all global data.
var players = []; // Holds login.
var send = '';
// Global Data
data = ui.globalData;
// Player specific, or global?
if (Object.keys(ui.playerData).length > 0) {
// Per player data, only send to the players.
if (force) {
players = Object.keys(ui.playerData);
} else {
players = updateLogins;
}
}
// Foreach or global?
if (players.length > 0) {
// Player specific.
async.eachSeries(players, function (login, callback) {
var sendData = Object.assign({}, data, ui.playerData[login]);
send = '<manialink ';
if (ui.version == 2) send += ' version="2"';
send += 'id="' + ui.id + '">';
send += ui.template(sendData);
send += '</manialink>';
_this3.app.server.send().custom('SendDisplayManialinkPageToLogin', [login, send, ui.timeout, ui.hideClick]).exec().then(function () {
sendData = null;
return callback();
}).catch(function (err) {
sendData = null;
return callback(err);
});
}, function (err) {
send = null;
data = null;
if (err) {
return reject(err);
}
return resolve();
});
} else {
// Global
send = '<manialink ';
if (ui.version == 2) send += ' version="2"';
send += 'id="' + ui.id + '">';
send += ui.template(data);
send += '</manialink>';
_this3.app.server.send().custom('SendDisplayManialinkPage', [send, ui.timeout, ui.hideClick]).exec().then(function () {
send = null;
data = null;
players = null;
return resolve();
}).catch(function (err) {
send = null;
data = null;
players = null;
return reject(err);
});
}
});
}
/**
* Destroy ManiaLink ID for logins or global.
*
* @param {string} id ManiaLink ID.
* @param {string[]|boolean} [logins] Array with logins, or false for all.
* @param {boolean} [hide] Hide at client, default false.
*/
}, {
key: 'destroy',
value: function destroy(id, logins, hide) {
logins = logins || false;
hide = hide || false;
var send = '<manialink id="' + id + '"></manialink>';
// Remove from map.
if (this.interfaces.has(id)) {
this.interfaces.delete(id);
}
if (hide) {
if (logins) {
return this.app.server.send().custom('SendDisplayManialinkPageToLogin', [logins.join(','), send, 0, false]).exec();
}
return this.app.server.send().custom('SendDisplayManialinkPage', [send, 0, false]).exec();
}
}
/**
* ManiaLink Answer Event.
*
* @param {object} params
* @param {number} params.playerid
* @param {string} params.login
* @param {string} params.answer
* @param {[]} params.entries
*/
}, {
key: 'answer',
value: function answer(params) {
// Emit event on manager.
if (params.answer.indexOf('core_button_') === 0) {
this.emit(params.answer.substr(12), params); // Only get the last bit if it's a core button.
} else if (params.answer.indexOf('|') !== -1) {
// Is ListView action!
this.emit(params.answer.substr(0, params.answer.indexOf('|')), params);
} else {
// Normal UI event.
this.emit(params.answer, params);
}
return Promise.resolve();
}
}]);
return UIManager;
}(_events.EventEmitter);
exports.default = UIManager;