Fixed issue with stack trace in console when empty commands entered. Added more example modules

This commit is contained in:
walterhiggins 2013-12-30 01:07:41 +00:00
parent dbf6adfadc
commit fc440654b8
16 changed files with 240 additions and 96 deletions

View file

@ -767,7 +767,7 @@ The utils.at() function will perform a given task at a given time every
* time24hr : The time in 24hr form - e.g. 9:30 in the morning is "09:30" while
9:30 pm is "21:30", midnight is "00:00" and midday is "12:00"
* callback : A javascript function which will be invoked at the given time.
* world : (optional) Each world has its own clock. If no world is specified, the server's first world is used.
* worlds : (optional) An array of worlds. Each world has its own clock. If no array of worlds is specified, all the server's worlds are used.
#### Example
@ -781,7 +781,7 @@ To warn players when night is approaching...
player.chat("The night is dark and full of terrors!");
});
}, self.world);
});
### utils.find() function
@ -838,8 +838,8 @@ The following chat-formatting methods are added to the javascript String class..
Example
-------
var boldGoldText = "Hello World".bold().gold();
self.sendMessage(boldGoldText);
/js var boldGoldText = "Hello World".bold().gold();
/js self.sendMessage(boldGoldText);
<p style="color:gold;font-weight:bold">Hello World</p>

View file

@ -4,6 +4,10 @@ Bug Fix: [Can't get Scriptcraft core libraries working][bug103].
[bug103]: https://github.com/walterhiggins/ScriptCraft/issues/103
Bug Fix; Server console errors when empty commands submitted.
Added more example modules.
# 2013 12 28
Documented the 'homes' module other tweaks to documentation.

View file

@ -0,0 +1,59 @@
/*
command management - allow for non-ops to execute approved javascript code.
*/
var _commands = {};
var _cmdInterceptors = [];
/*
execute a JSP command.
*/
var executeCmd = function(args, player){
if (args.length === 0)
throw new Error("Usage: jsp command-name command-parameters");
var name = args[0];
var cmd = _commands[name];
if (typeof cmd === "undefined"){
// it's not a global command - pass it on to interceptors
var intercepted = false;
for (var i = 0;i < _cmdInterceptors.length;i++){
if (_cmdInterceptors[i](args,player))
intercepted = true;
}
if (!intercepted)
console.warn('Command %s is not recognised',name);
}else{
func = cmd.callback;
var params = [];
for (var i =1; i < args.length;i++){
params.push("" + args[i]);
}
var result = null;
try {
result = func(params,player);
}catch (e){
console.error("Error while trying to execute command: " + JSON.stringify(params));
throw e;
}
return result;
}
};
/*
define a new JSP command.
*/
var defineCmd = function(name, func, options, intercepts) {
if (typeof options == "undefined")
options = [];
_commands[name] = {callback: func, options: options};
if (intercepts)
_cmdInterceptors.push(func);
return func;
};
var _command = function(name, func, options, intercepts) {
if (typeof name == "undefined"){
// it's an invocation from the Java Plugin!
return executeCmd(__cmdArgs, self);
}else{
return defineCmd(name, func, options, intercepts);
}
};
exports.command = _command;
exports.commands = _commands;

View file

@ -49,63 +49,8 @@ var _plugin = function(/* String */ moduleName, /* Object */ moduleObject, isPer
}
return moduleObject;
};
/*
allow for deferred execution (once all modules have loaded)
*/
var _deferred = [];
var _ready = function( func ){
_deferred.push(func);
};
var _cmdInterceptors = [];
/*
command management - allow for non-ops to execute approved javascript code.
*/
var _commands = {};
exports.commands = _commands;
var _command = function(name,func,options,intercepts)
{
if (typeof name == "undefined"){
// it's an invocation from the Java Plugin!
if (__cmdArgs.length === 0)
throw new Error("Usage: jsp command-name command-parameters");
var name = __cmdArgs[0];
var cmd = _commands[name];
if (typeof cmd === "undefined"){
// it's not a global command - pass it on to interceptors
var intercepted = false;
for (var i = 0;i < _cmdInterceptors.length;i++){
if (_cmdInterceptors[i](__cmdArgs))
intercepted = true;
}
if (!intercepted)
self.sendMessage("Command '" + name + "' is not recognised");
}else{
func = cmd.callback;
var params = [];
for (var i =1; i < __cmdArgs.length;i++){
params.push("" + __cmdArgs[i]);
}
var result = null;
try {
result = func(params);
}catch (e){
console.error("Error while trying to execute command: " + JSON.stringify(params));
throw e;
}
return result;
}
}else{
if (typeof options == "undefined")
options = [];
_commands[name] = {callback: func, options: options};
if (intercepts)
_cmdInterceptors.push(func);
return func;
}
};
exports.plugin = _plugin;
exports.command = _command;
exports.save = _save;
var scriptCraftDir = null;
@ -172,6 +117,7 @@ exports.autoload = function(dir) {
};
_reload(pluginDir);
};
addUnloadHandler(function(){
//
// save all plugins which have persistent data

View file

@ -565,11 +565,11 @@ var server = org.bukkit.Bukkit.server;
global.require = fnRequire(__plugin.logger, __engine, config.verbose, jsPluginsRootDirName, modulePaths);
global.console = require('console');
global.command = require('command').command;
var plugins = require('plugin');
global._onTabComplete = require('tabcomplete');
global.plugin = plugins.plugin;
global.command = plugins.command;
global.save = plugins.save;
var events = require('events');

View file

@ -1,4 +1,4 @@
var _commands = require('plugin').commands;
var _commands = require('command').commands;
/*
Tab completion for the /jsp commmand
*/

View file

@ -35,8 +35,8 @@ The following chat-formatting methods are added to the javascript String class..
Example
-------
var boldGoldText = "Hello World".bold().gold();
self.sendMessage(boldGoldText);
/js var boldGoldText = "Hello World".bold().gold();
/js self.sendMessage(boldGoldText);
<p style="color:gold;font-weight:bold">Hello World</p>

View file

@ -149,7 +149,7 @@ var _foreach = function(array, callback, object, delay, onCompletion) {
if (delay){
var next = function(){ callback(array[i],i,object,array); i++;};
var hasNext = function(){return i < len;};
utils.nicely(next,hasNext,onCompletion,delay);
_nicely(next,hasNext,onCompletion,delay);
}else{
for (;i < len; i++){
callback(array[i],i,object,array);
@ -182,17 +182,18 @@ function and the start of the next `next()` function.
See the source code to utils.foreach for an example of how utils.nicely is used.
***/
exports.nicely = function(next, hasNext, onDone, delay){
var _nicely = function(next, hasNext, onDone, delay){
if (hasNext()){
next();
server.scheduler.runTaskLater(__plugin,function(){
utils.nicely(next,hasNext,onDone,delay);
_nicely(next,hasNext,onDone,delay);
},delay);
}else{
if (onDone)
onDone();
}
};
exports.nicely = _nicely;
/************************************************************************
### utils.at() function
@ -204,7 +205,7 @@ The utils.at() function will perform a given task at a given time every
* time24hr : The time in 24hr form - e.g. 9:30 in the morning is "09:30" while
9:30 pm is "21:30", midnight is "00:00" and midday is "12:00"
* callback : A javascript function which will be invoked at the given time.
* world : (optional) Each world has its own clock. If no world is specified, the server's first world is used.
* worlds : (optional) An array of worlds. Each world has its own clock. If no array of worlds is specified, all the server's worlds are used.
#### Example
@ -218,10 +219,10 @@ To warn players when night is approaching...
player.chat("The night is dark and full of terrors!");
});
}, self.world);
});
***/
exports.at = function(time24hr, callback, world) {
exports.at = function(time24hr, callback, worlds) {
var forever = function(){ return true;};
var timeParts = time24hr.split(":");
var hrs = ((timeParts[0] * 1000) + 18000) % 24000;
@ -230,15 +231,17 @@ exports.at = function(time24hr, callback, world) {
mins = (timeParts[1] / 60) * 1000;
var timeMc = hrs + mins;
if (typeof world == "undefined"){
world = server.worlds.get(0);
if (typeof worlds == "undefined"){
worlds = server.worlds;
}
utils.nicely(function(){
var time = world.getTime();
var diff = timeMc - time;
if (diff > 0 && diff < 100){
callback();
}
_nicely(function(){
_foreach (worlds, function (world){
var time = world.getTime();
var diff = timeMc - time;
if (diff > 0 && diff < 100){
callback();
}
});
},forever, null, 100);
};

View file

@ -149,20 +149,22 @@ var alias = plugin('alias', {
}, true );
var aliasCmd = command('alias', function(params){
var aliasCmd = command('alias', function(params,invoker){
var operation = params[0];
if (!operation){
self.sendMessage("Usage:\n" + _usage);
invoker.sendMessage("Usage:\n" + _usage);
return;
}
if (alias[operation])
alias[operation](self, params.slice(1));
alias[operation](invoker, params.slice(1));
else
self.sendMessage("Usage:\n" + _usage);
invoker.sendMessage("Usage:\n" + _usage);
});
var _intercept = function( msg, invoker, exec)
{
if (msg.trim().length == 0)
return false;
var msgParts = msg.split(' ');
var command = msg.match(/^\/*([^\s]+)/)[1];

View file

@ -86,14 +86,24 @@ exports.commando = function(name, func, options, intercepts){
events.on('player.PlayerCommandPreprocessEvent', function(l,e){
var msg = "" + e.message;
var command = msg.match(/^\/([^\s]+)/)[1];
var parts = msg.match(/^\/([^\s]+)/);
if (!parts)
return;
if (parts.length < 2)
return;
var command = parts[1];
if (commands[command]){
e.message = "/jsp " + msg.replace(/^\//,"");
}
});
events.on('server.ServerCommandEvent', function(l,e){
var msg = "" + e.command;
var command = msg.match(/^\/*([^\s]+)/)[1];
var parts = msg.match(/^\/*([^\s]+)/);
if (!parts)
return;
if (parts.length < 2)
return;
var command = parts[1];
if (commands[command]){
e.command = "jsp " + msg.replace(/^\//,"");
}

View file

@ -1,12 +0,0 @@
/*
A simple minecraft plugin.
Usage: At the in-game prompt type ...
/js hello()
... and a message `Hello {player-name}` will appear (where {player-name} is
replaced by your own name).
*/
exports.hello = function(){
echo("Hello " + self.name);
};

View file

@ -0,0 +1,20 @@
/*
A simple minecraft plugin.
Usage: At the in-game prompt type ...
/js hello(self)
... and a message `Hello {player-name}` will appear (where {player-name} is
replaced by your own name).
This example demonstrates the basics of adding new functionality which is only
usable by server operators or users with the scriptcraft.evaluate permission.
By default, only ops are granted this permission.
The `hello` function below is only usable by players with the scriptcraft.evaluate
permission since it relies on the `/js` command to execute.
*/
exports.hello = function(player){
player.sendMessage('Hello ' + player.name);
};

View file

@ -0,0 +1,24 @@
/*
A simple minecraft plugin.
Usage: At the in-game prompt type ...
/jsp hello
... and a message `Hello {player-name}` will appear (where {player-name} is
replaced by your own name).
This example demonstrates the basics of adding new functionality
which is usable all players or those with the scriptcraft.proxy
permission. By default, all players are granted this permission.
This differs from example 1 in that a new 'jsp ' command extension
is defined. Since all players can use the `jsp` command, all players
can use the new extension. Unlike the previous example, the `jsp
hello` command does not evaluate javascript code so this command is
much more secure.
*/
command('hello', function (parameters, player) {
player.sendMessage('Hello ' + player.name);
});

View file

@ -0,0 +1,30 @@
/*
A simple minecraft plugin.
Usage: At the in-game prompt type ...
/jsp op-hello
... and a message `Hello {player-name}` will appear (where {player-name} is
replaced by your own name).
This example demonstrates the basics of adding new functionality
which is usable all players or those with the scriptcraft.proxy
permission. By default, all players are granted this permission. In
this command though, the function checks to see if the player is an
operator and if they aren't will return immediately.
This differs from example 2 in that the function will only print a
message for operators.
*/
command('op-hello', function (parameters, player) {
/*
this is how you limit based on player privileges
*/
if (!player.op){
player.sendMessage('Only operators can do this.');
return;
}
player.sendMessage('Hello ' + player.name);
});

View file

@ -0,0 +1,29 @@
/*
A simple minecraft plugin.
Usage: At the in-game prompt type ...
/jsp hello-params Hi
/jsp hello-params Saludos
/jsp hello-params Greetings
... and a message `Hi {player-name}` or `Saludos {player-name}` etc
will appear (where {player-name} is replaced by your own name).
This example demonstrates adding and using parameters in commands.
This differs from example 3 in that the greeting can be changed from
a fixed 'Hello ' to anything you like by passing a parameter.
*/
command('hello-params', function (parameters, player) {
/*
parameters is an array (or list) of strings. parameters[0]
refers to the first element in the list. Arrays in Javascript
are 0-based. That is, the 1st element is parameters[0], the 2nd
element is parameters[1], the 3rd element is parameters[2] and
so on. In this example, parameters[1] refers to the first word
which appears after `jsp hello-params `.
*/
var salutation = parameters[0] ;
player.sendMessage( salutation + ' ' + player.name);
});

View file

@ -0,0 +1,29 @@
/*
A simple minecraft plugin.
Usage: At the in-game prompt type ...
/jsp hello-module
... and a message `Hello {player-name}` will appear (where {player-name} is
replaced by your own name).
This example demonstrates the use of modules. In
example-1-hello-module.js we created a new javascript module. In
this example, we use that module...
* We load the module using the `require()` function. Because this
module and the module we require are n the same directory, we
specify `'./example-1-hello-module'` as the path (when loading a
module from the same directory, `./` at the start of the path
indicates that the file should be searched for in the same
directory.
* We assign the loaded module to a variable (`greetings`) and then
use the module's `hello` method to display the message.
*/
var greetings = require('./example-1-hello-module');
command('hello-module', function( parameters, player ){
greetings.hello(player);
});