diff --git a/src/main/java/com/sk89q/minecraft/util/commands/CommandsManager.java b/src/main/java/com/sk89q/minecraft/util/commands/CommandsManager.java index 377f75871..b3124777d 100644 --- a/src/main/java/com/sk89q/minecraft/util/commands/CommandsManager.java +++ b/src/main/java/com/sk89q/minecraft/util/commands/CommandsManager.java @@ -260,6 +260,10 @@ public abstract class CommandsManager { return descs; } + public Map> getMethods() { + return commands; + } + /** * Get a map from command name to help message. This is only for root commands. * @@ -437,9 +441,7 @@ public abstract class CommandsManager { } } - if (!hasPermission(method, player)) { - throw new CommandPermissionsException(); - } + checkPermission(player, method); int argsCount = args.length - 1 - level; @@ -495,6 +497,12 @@ public abstract class CommandsManager { } } + protected void checkPermission(T player, Method method) throws CommandException { + if (!hasPermission(method, player)) { + throw new CommandPermissionsException(); + } + } + public void invokeMethod(Method parent, String[] args, T player, Method method, Object instance, Object[] methodArgs, int level) throws CommandException { try { diff --git a/src/main/java/com/sk89q/minecraft/util/commands/Console.java b/src/main/java/com/sk89q/minecraft/util/commands/Console.java new file mode 100644 index 000000000..9fbe34c85 --- /dev/null +++ b/src/main/java/com/sk89q/minecraft/util/commands/Console.java @@ -0,0 +1,31 @@ +// $Id$ +/* + * Copyright (C) 2010 sk89q + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +package com.sk89q.minecraft.util.commands; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * This annotation indicates that a command can be used from the console. + * + * @author sk89q + */ +@Retention(RetentionPolicy.RUNTIME) +public @interface Console { +} diff --git a/src/main/java/com/sk89q/worldedit/LocalSession.java b/src/main/java/com/sk89q/worldedit/LocalSession.java index 733f88f0b..a3a9ac961 100644 --- a/src/main/java/com/sk89q/worldedit/LocalSession.java +++ b/src/main/java/com/sk89q/worldedit/LocalSession.java @@ -640,7 +640,7 @@ public class LocalSession { // Create an edit session EditSession editSession = - new EditSession(player.getWorld(), + new EditSession(player.isPlayer() ? player.getWorld() : null, getBlockChangeLimit(), blockBag); editSession.setFastMode(fastMode); editSession.setMask(mask); diff --git a/src/main/java/com/sk89q/worldedit/WorldEdit.java b/src/main/java/com/sk89q/worldedit/WorldEdit.java index 94b8ac278..ba2e3773a 100644 --- a/src/main/java/com/sk89q/worldedit/WorldEdit.java +++ b/src/main/java/com/sk89q/worldedit/WorldEdit.java @@ -28,6 +28,7 @@ import java.lang.reflect.Method; import javax.script.ScriptException; import com.sk89q.minecraft.util.commands.*; +import com.sk89q.minecraft.util.commands.Console; import com.sk89q.util.StringUtil; import com.sk89q.worldedit.CuboidClipboard.FlipDirection; @@ -101,6 +102,15 @@ public class WorldEdit { this.config = config; commands = new CommandsManager() { + @Override + protected void checkPermission(LocalPlayer player, Method method) throws CommandException { + if (!player.isPlayer() && !method.isAnnotationPresent(Console.class)) { + throw new UnhandledCommandException(); + } + + super.checkPermission(player, method); + } + @Override public boolean hasPermission(LocalPlayer player, String perm) { return player.hasPermission(perm); @@ -120,9 +130,12 @@ public class WorldEdit { logMode = loggingAnnotation.value(); } - String msg = "WorldEdit: " + player.getName() + " (in \"" + player.getWorld().getName() - + "\")" + ": " + StringUtil.joinString(args, " "); - if (logMode != null) { + String msg = "WorldEdit: " + player.getName(); + if (player.isPlayer()) { + msg += " (in \"" + player.getWorld().getName() + "\")"; + } + msg += ": " + StringUtil.joinString(args, " "); + if (logMode != null && player.isPlayer()) { Vector position = player.getPosition(); final LocalSession session = getSession(player); switch (logMode) { diff --git a/src/main/java/com/sk89q/worldedit/bukkit/WorldEditCommand.java b/src/main/java/com/sk89q/worldedit/bukkit/WorldEditCommand.java new file mode 100644 index 000000000..a97bc89b4 --- /dev/null +++ b/src/main/java/com/sk89q/worldedit/bukkit/WorldEditCommand.java @@ -0,0 +1,28 @@ +package com.sk89q.worldedit.bukkit; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.bukkit.command.CommandSender; +import com.sk89q.minecraft.util.commands.Command; +import com.sk89q.minecraft.util.commands.CommandPermissions; + +public class WorldEditCommand extends org.bukkit.command.Command { + + public WorldEditCommand(Command command, CommandPermissions commandPermissions) { + super(command.aliases()[0]); + this.description = command.desc(); + this.usageMessage = "/"+getName()+" "+command.usage(); + + List aliases = new ArrayList(Arrays.asList(command.aliases())); + aliases.remove(0); + this.setAliases(aliases); + } + + @Override + public boolean execute(CommandSender sender, String currentAlias, String[] args) { + // This method is never called. + return true; + } +} diff --git a/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java b/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java index 6f72c3dc8..0e6c1e3a0 100644 --- a/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java +++ b/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java @@ -31,7 +31,6 @@ import java.util.zip.ZipEntry; import com.sk89q.util.yaml.YAMLProcessor; import com.sk89q.wepif.PermissionsResolverManager; import org.bukkit.World; -import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.event.Event.Priority; @@ -222,15 +221,8 @@ public class WorldEditPlugin extends JavaPlugin { * Called on WorldEdit command. */ @Override - public boolean onCommand(CommandSender sender, Command cmd, + public boolean onCommand(CommandSender sender, org.bukkit.command.Command cmd, String commandLabel, String[] args) { - // Since WorldEdit is primarily made for use in-game, we're going - // to ignore the situation where the command sender is not a player. - if (!(sender instanceof Player)) { - return true; - } - - Player player = (Player) sender; // Add the command to the array because the underlying command handling // code of WorldEdit expects it @@ -238,7 +230,7 @@ public class WorldEditPlugin extends JavaPlugin { System.arraycopy(args, 0, split, 1, args.length); split[0] = "/" + cmd.getName(); - controller.handleCommand(wrapPlayer(player), split); + controller.handleCommand(wrapCommandSender(sender), split); return true; }