Skip to content

Commit 6b9bceb

Browse files
committed
✨ Added ability to add custom requirements to a command instance for more refined permission management.
1 parent 87d8d66 commit 6b9bceb

File tree

3 files changed

+25
-9
lines changed

3 files changed

+25
-9
lines changed

API/src/main/java/xyz/bitsquidd/bits/lib/command/BitsCommand.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
package xyz.bitsquidd.bits.lib.command;
22

33
import net.kyori.adventure.text.Component;
4-
import org.jetbrains.annotations.NotNull;
4+
import org.jspecify.annotations.NullMarked;
55

66
import xyz.bitsquidd.bits.lib.command.annotation.Command;
7+
import xyz.bitsquidd.bits.lib.command.requirement.BitsCommandRequirement;
78
import xyz.bitsquidd.bits.lib.command.util.BitsCommandContext;
89
import xyz.bitsquidd.bits.lib.sendable.text.Text;
910

11+
import java.util.Collections;
12+
import java.util.Set;
13+
14+
@NullMarked
1015
public abstract class BitsCommand {
1116

1217
protected void onRegister() {
@@ -18,8 +23,12 @@ protected void onUnregister() {
1823
}
1924

2025
@Command("usage")
21-
public void sendUsage(@NotNull final BitsCommandContext ctx) {
26+
public void sendUsage(final BitsCommandContext ctx) {
2227
ctx.respond(Text.of(Component.text("Test from " + getClass().getSimpleName() + "!")));
2328
}
2429

30+
public Set<BitsCommandRequirement> getAddedRequirements() {
31+
return Collections.emptySet();
32+
}
33+
2534
}

API/src/main/java/xyz/bitsquidd/bits/lib/command/util/BitsCommandBuilder.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package xyz.bitsquidd.bits.lib.command.util;
22

33
import org.jspecify.annotations.NullMarked;
4+
import org.jspecify.annotations.Nullable;
45

56
import xyz.bitsquidd.bits.lib.command.BitsCommand;
67
import xyz.bitsquidd.bits.lib.command.annotation.Command;
@@ -15,15 +16,13 @@
1516
import java.lang.reflect.Constructor;
1617
import java.lang.reflect.Method;
1718
import java.lang.reflect.Parameter;
18-
import java.util.ArrayList;
19-
import java.util.Arrays;
20-
import java.util.Collections;
21-
import java.util.List;
19+
import java.util.*;
2220
import java.util.stream.Collectors;
2321
import java.util.stream.Stream;
2422

2523
@NullMarked
2624
public class BitsCommandBuilder {
25+
private @Nullable BitsCommand commandInstance;
2726
private final Class<? extends BitsCommand> commandClass;
2827

2928
@SuppressWarnings("FieldCanBeLocal")
@@ -35,6 +34,13 @@ public class BitsCommandBuilder {
3534

3635
private final String permissionString;
3736

37+
// Allow us to build from an instance or a class.
38+
// Instances are used only for gathering extra requirements.
39+
public BitsCommandBuilder(@Nullable BitsCommand commandInstance) {
40+
this(Objects.requireNonNull(commandInstance).getClass());
41+
this.commandInstance = commandInstance;
42+
}
43+
3844
public BitsCommandBuilder(Class<? extends BitsCommand> commandClass) {
3945
this.commandClass = commandClass;
4046

@@ -93,8 +99,8 @@ public Constructor<?> toConstructor() {
9399
}
94100

95101

96-
public List<BitsCommandRequirement> getRequirements() {
97-
List<BitsCommandRequirement> requirements = new ArrayList<>();
102+
public Set<BitsCommandRequirement> getRequirements() {
103+
Set<BitsCommandRequirement> requirements = new HashSet<>();
98104
if (commandName.isEmpty()) requirements.add(PermissionRequirement.of(permissionString));
99105

100106
// Gather permission strings and convert them to requirements.
@@ -113,6 +119,7 @@ public List<BitsCommandRequirement> getRequirements() {
113119
.toList());
114120
}
115121

122+
if (commandInstance != null) requirements.addAll(commandInstance.getAddedRequirements());
116123
return requirements;
117124
}
118125

Common/src/main/java/xyz/bitsquidd/bits/example/command/CustomCommandContext.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import io.papermc.paper.command.brigadier.CommandSourceStack;
55
import org.jspecify.annotations.NullMarked;
66

7-
import xyz.bitsquidd.bits.example.text.decorator.CommandDecorator;
7+
import xyz.bitsquidd.bits.example.text.decorator.impl.CommandDecorator;
88
import xyz.bitsquidd.bits.lib.command.CommandReturnType;
99
import xyz.bitsquidd.bits.lib.command.util.BitsCommandContext;
1010
import xyz.bitsquidd.bits.lib.sendable.text.Text;

0 commit comments

Comments
 (0)