UNPKG

maniajs

Version:

ManiaPlanet (Dedicated) Server Controller.

252 lines (205 loc) 10.2 kB
'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 _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; var _events = require('events'); 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; } /** * CommandManager */ /** * @typedef {object} CommandManager~CommandOptions * @property {number} [level] Optional Minimum level for command, defaults to 0 (all players). * @property {boolean} [hide] Hide in /help and /admin help? Default false. * @property {string} [text] Text for /help and /admin help. Recommended to fill in! * @property {boolean} [strict] Can only have one command with the command key? Default true. Must be false on both commands! * @property {boolean} [admin] Admin Prefix? (/admin). Default false. * @property {string} [command] Command Itself (internal name). */ /** * CommandManager - Holds events for '/' commands. * @class CommandManager * @type {CommandManager} * * @property {object} commands * @property {App} app * @property {ServerClient} client */ var CommandManager = function (_EventEmitter) { _inherits(CommandManager, _EventEmitter); /** * @param {App} app * @param {ServerClient} client */ function CommandManager(app, client) { _classCallCheck(this, CommandManager); var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(CommandManager).call(this)); _this.setMaxListeners(0); _this.app = app; _this.client = client; _this.commands = {}; _this.adminCommands = {}; // Register chat event _this.client.on('player.chat', function (data) { _this._onChat(data); }); return _this; } /** * Handle Player Command (chat) event. * * @param {{login: string, command: boolean, text: string}} data * * @private */ _createClass(CommandManager, [{ key: '_onChat', value: function _onChat(data) { if (data.command) { var parts = data.text.substr(1).split(' '); var command = parts[0]; var params = parts.slice(1); if (!this.app.players.list.hasOwnProperty(data.login)) { return; } // Admin command? if (command === 'admin' && params.length >= 1) { if (this.commands.hasOwnProperty('admin__' + params[0])) { return this._handleAdmin(this.app.players.list[data.login], this.commands['admin__' + params[0]], params.slice(1), data); } } // Non-admin command (could still have level btw). if (this.commands.hasOwnProperty(command)) { return this._handle(this.app.players.list[data.login], this.commands[command], params, data); } // If not yet returned, show error. this.app.server.send().chat('Error, command doesn\'t exist!', { destination: data.login }).exec(); } } /** * Handle Command. * * @param {Player} player * @param {CommandManager~CommandOptions} command * @param {string[]} params * @param {object} data Raw Data. * @private */ }, { key: '_handle', value: function _handle(player, command, params, data) { if (player.level >= command.level) { return this.emit(command.command, this.app.players.list[data.login], params, data); } this.app.server.send().chat('Error, you are not allowed to use this command!', { destination: data.login }).exec(); } /** * Handle Admin Command. * * @param {Player} player * @param {CommandManager~CommandOptions} command * @param {string[]} params * @param {object} data Raw Data. * @private */ }, { key: '_handleAdmin', value: function _handleAdmin(player, command, params, data) { if (player.level >= command.level) { return this.emit(command.command, this.app.players.list[data.login], params, data); } this.app.server.send().chat('Error, you are not allowed to use this command!', { destination: data.login }).exec(); } // Public Methods. /** * Register callback for command. * * @param {string} command. * @param {CommandManager~CommandOptions} options Options, such as level, hide in help and comment. * @param {CommandManager~CommandCallback} callback */ }, { key: 'on', value: function on(command, options, callback) { this.register(command, options, callback, false); } /** * Register callback for command. (One single time). * * @param {string} command. * @param {number} [level] player minimum level. * @param {CommandManager~CommandCallback} callback */ }, { key: 'once', value: function once(command, level, callback) { this.register(command, level, callback, true); } /** * Register callback for command. * * @param {string} command. * * @param {CommandManager~CommandOptions|string|number} options Options, such as level, hide in help and comment. Give string for comment, number for level or object for mixed. * @param {CommandManager~CommandCallback} callback * @param {boolean} [single] Single time? */ }, { key: 'register', value: function register(command, options, callback, single) { // Parse optional and combined parameters. callback = callback || function () {}; if (typeof options === 'number') { options = { level: options, hide: false, text: '', strict: false }; } if (typeof options === 'string') { options = { level: 0, hide: false, text: options, strict: false }; } if (!options.hide) options.hide = false; if (!options.text) options.text = ''; if (!options.level) options.level = 0; if (!options.strict) options.strict = false; // /admin ... options.admin = options.admin || false; if (options.admin) { // Prefix the admin__. command = 'admin ' + command; } // Replace whitespaces for __ command = command.replace(/\s/g, '__'); options.command = command; // Save command in options itself too. if (options.level > 3 || options.level < 0) { options.level = 0; } single = single || false; // Strict mode on for commands? if (this.commands.hasOwnProperty(command)) { // && (this.commands[command].strict || options.strict)) { throw new Error('The command \'' + command + '\' is already registered for a command! One of the commands has strict mode on!'); } // Set options, register to commands array. this.commands[command] = options; // Register callback. if (single) { _get(Object.getPrototypeOf(CommandManager.prototype), 'once', this).call(this, command, function (player, params) { callback(player, params); }); } else { _get(Object.getPrototypeOf(CommandManager.prototype), 'on', this).call(this, command, function (player, params) { callback(player, params); }); } } /** * @callback CommandManager~CommandCallback * * @param {Player} player Player object. * @param {object} param Parameter array. */ }]); return CommandManager; }(_events.EventEmitter); exports.default = CommandManager;