Workaround for stupid array index notation access bug in Nashorn.

This commit is contained in:
walterhiggins 2014-01-22 23:57:27 +00:00
parent 9a2b39b108
commit a098963f90
4 changed files with 57 additions and 41 deletions

View file

@ -2457,11 +2457,11 @@ such an alias)...
/jsp alias global stormy = time 18000; weather storm /jsp alias global stormy = time 18000; weather storm
To delete an alias ... To remove an alias ...
/jsp alias delete cw /jsp alias remove cw
... deletes the 'cw' alias from the appropriate alias map. ... removes the 'cw' alias from the appropriate alias map.
To get a list of aliases currently defined... To get a list of aliases currently defined...

View file

@ -9,10 +9,10 @@ var _cmdInterceptors = [];
*/ */
var executeCmd = function(args, player){ var executeCmd = function(args, player){
if (args.length === 0) if (args.length === 0)
throw new Error("Usage: jsp command-name command-parameters"); throw new Error('Usage: jsp command-name command-parameters');
var name = args[0]; var name = args[0];
var cmd = _commands[name]; var cmd = _commands[name];
if (typeof cmd === "undefined"){ if (typeof cmd === 'undefined'){
// it's not a global command - pass it on to interceptors // it's not a global command - pass it on to interceptors
var intercepted = false; var intercepted = false;
for (var i = 0;i < _cmdInterceptors.length;i++){ for (var i = 0;i < _cmdInterceptors.length;i++){
@ -26,7 +26,7 @@ var executeCmd = function(args, player){
try { try {
result = cmd.callback(args.slice(1),player); result = cmd.callback(args.slice(1),player);
}catch (e){ }catch (e){
console.error("Error while trying to execute command: " + JSON.stringify(args)); console.error('Error while trying to execute command: ' + JSON.stringify(args));
throw e; throw e;
} }
return result; return result;
@ -36,16 +36,13 @@ var executeCmd = function(args, player){
define a new JSP command. define a new JSP command.
*/ */
var defineCmd = function(name, func, options, intercepts) { var defineCmd = function(name, func, options, intercepts) {
if (typeof options == "undefined") if (typeof options == 'undefined')
options = []; options = [];
_commands[name] = {callback: func, options: options}; _commands[name] = {callback: func, options: options};
if (intercepts) if (intercepts)
_cmdInterceptors.push(func); _cmdInterceptors.push(func);
return func; return func;
}; };
var _command = function(name, func, options, intercepts) { exports.command = defineCmd;
return defineCmd(name, func, options, intercepts);
};
_command.exec = executeCmd;
exports.command = _command;
exports.commands = _commands; exports.commands = _commands;
exports.exec = executeCmd;

View file

@ -573,7 +573,8 @@ function __onEnable (__engine, __plugin, __script)
*/ */
require('persistence')(jsPluginsRootDir,global); require('persistence')(jsPluginsRootDir,global);
global.command = require('command').command; var cmdModule = require('command');
global.command = cmdModule.command;
var plugins = require('plugin'); var plugins = require('plugin');
global.__onTabComplete = require('tabcomplete'); global.__onTabComplete = require('tabcomplete');
global.plugin = plugins.plugin; global.plugin = plugins.plugin;
@ -593,7 +594,9 @@ function __onEnable (__engine, __plugin, __script)
global.__onCommand = function( sender, cmd, label, args) { global.__onCommand = function( sender, cmd, label, args) {
var jsArgs = []; var jsArgs = [];
var i = 0; var i = 0;
for (;i < args.length; i++) jsArgs.push('' + args[i]); for (;i < args.length; i++) {
jsArgs.push('' + args[i]);
}
var result = false; var result = false;
var cmdName = ('' + cmd.name).toLowerCase(); var cmdName = ('' + cmd.name).toLowerCase();
@ -616,7 +619,7 @@ function __onEnable (__engine, __plugin, __script)
} }
} }
if (cmdName == 'jsp'){ if (cmdName == 'jsp'){
command.exec(jsArgs, sender); cmdModule.exec(jsArgs, sender);
result = true; result = true;
} }
return result; return result;

View file

@ -31,11 +31,11 @@ such an alias)...
/jsp alias global stormy = time 18000; weather storm /jsp alias global stormy = time 18000; weather storm
To delete an alias ... To remove an alias ...
/jsp alias delete cw /jsp alias remove cw
... deletes the 'cw' alias from the appropriate alias map. ... removes the 'cw' alias from the appropriate alias map.
To get a list of aliases currently defined... To get a list of aliases currently defined...
@ -55,7 +55,7 @@ var _usage = "\
/jsp alias set {alias} = {comand-1} ;{command-2}\n \ /jsp alias set {alias} = {comand-1} ;{command-2}\n \
/jsp alias global {alias} = {command-1} ; {command-2}\n \ /jsp alias global {alias} = {command-1} ; {command-2}\n \
/jsp alias list\n \ /jsp alias list\n \
/jsp alias delete {alias}\n \ /jsp alias remove {alias}\n \
Create a new alias : \n \ Create a new alias : \n \
/jsp alias set cw = time set {1} ; weather {2}\n \ /jsp alias set cw = time set {1} ; weather {2}\n \
Execute the alias : \n \ Execute the alias : \n \
@ -81,7 +81,7 @@ var _processParams = function(params){
return { cmd: aliasCmd, aliases: aliasValue.split(/\s*;\s*/) }; return { cmd: aliasCmd, aliases: aliasValue.split(/\s*;\s*/) };
}; };
var _set = function(player, params){ var _set = function(params, player){
var playerAliases = _store.players[player.name]; var playerAliases = _store.players[player.name];
if (!playerAliases){ if (!playerAliases){
playerAliases = {}; playerAliases = {};
@ -92,11 +92,11 @@ var _set = function(player, params){
player.sendMessage("Alias '" + o.cmd + "' created."); player.sendMessage("Alias '" + o.cmd + "' created.");
}; };
var _delete = function(player, params){ var _remove = function(params, player){
if (_store.players[player.name] && if (_store.players[player.name] &&
_store.players[player.name][params[0]]){ _store.players[player.name][params[0]]){
delete _store.players[player.name][params[0]]; delete _store.players[player.name][params[0]];
player.sendMessage("Alias '" + params[0] + "' deleted."); player.sendMessage("Alias '" + params[0] + "' removed.");
} }
else{ else{
player.sendMessage("Alias '" + params[0] + "' does not exist."); player.sendMessage("Alias '" + params[0] + "' does not exist.");
@ -107,7 +107,7 @@ var _delete = function(player, params){
} }
}; };
var _global = function(player, params){ var _global = function(params, player){
if (!player.op){ if (!player.op){
player.sendMessage("Only operators can set global aliases. " + player.sendMessage("Only operators can set global aliases. " +
"You need to be an operator to perform this command."); "You need to be an operator to perform this command.");
@ -118,7 +118,7 @@ var _global = function(player, params){
player.sendMessage("Global alias '" + o.cmd + "' created."); player.sendMessage("Global alias '" + o.cmd + "' created.");
}; };
var _list = function(player){ var _list = function(params, player){
try { try {
var alias = 0; var alias = 0;
if (_store.players[player.name]){ if (_store.players[player.name]){
@ -139,26 +139,42 @@ var _list = function(player){
throw e; throw e;
} }
}; };
var _help = function(params, player){
player.sendMessage('Usage:\n' + _usage);
};
var alias = plugin('alias', { var alias = plugin('alias', {
"store": _store, store: _store,
"set": _set, set: _set,
"global": _global, global: _global,
"delete": _delete, remove: _remove,
"list": _list, list: _list,
"help": function(player){ player.sendMessage("Usage:\n" + _usage);} help: _help
}, true ); }, true );
var aliasCmd = command('alias', function( params, invoker ) {
var aliasCmd = command('alias', function(params,invoker){ var operation = params[0], fn;
var operation = params[0];
if (!operation){ if (!operation){
invoker.sendMessage("Usage:\n" + _usage); invoker.sendMessage('Usage:\n' + _usage);
return; return;
} }
if (alias[operation]) /*
alias[operation](invoker, params.slice(1)); wph 20140122 this is kind of dumb but Nashorn has some serious problems
else accessing object properties by array index notation
invoker.sendMessage("Usage:\n" + _usage); in JRE8 alias[operation] returns null - definitely a bug in Nashorn.
*/
if (operation == 'set'){
alias.set(params.slice(1), invoker);
}else if (operation == 'global'){
alias.global(params.slice(1), invoker);
}else if (operation == 'remove'){
alias.remove(params.slice(1), invoker);
}else if (operation == 'list'){
alias.list(params.slice(1), invoker);
}else if (operation == 'help'){
alias.help(params.slice(1), invoker);
}else {
invoker.sendMessage('Usage:\n' + _usage);
}
}); });
var _intercept = function( msg, invoker, exec) var _intercept = function( msg, invoker, exec)
@ -177,7 +193,7 @@ var _intercept = function( msg, invoker, exec)
if (config.verbose){ if (config.verbose){
var commandObj = server.commandMap.getCommand(command); var commandObj = server.commandMap.getCommand(command);
if (!commandObj) if (!commandObj)
console.info("No global alias found for command: " + command); console.info('No global alias found for command: ' + command);
} }
} }
/* /*
@ -192,7 +208,7 @@ var _intercept = function( msg, invoker, exec)
if (config.verbose){ if (config.verbose){
var commandObj = server.commandMap.getCommand(command); var commandObj = server.commandMap.getCommand(command);
if (!commandObj) if (!commandObj)
console.info("No player alias found for command: " + command); console.info('No player alias found for command: ' + command);
} }
} }
for (var i = 0;i < template.length; i++) for (var i = 0;i < template.length; i++)
@ -232,5 +248,5 @@ events.on('server.ServerCommandEvent', function(listener,evt){
var exec = function(cmd){ invoker.server.dispatchCommand(invoker, cmd); }; var exec = function(cmd){ invoker.server.dispatchCommand(invoker, cmd); };
var isAlias = _intercept(''+evt.command, ''+ invoker.name, exec); var isAlias = _intercept(''+evt.command, ''+ invoker.name, exec);
if (isAlias) if (isAlias)
evt.command = "jsp void"; evt.command = 'jsp void';
}); });