19162c3688
Some of the plugins are not yet supported. If you're feeling brave you can build from source using ant.
254 lines
6.7 KiB
JavaScript
254 lines
6.7 KiB
JavaScript
'use strict';
|
|
/*************************************************************************
|
|
## alias Plugin
|
|
|
|
The alias module lets players and server admins create their own
|
|
per-player or global custom in-game command aliases.
|
|
|
|
### Examples
|
|
|
|
To set a command alias which is only visible to the current player
|
|
(per-player alias)...
|
|
|
|
/jsp alias set cw = time set {1} ; weather {2}
|
|
|
|
... Creates a new custom command only usable by the player who set
|
|
it called `cw` (short for set Clock and Weather) which when invoked...
|
|
|
|
/cw 4000 sun
|
|
|
|
... will perform the following commands...
|
|
|
|
/time set 4000
|
|
/weather sun
|
|
|
|
Aliases can use paramters as above. On the right hand side of the `=`, the
|
|
`{1}` refers to the first parameter provided with the `cw` alias, `{2}`
|
|
refers to the second parameter and so on. So `cw 4000 sun` is converted to
|
|
`time set 4000` and `weather sun`.
|
|
|
|
To set a global command alias usable by all (only operators can create
|
|
such an alias)...
|
|
|
|
/jsp alias global stormy = time 18000; weather storm
|
|
|
|
To remove an alias ...
|
|
|
|
/jsp alias remove cw
|
|
|
|
... removes the 'cw' alias from the appropriate alias map.
|
|
|
|
To get a list of aliases currently defined...
|
|
|
|
/jsp alias list
|
|
|
|
To get help on the `jsp alias` command:
|
|
|
|
/jsp alias help
|
|
|
|
Aliases can be used at the in-game prompt by players or in the server
|
|
console. Aliases will not be able to avail of command autocompletion
|
|
(pressing the TAB key will have no effect).
|
|
|
|
***/
|
|
|
|
var _usage = '\
|
|
/jsp alias set {alias} = {comand-1} ;{command-2}\n \
|
|
/jsp alias global {alias} = {command-1} ; {command-2}\n \
|
|
/jsp alias list\n \
|
|
/jsp alias remove {alias}\n \
|
|
Create a new alias : \n \
|
|
/jsp alias set cw = time set {1} ; weather {2}\n \
|
|
Execute the alias : \n \
|
|
/cw 4000 sun \n \
|
|
...is the same as \'/time set 4000\' and \'/weather sun\'';
|
|
/*
|
|
persist aliases
|
|
*/
|
|
var _store = {
|
|
players: {},
|
|
global: {}
|
|
};
|
|
/*
|
|
turns 'cw = time set {1} ; weather {2}' into {cmd: 'cw', aliases: ['time set {1}', 'weather {2}']}
|
|
_processParams is a private function which takes an array of parameters
|
|
used for the 'set' and 'global' options.
|
|
*/
|
|
var _processParams = function( params ) {
|
|
var paramStr = params.join(' '),
|
|
eqPos = paramStr.indexOf('='),
|
|
aliasCmd = paramStr.substring( 0, eqPos).trim(),
|
|
aliasValue = paramStr.substring( eqPos + 1 ).trim();
|
|
return {
|
|
cmd: aliasCmd,
|
|
aliases: aliasValue.split( /\s*;\s*/ )
|
|
};
|
|
};
|
|
|
|
var _set = function( params, player ) {
|
|
var playerAliases = _store.players[player.name];
|
|
if (!playerAliases ) {
|
|
playerAliases = {};
|
|
}
|
|
var o = _processParams( params );
|
|
playerAliases[o.cmd] = o.aliases;
|
|
_store.players[player.name] = playerAliases;
|
|
echo( player, 'Alias ' + o.cmd + ' created.' );
|
|
};
|
|
|
|
var _remove = function( params, player ) {
|
|
if ( _store.players[player.name] && _store.players[player.name][ params[0] ] ) {
|
|
delete _store.players[player.name][params[0]];
|
|
echo( player, 'Alias ' + params[0] + ' removed.' );
|
|
}
|
|
else{
|
|
echo( player, 'Alias ' + params[0] + ' does not exist.' );
|
|
}
|
|
if ( player.op ) {
|
|
if ( _store.global[params[0]] ) {
|
|
delete _store.global[params[0]];
|
|
}
|
|
}
|
|
};
|
|
|
|
var _global = function( params, player ) {
|
|
if ( !player.op ) {
|
|
echo( player, 'Only operators can set global aliases. ' +
|
|
'You need to be an operator to perform this command.' );
|
|
return;
|
|
}
|
|
var o = _processParams( params );
|
|
_store.global[o.cmd] = o.aliases;
|
|
echo( player, 'Global alias ' + o.cmd + ' created.' );
|
|
};
|
|
|
|
var _list = function( params, player ) {
|
|
var alias = 0;
|
|
try {
|
|
if ( _store.players[player.name] ) {
|
|
echo( player, 'Your aliases:');
|
|
for ( alias in _store.players[player.name] ) {
|
|
echo( player, alias + ' = ' +
|
|
JSON.stringify( _store.players[player.name][alias] ) );
|
|
}
|
|
} else {
|
|
echo( player, 'You have no player-specific aliases.' );
|
|
}
|
|
echo( player, 'Global aliases:' );
|
|
for ( alias in _store.global ) {
|
|
echo( player, alias + ' = ' + JSON.stringify( _store.global[alias] ) );
|
|
}
|
|
} catch( e ) {
|
|
console.error( 'Error in list function: ' + e.message );
|
|
throw e;
|
|
}
|
|
};
|
|
var _help = function( params, player ) {
|
|
echo( player, 'Usage:\n' + _usage );
|
|
};
|
|
|
|
var alias = plugin( 'alias', {
|
|
store: _store,
|
|
set: _set,
|
|
global: _global,
|
|
remove: _remove,
|
|
list: _list,
|
|
help: _help
|
|
}, true );
|
|
|
|
var aliasCmd = command( 'alias', function( params, invoker ) {
|
|
var operation = params[0],
|
|
fn;
|
|
if ( !operation ) {
|
|
echo( invoker, 'Usage:\n' + _usage );
|
|
return;
|
|
}
|
|
/*
|
|
wph 20140122 this is kind of dumb but Nashorn has some serious problems
|
|
accessing object properties by array index notation
|
|
in JRE8 alias[operation] returns null - definitely a bug in Nashorn.
|
|
*/
|
|
for ( var key in alias ) {
|
|
if ( key == operation ) {
|
|
fn = alias[key];
|
|
fn( params.slice(1), invoker );
|
|
return;
|
|
}
|
|
}
|
|
echo( invoker, 'Usage:\n' + _usage );
|
|
});
|
|
|
|
var _intercept = function( msg, invoker, exec ) {
|
|
if ( msg.trim().length == 0 )
|
|
return false;
|
|
var msgParts = msg.split(' '),
|
|
command = msg.match( /^\/*([^\s]+)/ )[1],
|
|
template = [],
|
|
isAlias = false,
|
|
cmds = [],
|
|
commandObj,
|
|
filledinCommand,
|
|
i;
|
|
|
|
if ( _store.global[command] ) {
|
|
template = _store.global[command];
|
|
isAlias = true;
|
|
}
|
|
/*
|
|
allows player-specific aliases to override global aliases
|
|
*/
|
|
if ( _store.players[invoker] && _store.players[invoker][command] ) {
|
|
template = _store.players[invoker][command];
|
|
isAlias = true;
|
|
}
|
|
for ( i = 0; i < template.length; i++) {
|
|
filledinCommand = template[i].replace( /{([0-9]+)}/g, function( match, index ) {
|
|
index = parseInt( index, 10 );
|
|
if ( msgParts[index] ) {
|
|
return msgParts[index];
|
|
} else {
|
|
return match;
|
|
}
|
|
});
|
|
cmds.push( filledinCommand );
|
|
}
|
|
|
|
for (i = 0; i< cmds.length; i++ ) {
|
|
exec( cmds[i] );
|
|
}
|
|
return isAlias;
|
|
|
|
};
|
|
/*
|
|
Intercept all command processing and replace with aliased commands if the
|
|
command about to be issued matches an alias.
|
|
*/
|
|
if (__plugin.canary){
|
|
console.warn('alias plugin is not yet supported in CanaryMod');
|
|
return;
|
|
}
|
|
events.playerCommandPreprocess( function( evt ) {
|
|
var invoker = evt.player;
|
|
var exec = function( cmd ) {
|
|
invoker.performCommand(cmd);
|
|
};
|
|
var isAlias = _intercept( (''+evt.message).trim(), ''+invoker.name, exec);
|
|
if ( isAlias ) {
|
|
evt.cancelled = true;
|
|
}
|
|
});
|
|
/* define a 'void' command because ServerCommandEvent can't be canceled */
|
|
command('void',function( ) {
|
|
} );
|
|
|
|
events.serverCommand( function( evt ) {
|
|
var invoker = evt.sender;
|
|
var exec = function( cmd ) {
|
|
invoker.server.dispatchCommand( invoker, cmd);
|
|
};
|
|
var isAlias = _intercept( (''+evt.command).trim(), ''+ invoker.name, exec );
|
|
if ( isAlias ) {
|
|
evt.command = 'jsp void';
|
|
}
|
|
});
|