From c6c1bbf6701eb407eb72bc6cd04af7c1dadc5d8e Mon Sep 17 00:00:00 2001 From: Dico Date: Wed, 26 Sep 2018 11:14:33 +0100 Subject: Fix permissions further --- .../main/java/io/dico/dicore/command/Command.java | 4 +- .../io/dico/dicore/command/ExtendedCommand.java | 13 +++++- .../dicore/command/InheritingContextFilter.java | 2 +- .../dicore/command/PermissionContextFilter.java | 20 ++++++++- .../dicore/command/predef/DefaultGroupCommand.java | 17 +++++--- .../dicore/command/predef/PredefinedCommand.java | 1 + .../io/dico/parcels2/command/CommandsDebug.kt | 48 ++++++++++++++++++++-- .../dico/parcels2/command/ParcelCommandBuilder.kt | 4 +- 8 files changed, 92 insertions(+), 17 deletions(-) diff --git a/dicore3/command/src/main/java/io/dico/dicore/command/Command.java b/dicore3/command/src/main/java/io/dico/dicore/command/Command.java index 868aa95..e7c2e93 100644 --- a/dicore3/command/src/main/java/io/dico/dicore/command/Command.java +++ b/dicore3/command/src/main/java/io/dico/dicore/command/Command.java @@ -111,12 +111,12 @@ public abstract class Command { return Collections.unmodifiableList(contextFilters); } - public boolean removeContextFilter(IContextFilter contextFilter) { + public Command removeContextFilter(IContextFilter contextFilter) { boolean ret = contextFilters.remove(contextFilter); if (ret) { computeContextFilterPostParameterIndex(); } - return ret; + return this; } private void computeContextFilterPostParameterIndex() { diff --git a/dicore3/command/src/main/java/io/dico/dicore/command/ExtendedCommand.java b/dicore3/command/src/main/java/io/dico/dicore/command/ExtendedCommand.java index 602760c..a34d30d 100644 --- a/dicore3/command/src/main/java/io/dico/dicore/command/ExtendedCommand.java +++ b/dicore3/command/src/main/java/io/dico/dicore/command/ExtendedCommand.java @@ -2,10 +2,11 @@ package io.dico.dicore.command; import io.dico.dicore.command.parameter.IArgumentPreProcessor; import io.dico.dicore.command.parameter.Parameter; +import io.dico.dicore.command.parameter.type.ParameterType; @SuppressWarnings("unchecked") public abstract class ExtendedCommand> extends Command { - protected final boolean modifiable; + protected boolean modifiable; public ExtendedCommand() { this(true); @@ -24,6 +25,16 @@ public abstract class ExtendedCommand> extends Comm return modifiable ? (T) super.addParameter(parameter) : newModifiableInstance().addParameter(parameter); } + @Override + public T addContextFilter(IContextFilter contextFilter) { + return modifiable ? (T) super.addContextFilter(contextFilter) : newModifiableInstance().addContextFilter(contextFilter); + } + + @Override + public T removeContextFilter(IContextFilter contextFilter) { + return modifiable ? (T) super.removeContextFilter(contextFilter) : newModifiableInstance().removeContextFilter(contextFilter); + } + @Override public T requiredParameters(int requiredParameters) { return modifiable ? (T) super.requiredParameters(requiredParameters) : newModifiableInstance().requiredParameters(requiredParameters); diff --git a/dicore3/command/src/main/java/io/dico/dicore/command/InheritingContextFilter.java b/dicore3/command/src/main/java/io/dico/dicore/command/InheritingContextFilter.java index 2f06ea7..0b4875b 100644 --- a/dicore3/command/src/main/java/io/dico/dicore/command/InheritingContextFilter.java +++ b/dicore3/command/src/main/java/io/dico/dicore/command/InheritingContextFilter.java @@ -7,7 +7,7 @@ public abstract class InheritingContextFilter implements IContextFilter { private static String[] addParent(String[] path, String parent) { String[] out = new String[path.length + 1]; - System.arraycopy(path, 0, out, 0, path.length); + System.arraycopy(path, 0, out, 1, path.length); out[0] = parent; return out; } diff --git a/dicore3/command/src/main/java/io/dico/dicore/command/PermissionContextFilter.java b/dicore3/command/src/main/java/io/dico/dicore/command/PermissionContextFilter.java index 6492677..3ca1131 100644 --- a/dicore3/command/src/main/java/io/dico/dicore/command/PermissionContextFilter.java +++ b/dicore3/command/src/main/java/io/dico/dicore/command/PermissionContextFilter.java @@ -52,7 +52,7 @@ public class PermissionContextFilter implements IContextFilter { doFilter(context, permission); } - private String getInheritedPermission(String[] components) { + public String getInheritedPermission(String[] components) { int insertedAmount = components.length; String[] currentComponents = permissionComponents; int currentAmount = currentComponents.length; @@ -80,7 +80,7 @@ public class PermissionContextFilter implements IContextFilter { @Override public void filterSubContext(ExecutionContext subContext, String... path) throws CommandException { - if (permissionComponents != null) { + if (isInheritable()) { doFilter(subContext, getInheritedPermission(path)); } } @@ -90,4 +90,20 @@ public class PermissionContextFilter implements IContextFilter { return Priority.PERMISSION; } + public boolean isInheritable() { + return permissionComponents != null; + } + + public String getPermission() { + return permission; + } + + public int getComponentInsertionIndex() { + return componentInsertionIndex; + } + + public String getFailMessage() { + return failMessage; + } + } diff --git a/dicore3/command/src/main/java/io/dico/dicore/command/predef/DefaultGroupCommand.java b/dicore3/command/src/main/java/io/dico/dicore/command/predef/DefaultGroupCommand.java index 3d96a7d..6b389e3 100644 --- a/dicore3/command/src/main/java/io/dico/dicore/command/predef/DefaultGroupCommand.java +++ b/dicore3/command/src/main/java/io/dico/dicore/command/predef/DefaultGroupCommand.java @@ -1,22 +1,29 @@ package io.dico.dicore.command.predef; -import io.dico.dicore.command.Command; import io.dico.dicore.command.CommandException; import io.dico.dicore.command.ExecutionContext; +import io.dico.dicore.command.IContextFilter; import org.bukkit.command.CommandSender; -public class DefaultGroupCommand extends Command { - private static final DefaultGroupCommand instance = new DefaultGroupCommand(); +public class DefaultGroupCommand extends PredefinedCommand { + private static final DefaultGroupCommand instance = new DefaultGroupCommand(false); public static DefaultGroupCommand getInstance() { return instance; } - private DefaultGroupCommand() { + private DefaultGroupCommand(boolean modifiable) { + addContextFilter(IContextFilter.INHERIT_PERMISSIONS); + this.modifiable = modifiable; + } + @Override + protected DefaultGroupCommand newModifiableInstance() { + return new DefaultGroupCommand(true); } - @Override public String execute(CommandSender sender, ExecutionContext context) throws CommandException { + @Override + public String execute(CommandSender sender, ExecutionContext context) throws CommandException { context.getAddress().getChatController().sendHelpMessage(sender, context, context.getAddress(), 1); return null; } diff --git a/dicore3/command/src/main/java/io/dico/dicore/command/predef/PredefinedCommand.java b/dicore3/command/src/main/java/io/dico/dicore/command/predef/PredefinedCommand.java index 4e7ba07..4340356 100644 --- a/dicore3/command/src/main/java/io/dico/dicore/command/predef/PredefinedCommand.java +++ b/dicore3/command/src/main/java/io/dico/dicore/command/predef/PredefinedCommand.java @@ -37,6 +37,7 @@ public abstract class PredefinedCommand> extends static { registerPredefinedCommandGenerator("help", HelpCommand::registerAsChild); + //noinspection StaticInitializerReferencesSubClass registerPredefinedCommandGenerator("syntax", SyntaxCommand::registerAsChild); } diff --git a/src/main/kotlin/io/dico/parcels2/command/CommandsDebug.kt b/src/main/kotlin/io/dico/parcels2/command/CommandsDebug.kt index 60518af..b3b632f 100644 --- a/src/main/kotlin/io/dico/parcels2/command/CommandsDebug.kt +++ b/src/main/kotlin/io/dico/parcels2/command/CommandsDebug.kt @@ -1,10 +1,10 @@ package io.dico.parcels2.command -import io.dico.dicore.command.CommandException -import io.dico.dicore.command.EMessageType -import io.dico.dicore.command.ExecutionContext -import io.dico.dicore.command.Validate +import io.dico.dicore.command.* +import io.dico.dicore.command.IContextFilter.Priority.* import io.dico.dicore.command.annotation.Cmd +import io.dico.dicore.command.annotation.PreprocessArgs +import io.dico.dicore.command.parameter.ArgumentBuffer import io.dico.parcels2.ParcelsPlugin import io.dico.parcels2.Privilege import io.dico.parcels2.blockvisitor.RegionTraverser @@ -95,4 +95,44 @@ class CommandsDebug(plugin: ParcelsPlugin) : AbstractParcelCommands(plugin) { return target.hasPermission(permission).toString() } + @Cmd("message") + @PreprocessArgs + fun cmdMessage(sender: CommandSender, message: String): Any? { + sender.sendMessage(message) + return null + } + + @Cmd("permissions") + fun cmdPermissions(context: ExecutionContext, vararg address: String): Any? { + val target = context.address.dispatcherForTree.getDeepChild(ArgumentBuffer(address)) + Validate.isTrue(target.depth == address.size && target.hasCommand(), "Not found: /${address.joinToString(separator = " ")}") + + val permissions = getPermissionsOf(target) + return permissions.joinToString(separator = "\n") + } + + private fun getPermissionsOf(address: ICommandAddress, + path: Array = emptyArray(), + result: MutableList = mutableListOf()): List { + val command = address.command ?: return result + + var inherited = false + for (filter in command.contextFilters) { + when (filter) { + is PermissionContextFilter -> { + if (path.isEmpty()) result.add(filter.permission) + else if (filter.isInheritable) result.add(filter.getInheritedPermission(path)) + } + is InheritingContextFilter -> { + if (filter.priority == PERMISSION && address.hasParent() && !inherited) { + inherited = true + getPermissionsOf(address.parent, arrayOf(address.mainKey, *path), result) + } + } + } + } + + return result + } + } \ No newline at end of file diff --git a/src/main/kotlin/io/dico/parcels2/command/ParcelCommandBuilder.kt b/src/main/kotlin/io/dico/parcels2/command/ParcelCommandBuilder.kt index 7be112d..e7d8663 100644 --- a/src/main/kotlin/io/dico/parcels2/command/ParcelCommandBuilder.kt +++ b/src/main/kotlin/io/dico/parcels2/command/ParcelCommandBuilder.kt @@ -55,13 +55,13 @@ fun getParcelCommands(plugin: ParcelsPlugin): ICommandDispatcher = CommandBuilde generateHelpAndSyntaxCommands(parcelsAddress) }.getDispatcher() -inline fun CommandBuilder.group(name: String, vararg aliases: String, config: CommandBuilder.() -> Unit) { +private inline fun CommandBuilder.group(name: String, vararg aliases: String, config: CommandBuilder.() -> Unit) { group(name, *aliases) config() parent() } -inline fun CommandBuilder.group(address: ICommandAddress, name: String, vararg aliases: String, config: CommandBuilder.() -> Unit) { +private inline fun CommandBuilder.group(address: ICommandAddress, name: String, vararg aliases: String, config: CommandBuilder.() -> Unit) { group(address, name, *aliases) config() parent() -- cgit v1.2.3