|
23 | 23 | // |
24 | 24 | package org.incendo.cloud.sponge; |
25 | 25 |
|
| 26 | +import io.leangen.geantyref.GenericTypeReflector; |
| 27 | +import java.lang.reflect.Type; |
26 | 28 | import java.util.ArrayDeque; |
27 | 29 | import java.util.Collections; |
28 | 30 | import java.util.List; |
| 31 | +import java.util.Map; |
29 | 32 | import java.util.Optional; |
30 | | -import java.util.Set; |
31 | 33 | import java.util.stream.Collectors; |
32 | 34 | import net.kyori.adventure.text.Component; |
33 | 35 | import org.checkerframework.checker.nullness.qual.NonNull; |
@@ -83,10 +85,11 @@ public List<CommandCompletion> complete( |
83 | 85 |
|
84 | 86 | @Override |
85 | 87 | public boolean canExecute(final @NonNull CommandCause cause) { |
86 | | - return this.commandManager.testPermission( |
87 | | - this.commandManager.senderMapper().map(cause), |
88 | | - (Permission) this.namedNode().nodeMeta().getOrDefault(CommandNode.META_KEY_PERMISSION, Permission.empty()) |
89 | | - ).allowed(); |
| 88 | + return this.checkAccess( |
| 89 | + cause, |
| 90 | + this.namedNode().nodeMeta() |
| 91 | + .getOrDefault(CommandNode.META_KEY_ACCESS, Collections.emptyMap()) |
| 92 | + ); |
90 | 93 | } |
91 | 94 |
|
92 | 95 | @Override |
@@ -188,23 +191,25 @@ private static <C> boolean canExecute(final @NonNull CommandNode<C> node) { |
188 | 191 | || node.children().stream().noneMatch(c -> c.component().required()); |
189 | 192 | } |
190 | 193 |
|
191 | | - @SuppressWarnings("unchecked") |
192 | 194 | private void addRequirement( |
193 | 195 | final @NonNull CommandNode<C> cloud, |
194 | 196 | final @NonNull CommandTreeNode<? extends CommandTreeNode<?>> node |
195 | 197 | ) { |
196 | | - final Permission permission = (Permission) cloud.nodeMeta() |
197 | | - .getOrDefault(CommandNode.META_KEY_PERMISSION, Permission.empty()); |
198 | | - final Set<Class<?>> senderTypes = (Set<Class<?>>) cloud.nodeMeta().get(CommandNode.META_KEY_SENDER_TYPES); |
199 | | - node.requires(cause -> { |
200 | | - final C c = this.commandManager.senderMapper().map(cause); |
201 | | - for (final Class<?> senderType : senderTypes) { |
202 | | - if (senderType.isInstance(c)) { |
203 | | - return this.commandManager.testPermission(c, permission).allowed(); |
| 198 | + final Map<Type, Permission> accessMap = |
| 199 | + cloud.nodeMeta().getOrDefault(CommandNode.META_KEY_ACCESS, Collections.emptyMap()); |
| 200 | + node.requires(cause -> this.checkAccess(cause, accessMap)); |
| 201 | + } |
| 202 | + |
| 203 | + private boolean checkAccess(final CommandCause cause, final Map<Type, Permission> accessMap) { |
| 204 | + final C cloudSender = this.commandManager.senderMapper().map(cause); |
| 205 | + for (final Map.Entry<Type, Permission> entry : accessMap.entrySet()) { |
| 206 | + if (GenericTypeReflector.isSuperType(entry.getKey(), cloudSender.getClass())) { |
| 207 | + if (this.commandManager.testPermission(cloudSender, entry.getValue()).allowed()) { |
| 208 | + return true; |
204 | 209 | } |
205 | 210 | } |
206 | | - return false; |
207 | | - }); |
| 211 | + } |
| 212 | + return false; |
208 | 213 | } |
209 | 214 |
|
210 | 215 | private String formatCommandForParsing(final @NonNull String arguments) { |
|
0 commit comments