Skip to content

Commit e6c646a

Browse files
author
Kaleidox
committed
permission adapter
1 parent b3ad47c commit e6c646a

File tree

9 files changed

+61
-21
lines changed

9 files changed

+61
-21
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package org.comroid.interaction.adapter.jda;
2+
3+
import lombok.Value;
4+
import net.dv8tion.jda.api.Permission;
5+
import net.dv8tion.jda.api.entities.Member;
6+
import org.comroid.interaction.component.permission.PermissionAdapter;
7+
import org.comroid.interaction.model.InteractionContext;
8+
9+
import java.util.Arrays;
10+
import java.util.stream.Stream;
11+
12+
@Value
13+
class DiscordPermissionAdapter implements PermissionAdapter {
14+
JdaAdapter adp;
15+
16+
@Override
17+
public boolean verifyPermission(InteractionContext context) {
18+
var member = context.child(Member.class).orElse(null);
19+
var list = context.getNode().getDefinitionValues(JdaAdapter.KEY_PERMISSION).flatMap(DiscordPermissionAdapter::parsePermission).toList();
20+
return list.isEmpty() ? member == null : member.hasPermission(list);
21+
}
22+
23+
static Stream<Permission> parsePermission(String string) {
24+
return string.matches("\\d+")
25+
? Permission.getPermissions(Long.parseLong(string)).stream()
26+
: Arrays.stream(Permission.values()).filter(it -> it.name().equalsIgnoreCase(string));
27+
}
28+
}

src/main/java/org/comroid/interaction/adapter/jda/JdaAdapter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public JdaAdapter(@NonNull InteractionCore parent, JDA jda) {
6161
this.core = parent;
6262
this.jda = jda;
6363

64-
addChildren(DiscordNameCapitalizer.INSTANCE, new DiscordCommandRegistrator(this), DiscordResponseChain.INSTANCE);
64+
addChildren(DiscordNameCapitalizer.INSTANCE, new DiscordCommandRegistrator(this), new DiscordPermissionAdapter(this), DiscordResponseChain.INSTANCE);
6565
jda.addEventListener(this);
6666
}
6767

src/main/java/org/comroid/interaction/annotation/ContextDefinition.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
@Retention(RetentionPolicy.RUNTIME)
1111
public @interface ContextDefinition {
1212
/// context key
13-
String value();
13+
String key();
1414

1515
// expressions for values to set; each will be appended
1616
@Language(value = "JShellLanguage", prefix = "java.lang.Supplier x = () -> ", suffix = ";") String[] expr() default { };

src/main/java/org/comroid/interaction/annotation/ContextFilter.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
@Retention(RetentionPolicy.RUNTIME)
1717
public @interface ContextFilter {
1818
/// context key
19-
String value();
19+
String key();
2020

2121
/// check type to perform against filter
2222
Check check() default Check.ANY;
@@ -32,7 +32,7 @@ enum Check implements Named, BiPredicate<ContextFilter, InteractionContext> {
3232
EQUALS {
3333
@Override
3434
public boolean test(ContextFilter requirement, InteractionContext context) {
35-
var target = context.getValue(requirement.value());
35+
var target = context.getValue(requirement.key());
3636
var filter = requirement.filter();
3737

3838
return Objects.equals(target, filter);
@@ -42,7 +42,7 @@ public boolean test(ContextFilter requirement, InteractionContext context) {
4242
SIMILAR {
4343
@Override
4444
public boolean test(ContextFilter requirement, InteractionContext context) {
45-
var target = context.getValue(requirement.value());
45+
var target = context.getValue(requirement.key());
4646
var filter = requirement.filter();
4747

4848
if (target instanceof CharSequence) return filter.equalsIgnoreCase(target.toString());
@@ -58,7 +58,7 @@ public boolean test(ContextFilter requirement, InteractionContext context) {
5858
ANY {
5959
@Override
6060
public boolean test(ContextFilter requirement, InteractionContext context) {
61-
var target = context.getValue(requirement.value());
61+
var target = context.getValue(requirement.key());
6262
var filter = requirement.filter();
6363

6464
return Check.any(target, filter);
@@ -68,7 +68,7 @@ public boolean test(ContextFilter requirement, InteractionContext context) {
6868
ABSENT {
6969
@Override
7070
public boolean test(ContextFilter requirement, InteractionContext context) {
71-
var target = context.getValue(requirement.value());
71+
var target = context.getValue(requirement.key());
7272
var filter = requirement.filter();
7373

7474
return !Check.any(target, filter);

src/main/java/org/comroid/interaction/annotation/Interaction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public static Resolved of(Element element, @Nullable Element parent) {
6767
.map(Element::interaction)
6868
.flatMap(it -> Arrays.stream(it.definitions()))).toArray(ContextDefinition[]::new);
6969
var nameCapitalization = Arrays.stream(definitions)
70-
.filter(def -> def.value().equalsIgnoreCase(NameCapitalizer.CONTEXT_KEY))
70+
.filter(def -> def.key().equalsIgnoreCase(NameCapitalizer.CONTEXT_KEY))
7171
.map(ContextDefinition::expr)
7272
.flatMap(Arrays::stream)
7373
.map(ThrowingFunction.fallback(Capitalization::valueOf))
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.comroid.interaction.component.permission;
2+
3+
import org.comroid.interaction.model.InteractionContext;
4+
5+
public interface PermissionAdapter {
6+
boolean verifyPermission(InteractionContext context);
7+
}

src/main/java/org/comroid/interaction/model/InteractionContext.java

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.comroid.eval.MinimalExpression;
1010
import org.comroid.interaction.InteractionCore;
1111
import org.comroid.interaction.component.error.ErrorHandler;
12+
import org.comroid.interaction.component.permission.PermissionAdapter;
1213
import org.comroid.interaction.component.response.ResponseConverter;
1314
import org.comroid.interaction.component.response.ResponseHandler;
1415
import org.comroid.interaction.node.MethodNode;
@@ -56,7 +57,7 @@ public static InteractionContext.Builder basic(InteractionCore core, String... f
5657
var defs = new MultiValueMap<String, Object>();
5758
for (var def : node.getInteraction().definitions())
5859
defs.getUnderlying()
59-
.computeIfAbsent(def.value(), $ -> new HashSet<>())
60+
.computeIfAbsent(def.key(), $ -> new HashSet<>())
6061
.addAll(Arrays.stream(def.expr()).map(MinimalExpression::evaluate).filter(Objects::nonNull).toList());
6162

6263
return context.definitions(defs);
@@ -96,17 +97,21 @@ public Object getParameter(ParameterNode node) {
9697
}
9798

9899
public void invoke() {
99-
if (node.getInteraction().async()) {
100-
component(ResponseHandler.class).ifPresent(it -> it.deferResponse(this));
100+
try {
101+
if (components(PermissionAdapter.class).noneMatch(adp -> adp.verifyPermission(this))) throw Response.of("Insufficient permissions");
101102

102-
CompletableFuture.supplyAsync(() -> node.invoke(this)).thenAccept(this::handle).exceptionally(t -> {
103-
handle(t);
104-
return null;
105-
});
106-
} else try {
107-
var response = node.invoke(this);
103+
if (node.getInteraction().async()) {
104+
component(ResponseHandler.class).ifPresent(it -> it.deferResponse(this));
108105

109-
handle(response);
106+
CompletableFuture.supplyAsync(() -> node.invoke(this)).thenAccept(this::handle).exceptionally(t -> {
107+
handle(t);
108+
return null;
109+
});
110+
} else {
111+
var response = node.invoke(this);
112+
113+
handle(response);
114+
}
110115
} catch (Response response) {
111116
handle((Object) response);
112117
} catch (Throwable t) {

src/main/java/org/comroid/interaction/node/model/ContextManipulatingNode.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ default Stream<ContextFilter> getFilter(String key) {
1515
}
1616

1717
default Stream<String> getFilterValues(String key) {
18-
return getFilter(key).map(ContextFilter::value);
18+
return getFilter(key).map(ContextFilter::key);
1919
}
2020

2121
default Stream<ContextDefinition> getDefinition(String key) {
22-
return Arrays.stream(getInteraction().definitions()).filter(it -> it.value().startsWith(key));
22+
return Arrays.stream(getInteraction().definitions()).filter(it -> it.key().startsWith(key));
2323
}
2424

2525
default Stream<String> getDefinitionValues(String key) {

src/test/java/org/comroid/test/interaction/InteractionTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import java.util.function.IntBinaryOperator;
1212

1313
public class InteractionTest {
14-
@Interaction(filter = { @ContextFilter(value = "permission.discord", filter = "8") })
14+
@Interaction(filter = { @ContextFilter(key = "permission.discord", filter = "8") })
1515
public static int math(
1616
@Parameter Operator operator, @Parameter(completion = { @Completion(strings = { "1", "2" }) }) int x,
1717
@Parameter(completion = { @Completion(strings = { "3", "4" }) }) int y

0 commit comments

Comments
 (0)