UNPKG

maniajs

Version:

ManiaPlanet (Dedicated) Server Controller.

399 lines (339 loc) 10.3 kB
/** * Players Game Flow */ '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); 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"); } } /** * Players game flow class. * * @class Players * @type {Players} */ var Players = function () { function Players(app) { _classCallCheck(this, Players); this.app = app; /** * List with players currently on the server. * Includes fetched data from database. * * Key: login * Value: Player object * * @type {object} */ this.list = {}; // Holds connecting locks. this.online = {}; } _createClass(Players, [{ key: 'boot', value: function boot() { var _this = this; // Get all current players, controller just boot. return new Promise(function (resolve, reject) { _this.app.serverFacade.client.gbx.query('GetPlayerList', [-1, 0, 1]).then(function (players) { async.eachSeries(players, function (player, callback) { var isSpectator = player.SpectatorStatus % 10; var isTempSpectator = player.SpectatorStatus / 10 % 10; var isPureSpectator = player.SpectatorStatus / 100 % 10; var autoTarget = player.SpectatorStatus / 1000 % 10; var targetId = player.SpectatorStatus / 10000; var info = { login: player.Login, nickName: player.NickName, playerId: player.PlayerId, teamId: player.TeamId, spectatorStatus: player.SpectatorStatus, flags: player.Flags, isSpectator: isSpectator, isTempSpectator: isTempSpectator, isPureSpectator: isPureSpectator, autoTarget: autoTarget, targetId: targetId }; // Fetch from database _this.connect(player.Login, player.NickName, info).then(function () { callback(); }).catch(function (err) { callback(err); }); }, function (err) { if (err) { return reject(err); } return resolve(); }); }); }); } /** * Count players (non-spectators). * @returns {int} */ }, { key: 'countPlayers', value: function countPlayers() { var num = 0; if (!this.list) return num; for (var login in this.list) { var one = this.list[login]; if (one.info && !one.info.isSpectator) { num++; } } return num; } /** * Count players (non-spectators). * @returns {int} */ }, { key: 'countSpectators', value: function countSpectators() { var num = 0; if (!this.list) return num; for (var login in this.list) { var one = this.list[login]; if (one.info && one.info.isSpectator) { num++; } } return num; } /** * Is Login Player? * * @param {string} login * @returns {boolean} */ }, { key: 'isPlayer', value: function isPlayer(login) { return this.isLevel(login, 0); } /** * Is Login Operator? * * @param {string} login * @returns {boolean} */ }, { key: 'isOperator', value: function isOperator(login) { return this.isLevel(login, 1); } /** * Is Login Admin? * * @param {string} login * @returns {boolean} */ }, { key: 'isAdmin', value: function isAdmin(login) { return this.isLevel(login, 2); } /** * Is Login MasterAdmin? * * @param {string} login * @returns {boolean} */ }, { key: 'isMasterAdmin', value: function isMasterAdmin(login) { return this.isLevel(login, 3); } /** * Is Login Minimum Level? * * @param {string} login * @param {number} level Mininum level, 0, 1, 2 or 3. * @returns {boolean} */ }, { key: 'isMinimal', value: function isMinimal(login, level) { return this.isLevel(login, level, true); } /** * Is Login Level. * * @private * @param login * @param level * @param minimum * @returns {boolean} */ }, { key: 'isLevel', value: function isLevel(login, level, minimum) { minimum = minimum || false; if (this.list.hasOwnProperty(login)) { if (minimum) { return this.list[login].level >= level; } return this.list[login].level === level; } return false; } /** * Set Player Level. * * @param {string|Instance} login * @param {number} level * @returns {Promise} */ }, { key: 'setLevel', value: function setLevel(login, level) { if (typeof login !== 'string') { login.set('level', level); return login.save(); } else { if (this.list.hasOwnProperty(login)) { this.list[login].set('level', level); return this.list[login].save(); } } return Promise.reject(new Error('Player not in list!')); } /** * Get Details (Promise!). * * @param {Player|string} player Player db object or login! * @returns {Promise<{}>} */ }, { key: 'details', value: function details(player) { var login = player.login || player; return this.app.server.send().custom('GetDetailedPlayerInfo', [login]).exec(); } /** * GAME FLOW FUNCTIONS */ /** * Call on info change (on connection, first time only) * * @param login * @param nickname * @param info * @param {boolean} [emit] Emit connect? default false. * @returns {Promise} */ }, { key: 'connect', value: function connect(login, nickname, info, emit) { var _this2 = this; info = info || {}; emit = emit || false; if (this.online.hasOwnProperty(login) && this.online[login]) { return Promise.resolve(); } if (this.list.hasOwnProperty(login) && this.list[login].disconnected) { delete this.list[login]; } this.online[login] = false; return new Promise(function (resolve, reject) { var Player = _this2.app.models.Player; // Fetch or create from db. Player.findOne({ where: { login: login } }).then(function (player) { if (!player) { // Create return Player.create({ login: login, nickname: nickname }).then(function (player) { return resolve(player); }).catch(function (err) { return reject(err); }); } if (player.nickname === nickname) { return resolve(player); } // Update player.set('nickname', nickname); return player.save().then(function (player) { return resolve(player); }).catch(function (err) { return reject(err); }); }).catch(function (err) { return reject(err); }); }).then(function (player) { if (!player) { // No update! return Promise.resolve(player); } // Maybe this player is the masteradmin? (see config). if (_this2.app.config.hasOwnProperty('masteradmins') && _this2.app.config.masteradmins) { if (_this2.app.config.masteradmins.filter(function (adminLogin) { return adminLogin === login; }).length > 0) { // Yes! Make the player admin! return _this2.setLevel(player, 3); } } return Promise.resolve(player); }).then(function (player) { // If already, then stop!. if (_this2.list.hasOwnProperty(login)) { return Promise.resolve(player); } // Save to local list. Remove lock. player.info = info; _this2.list[login] = player; if (!_this2.online[login]) { _this2.online[login] = true; // Now call the player.connect event if (emit) { _this2.app.serverFacade.client.emit('player.connect', _this2.list[login].info); } return Promise.resolve(player); } return Promise.resolve(player); }).catch(function (err) { _this2.app.log.error(err); }); } /** * Call disconnected * @param login */ }, { key: 'disconnect', value: function disconnect(login) { var _this3 = this; if (this.list.hasOwnProperty(login)) { this.list[login].disconnected = true; } if (this.online.hasOwnProperty(login)) { delete this.online[login]; } // Remove later. setTimeout(function () { if (_this3.list.hasOwnProperty(login) && !_this3.online.hasOwnProperty(login)) { delete _this3.list[login]; } }, 5000); return Promise.resolve(); } }]); return Players; }(); exports.default = Players;