diff options
Diffstat (limited to 'dicore3/command/src/main/java/io/dico/dicore/command/PermissionContextFilter.java')
-rw-r--r-- | dicore3/command/src/main/java/io/dico/dicore/command/PermissionContextFilter.java | 93 |
1 files changed, 93 insertions, 0 deletions
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 new file mode 100644 index 0000000..6492677 --- /dev/null +++ b/dicore3/command/src/main/java/io/dico/dicore/command/PermissionContextFilter.java @@ -0,0 +1,93 @@ +package io.dico.dicore.command; + +import java.util.Objects; + +public class PermissionContextFilter implements IContextFilter { + private String permission; + private String[] permissionComponents; + private int componentInsertionIndex; + private String failMessage; + + public PermissionContextFilter(String permission) { + this.permission = Objects.requireNonNull(permission); + } + + public PermissionContextFilter(String permission, String failMessage) { + this(permission); + this.failMessage = failMessage; + } + + public PermissionContextFilter(String permission, boolean inheritable) { + this(permission, null, inheritable); + } + + public PermissionContextFilter(String permission, String failMessage, boolean inheritable) { + this(permission, failMessage); + if (inheritable) { + setupInheritability(-1); + } + } + + public PermissionContextFilter(String permission, int componentInsertionIndex, String failMessage) { + this(permission, failMessage); + setupInheritability(componentInsertionIndex); + } + + private void setupInheritability(int componentInsertionIndex) { + this.permissionComponents = permission.split("\\."); + this.componentInsertionIndex = componentInsertionIndex < 0 ? permissionComponents.length : componentInsertionIndex; + if (componentInsertionIndex > permissionComponents.length) throw new IllegalArgumentException(); + } + + private void doFilter(ExecutionContext context, String permission) throws CommandException { + if (failMessage != null) { + Validate.isAuthorized(context.getSender(), permission, failMessage); + } else { + Validate.isAuthorized(context.getSender(), permission); + } + } + + @Override + public void filterContext(ExecutionContext context) throws CommandException { + doFilter(context, permission); + } + + private String getInheritedPermission(String[] components) { + int insertedAmount = components.length; + String[] currentComponents = permissionComponents; + int currentAmount = currentComponents.length; + String[] targetArray = new String[currentAmount + insertedAmount]; + + int insertionIndex; + //int newInsertionIndex; + if (componentInsertionIndex == -1) { + insertionIndex = currentAmount; + //newInsertionIndex = -1; + } else { + insertionIndex = componentInsertionIndex; + //newInsertionIndex = insertionIndex + insertedAmount; + } + + // copy the current components up to insertionIndex + System.arraycopy(currentComponents, 0, targetArray, 0, insertionIndex); + // copy the new components into the array at insertionIndex + System.arraycopy(components, 0, targetArray, insertionIndex, insertedAmount); + // copy the current components from insertionIndex + inserted amount + System.arraycopy(currentComponents, insertionIndex, targetArray, insertionIndex + insertedAmount, currentAmount - insertionIndex); + + return String.join(".", targetArray); + } + + @Override + public void filterSubContext(ExecutionContext subContext, String... path) throws CommandException { + if (permissionComponents != null) { + doFilter(subContext, getInheritedPermission(path)); + } + } + + @Override + public Priority getPriority() { + return Priority.PERMISSION; + } + +} |