maniajs
Version:
ManiaPlanet (Dedicated) Server Controller.
399 lines (339 loc) • 10.3 kB
JavaScript
/**
* 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;