diff --git a/src/main/java/canary/org/scriptcraftjs/canarymod/ScriptCraftPlugin.java b/src/main/java/canary/org/scriptcraftjs/canarymod/ScriptCraftPlugin.java index df3e33a44..07d8f19fd 100644 --- a/src/main/java/canary/org/scriptcraftjs/canarymod/ScriptCraftPlugin.java +++ b/src/main/java/canary/org/scriptcraftjs/canarymod/ScriptCraftPlugin.java @@ -13,7 +13,10 @@ import net.canarymod.tasks.TaskOwner; import net.canarymod.commandsys.CommandListener; import net.canarymod.commandsys.Command; +import net.canarymod.commandsys.CanaryCommand; +import net.canarymod.commandsys.DynamicCommandAnnotation; import net.canarymod.commandsys.TabComplete; +import net.canarymod.commandsys.CommandDependencyException; import net.canarymod.chat.MessageReceiver; import net.canarymod.Canary; import net.canarymod.api.inventory.recipes.CraftingRecipe; @@ -24,6 +27,8 @@ import net.canarymod.plugin.PluginListener; import net.canarymod.hook.Hook; +import static net.canarymod.Canary.log; + public class ScriptCraftPlugin extends Plugin implements PluginListener, CommandListener { public boolean canary = true; @@ -156,4 +161,46 @@ public List jsComplete(MessageReceiver sender, String[] args){ public List jspComplete(MessageReceiver sender, String[] args){ return complete(sender, args, "jsp"); } + + public void registerCommand(String[] aliases) + { + DynamicCommandAnnotation meta = new DynamicCommandAnnotation( + aliases, + new String[] {""}, // permissions + "Description goes here", + "Tip goes here", + "", // parent + "", // help lookup + new String [] {""}, // search terms + 0, // min + -1, // max + "", // tabcomplete function + 1 // version + ); + + CanaryCommand ccmd = new CanaryCommand(meta, this, null, null) { + @Override + protected void execute(MessageReceiver caller, String[] parameters) { + try { + log.info("Executing cmd " + parameters[0]); + executeCommand(caller, parameters); + } + catch (Exception ex) + { + ex.printStackTrace(); + log.warn("Could not execute command...", ex.getCause()); + } + } + }; + + try { + Canary.commands().registerCommand(ccmd, this, false); + } + catch (CommandDependencyException ex) + { + ex.printStackTrace(); + log.warn("Could not register command...", ex.getCause()); + } + + } } diff --git a/src/main/js/lib/command.js b/src/main/js/lib/command.js index 2ba6a4d29..9d47473db 100644 --- a/src/main/js/lib/command.js +++ b/src/main/js/lib/command.js @@ -2,12 +2,12 @@ /* command management - allow for non-ops to execute approved javascript code. */ -var _commands = {}, +var _jspcommands = {}, _cmdInterceptors = []; /* execute a JSP command. */ -var executeCmd = function( args, player ) { +var executeJspCmd = function( args, player ) { var name, cmd, intercepted, @@ -17,7 +17,7 @@ var executeCmd = function( args, player ) { throw new Error('Usage: jsp command-name command-parameters'); } name = args[0]; - cmd = _commands[name]; + cmd = _jspcommands[name]; if ( typeof cmd === 'undefined' ) { // it's not a global command - pass it on to interceptors intercepted = false; @@ -41,7 +41,7 @@ var executeCmd = function( args, player ) { /* define a new JSP command. */ -var defineCmd = function( name, func, options, intercepts ) { +var defineJspCmd = function( name, func, options, intercepts ) { if ( typeof name == 'function'){ intercepts = options; @@ -53,12 +53,48 @@ var defineCmd = function( name, func, options, intercepts ) { if ( typeof options == 'undefined' ) { options = []; } - _commands[name] = { callback: func, options: options }; + _jspcommands[name] = { callback: func, options: options }; if ( intercepts ) { _cmdInterceptors.push(func); } return func; }; -exports.command = defineCmd; -exports.commands = _commands; -exports.exec = executeCmd; + +// the next 3 should be renamed to reflect their jsp-ness +exports.command = defineJspCmd; +exports.commands = _jspcommands; +exports.exec = executeJspCmd; + + +// New non-jsp commands + +var _commands = {}; + +var registerCommand = function( name, func ) +{ + _commands[name] = { callback: func }; + __plugin.registerCommand([name]); +} + +var executeCommand = function(args, player) +{ + var name = args[0]; + var cmd = _commands[name]; + var result = null; + + if ( typeof cmd === 'undefined' ) { + console.warn( 'Command %s is not recognised ('+JSON.stringify(args)+')' , name ); + return null; + } + + try { + result = cmd.callback( args.slice(1), player ); + } catch ( e ) { + console.error( 'Error while trying to execute command: ' + JSON.stringify( args ) ); + throw e; + } + return result; +} + +exports.registerCommand = registerCommand; +exports.executeCommand = executeCommand; \ No newline at end of file diff --git a/src/main/js/lib/events-bukkit.js b/src/main/js/lib/events-bukkit.js index a2577c90a..feba8a59b 100644 --- a/src/main/js/lib/events-bukkit.js +++ b/src/main/js/lib/events-bukkit.js @@ -29,7 +29,9 @@ exports.on = function( /* function( registeredListener, event) */ handler, /* (optional) String (HIGH, HIGHEST, LOW, LOWEST, NORMAL, MONITOR), */ - priority ) { + priority, + /* (optional) boolean Default true. Set false if you want cancelled events */ + ignore_cancelled ) { var handlerList, regd, eventExecutor; @@ -39,6 +41,9 @@ exports.on = function( } else { priority = bkEventPriority[priority.toUpperCase().trim()]; } + if ( typeof ignore_cancelled == 'undefined' ) { + ignore_cancelled = true; + } handlerList = getHandlerListForEventType (eventType); var result = { }; @@ -69,7 +74,7 @@ exports.on = function( The workaround is to make the ScriptCraftPlugin java class a Listener. Should only unregister() registered plugins in ScriptCraft js code. */ - regd = new bkRegisteredListener( __plugin, eventExecutor, priority, __plugin, true ); + regd = new bkRegisteredListener( __plugin, eventExecutor, priority, __plugin, ignore_cancelled ); handlerList.register( regd ); result.unregister = function(){ handlerList.unregister( regd ); diff --git a/src/main/js/lib/scriptcraft.js b/src/main/js/lib/scriptcraft.js index 5519ac6d2..6fe49f971 100644 --- a/src/main/js/lib/scriptcraft.js +++ b/src/main/js/lib/scriptcraft.js @@ -564,6 +564,7 @@ function __onEnable ( __engine, __plugin, __script ) { fnBody; if ( __plugin.canary ) { + logger.info("Got cmd: "+arguments[1][0]); sender = arguments[0]; args = arguments[1]; cmdName = (''+args[0]).toLowerCase().replace(/^\//,''); @@ -631,10 +632,16 @@ function __onEnable ( __engine, __plugin, __script ) { } } } - if ( cmdName == 'jsp' ) { + else if ( cmdName == 'jsp' ) { cmdModule.exec( jsArgs, sender ); result = true; } + else + { + // Non-jsp commands + var args = [cmdName].concat(jsArgs); + result = cmdModule.executeCommand(args, sender); + } return result; } // end __onCommand() function @@ -750,6 +757,7 @@ function __onEnable ( __engine, __plugin, __script ) { var cmdModule = require('command'); global.command = cmdModule.command; + global.registerCommand = cmdModule.registerCommand; var plugins = require('plugin'); global.__onTabComplete = require('tabcomplete'); global.plugin = plugins.plugin; @@ -766,5 +774,6 @@ function __onEnable ( __engine, __plugin, __script ) { __onDisableImpl = _onDisable; global.__onCommand = __onCommand; plugins.autoload( global, new File(jsPluginsRootDir,'plugins') ); + plugins.autoload( global, new File(jsPluginsRootDir,'mods') ); require('legacy-check')(jsPluginsRootDir); }