diff --git a/src/main/java/org/ultramine/commands/Command.java b/src/main/java/org/ultramine/commands/Command.java new file mode 100644 index 0000000..f971742 --- /dev/null +++ b/src/main/java/org/ultramine/commands/Command.java @@ -0,0 +1,17 @@ +package org.ultramine.commands; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface Command +{ + public String name(); + public String group(); + public String[] aliases() default {}; + public String[] permissions() default {}; + public boolean isUsableFromServer() default true; +} \ No newline at end of file diff --git a/src/main/java/org/ultramine/commands/CommandContext.java b/src/main/java/org/ultramine/commands/CommandContext.java index 9414a4a..bc834bc 100644 --- a/src/main/java/org/ultramine/commands/CommandContext.java +++ b/src/main/java/org/ultramine/commands/CommandContext.java @@ -2,10 +2,12 @@ import net.minecraft.block.Block; import net.minecraft.command.CommandBase; +import net.minecraft.command.CommandException; import net.minecraft.command.ICommandSender; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.Item; import net.minecraft.util.IChatComponent; +import org.ultramine.server.PermissionHandler; public class CommandContext { @@ -112,4 +114,10 @@ { CommandBase.notifyAdmins(sender, messageKey, messageArgs); } + + public void checkSenderPermission(String permission) + { + if (!PermissionHandler.getInstance().has(sender, permission)) + throw new CommandException("commands.generic.permission"); + } } diff --git a/src/main/java/org/ultramine/commands/IExtendedCommand.java b/src/main/java/org/ultramine/commands/IExtendedCommand.java index e17eb1e..538195c 100644 --- a/src/main/java/org/ultramine/commands/IExtendedCommand.java +++ b/src/main/java/org/ultramine/commands/IExtendedCommand.java @@ -4,4 +4,6 @@ public interface IExtendedCommand extends ICommand { -} + public String getDescription(); + public String getGroup(); +} \ No newline at end of file diff --git a/src/main/java/org/ultramine/commands/MethodBasedCommand.java b/src/main/java/org/ultramine/commands/MethodBasedCommand.java index f8bc0c7..1fb2ef3 100644 --- a/src/main/java/org/ultramine/commands/MethodBasedCommand.java +++ b/src/main/java/org/ultramine/commands/MethodBasedCommand.java @@ -1,26 +1,69 @@ package org.ultramine.commands; +import net.minecraft.command.CommandException; import net.minecraft.command.CommandNotFoundException; import net.minecraft.command.ICommand; import net.minecraft.command.ICommandSender; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.ultramine.commands.completion.CommandCompletionHandler; +import org.ultramine.server.PermissionHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; public class MethodBasedCommand implements IExtendedCommand { - private static Logger logger = LogManager.getLogger(); + private static final Logger logger = LogManager.getLogger(); private String name; private String usage; - private List aliases; + private String group; + private String description; + private Method method; private CommandCompletionHandler completionHandler; + private List aliases = new ArrayList(); + private String[] permissions; + private boolean isUsableFromServer = true; + + public MethodBasedCommand(String name, String group, Method method) + { + this.name = name; + this.group = group; + this.method = method; + this.usage = "command." + name + ".usage"; + this.description = "command." + name + ".description"; + } + + public MethodBasedCommand withAliases(String... aliases) + { + this.aliases = Arrays.asList(aliases); + return this; + } + + public MethodBasedCommand withCompletionHandler(CommandCompletionHandler completionHandler) + { + this.completionHandler = completionHandler; + return this; + } + + public MethodBasedCommand withPermissions(String[] permissions) + { + this.permissions = permissions; + return this; + } + + public MethodBasedCommand withUsableFromServer(boolean isUsableFromServer) + { + this.isUsableFromServer = isUsableFromServer; + return this; + } + @Override public String getCommandName() { @@ -34,6 +77,18 @@ } @Override + public String getDescription() + { + return description; + } + + @Override + public String getGroup() + { + return group; + } + + @Override public List getCommandAliases() { return aliases; @@ -53,27 +108,37 @@ } catch (InvocationTargetException e) { - logger.error("Error while invoking method for command " + name, e); - throw new CommandNotFoundException(); + if (e.getCause() == null) + { + logger.error("Error while invoking method for command " + name, e); + throw new CommandNotFoundException(); + } + else if (e.getCause() instanceof CommandException) + throw (CommandException) e.getCause(); + else + throw new RuntimeException("Error while invoking method for command " + name, e.getCause()); } } @Override public boolean canCommandSenderUseCommand(ICommandSender var1) { - return false; + return (isUsableFromServer && var1.getCommandSenderName().equals("Server")) || PermissionHandler.getInstance().hasAny(var1, permissions); } @Override public List addTabCompletionOptions(ICommandSender var1, String[] var2) { + if (completionHandler == null) + return null; + return completionHandler.getCompletionOptions(var2); } @Override public boolean isUsernameIndex(String[] var1, int var2) { - return completionHandler.isUsernameIndex(var2); + return completionHandler != null && completionHandler.isUsernameIndex(var2); } @Override diff --git a/src/main/java/org/ultramine/commands/VanillaCommandWrapper.java b/src/main/java/org/ultramine/commands/VanillaCommandWrapper.java index 0dee3a8..f121bab 100644 --- a/src/main/java/org/ultramine/commands/VanillaCommandWrapper.java +++ b/src/main/java/org/ultramine/commands/VanillaCommandWrapper.java @@ -2,16 +2,21 @@ import net.minecraft.command.ICommand; import net.minecraft.command.ICommandSender; +import org.ultramine.server.PermissionHandler; import java.util.List; public class VanillaCommandWrapper implements IExtendedCommand { private ICommand wrappedCommand; + private String permission; + private String description; public VanillaCommandWrapper(ICommand wrappedCommand) { this.wrappedCommand = wrappedCommand; + this.permission = "command.vanilla." + wrappedCommand.getCommandName(); + this.description = "command." + wrappedCommand.getCommandName() + ".description"; } @Override @@ -41,7 +46,7 @@ @Override public boolean canCommandSenderUseCommand(ICommandSender var1) { - return wrappedCommand.canCommandSenderUseCommand(var1); + return (var1.getCommandSenderName().equals("Server") || PermissionHandler.getInstance().has(var1, permission)) && wrappedCommand.canCommandSenderUseCommand(var1); } @Override @@ -61,4 +66,16 @@ { return wrappedCommand.compareTo(o); } + + @Override + public String getDescription() + { + return description; + } + + @Override + public String getGroup() + { + return "vanilla"; + } } diff --git a/src/main/java/org/ultramine/server/PermissionHandler.java b/src/main/java/org/ultramine/server/PermissionHandler.java index b8f05ac..fbd05bb 100644 --- a/src/main/java/org/ultramine/server/PermissionHandler.java +++ b/src/main/java/org/ultramine/server/PermissionHandler.java @@ -87,13 +87,26 @@ return has(worldName(player), player.getCommandSenderName(), permission); } - public boolean has(ICommandSender player, List permissions) + public boolean has(ICommandSender player, String... permissions) { + if (permissions == null) + return true; + for (String permission : permissions) if (!has(player, permission)) return false; return true; } + public boolean hasAny(ICommandSender player, String... permissions) + { + if (permissions == null) + return true; + + for (String permission : permissions) + if (has(player, permission)) return true; + return false; + } + @Override public void add(String world, String player, String permission) {