This repository has been archived on 2021-07-14. You can view files and clone it, but cannot push or open issues or pull requests.
scriptcraft/src/main/js/plugins/alias/alias.js
2014-01-25 09:04:16 +00:00

243 lines
6.6 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;
player.sendMessage("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]];
player.sendMessage("Alias '" + params[0] + "' removed.");
}
else{
player.sendMessage("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){
player.sendMessage("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;
player.sendMessage("Global alias '" + o.cmd + "' created.");
};
var _list = function(params, player){
var alias = 0;
try {
if (_store.players[player.name]){
player.sendMessage("Your aliases:");
for (alias in _store.players[player.name]){
player.sendMessage(alias + " = " +
JSON.stringify(_store.players[player.name][alias]));
}
}else{
player.sendMessage("You have no player-specific aliases.");
}
player.sendMessage("Global aliases:");
for (alias in _store.global){
player.sendMessage(alias + " = " + JSON.stringify(_store.global[alias]) );
}
}catch(e){
console.error("Error in list function: " + e.message);
throw e;
}
};
var _help = function(params, player){
player.sendMessage('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){
invoker.sendMessage('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;
}
}
invoker.sendMessage('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;
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 (var 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 (var 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.
*/
events.on('player.PlayerCommandPreprocessEvent', function(listener,evt){
var invoker = evt.player;
var exec = function(cmd){ invoker.performCommand(cmd);};
var isAlias = _intercept(''+evt.message, ''+invoker.name, exec);
if (isAlias)
evt.cancelled = true;
});
/* define a 'void' command because ServerCommandEvent can't be canceled */
command('void',function(){});
events.on('server.ServerCommandEvent', function(listener,evt){
var invoker = evt.sender;
var exec = function(cmd){ invoker.server.dispatchCommand(invoker, cmd); };
var isAlias = _intercept(''+evt.command, ''+ invoker.name, exec);
if (isAlias)
evt.command = 'jsp void';
});