UNPKG

maniajs

Version:

ManiaPlanet (Dedicated) Server Controller.

261 lines (211 loc) 8.22 kB
/** * UI Manager */ 'use strict'; 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;