Skip to content

Commit 02f681c

Browse files
author
Kaleidox
committed
allow nodes to be detached from their parent container
1 parent 618e648 commit 02f681c

File tree

3 files changed

+42
-8
lines changed

3 files changed

+42
-8
lines changed

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.comroid.api.func.exc.ThrowingFunction;
2323
import org.comroid.api.tree.Initializable;
2424
import org.comroid.interaction.InteractionCore;
25+
import org.comroid.interaction.annotation.ContextDefinition;
2526
import org.comroid.interaction.component.NameCapitalizer;
2627
import org.comroid.interaction.node.GroupNode;
2728
import org.comroid.interaction.node.MethodNode;
@@ -31,9 +32,11 @@
3132
import org.jspecify.annotations.NonNull;
3233

3334
import java.util.ArrayList;
35+
import java.util.Arrays;
3436
import java.util.Collection;
3537
import java.util.Optional;
3638
import java.util.concurrent.atomic.AtomicLong;
39+
import java.util.function.Predicate;
3740
import java.util.logging.Level;
3841
import java.util.stream.Stream;
3942

@@ -63,6 +66,22 @@ public void initialize() {
6366
base.getInteraction().getDescription() != null ? base.getInteraction().getDescription() : InteractionCore.NO_DESCRIPTION);
6467

6568
for (var child : group.getChildren()) {
69+
var contexts = child.getDefinition(JdaAdapter.KEY_CONTEXT).map(ContextDefinition::expr).flatMap(Arrays::stream).toList();
70+
71+
if (contexts.stream().anyMatch(Predicate.not(JdaAdapter.CONTEXT_COMMAND::equals))) {
72+
CommandData contextual;
73+
74+
if (contexts.contains(CONTEXT_MESSAGE)) contextual = Commands.message(cap.getCapitalization(NameCapitalizer.ComponentType.TITLE)
75+
.convert(child.getInteraction().value()));
76+
else if (contexts.contains(CONTEXT_USER)) contextual = Commands.user(cap.getCapitalization(NameCapitalizer.ComponentType.TITLE)
77+
.convert(child.getInteraction().value()));
78+
else throw new IllegalStateException("Unknown contexts: " + String.join(", ", contexts));
79+
80+
initCommandData(child, contextual);
81+
all.add(contextual);
82+
continue;
83+
}
84+
6685
var subcommand = createSubcommand(child);
6786
((SlashCommandData) data).addSubcommands(subcommand);
6887
}

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

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@
3333
/// context definitions to emit
3434
ContextDefinition[] definitions() default { };
3535

36+
/// whether to detach this interaction from its parent container
37+
boolean detached() default false;
38+
3639
enum PrivacyLevel {
3740
/// response is sent publicly
3841
PUBLIC,
@@ -43,19 +46,28 @@ enum PrivacyLevel {
4346
}
4447

4548
@SuppressWarnings("ClassExplicitlyAnnotation")
46-
record Resolved(String value, String description, boolean async, PrivacyLevel privacy, ContextFilter[] filter, ContextDefinition[] definitions)
47-
implements Interaction, Described {
49+
record Resolved(
50+
String value, String description, boolean async, PrivacyLevel privacy, ContextFilter[] filter, ContextDefinition[] definitions, boolean detached
51+
) implements Interaction, Described {
4852
public static Resolved of(Element element, @Nullable Element parent) {
53+
var detached = element.interaction.detached();
4954
return new Resolved(RegistryHelper.findName(element).orElseThrow(),
5055
RegistryHelper.findDescription(element.annotated).orElse(null),
5156
element.interaction.async() || parent != null && parent.interaction.async(),
5257
element.interaction.privacy(),
5358
Stream.concat(Arrays.stream(element.interaction.filter()),
54-
Stream.ofNullable(parent).filter(Objects::nonNull).map(Element::interaction).flatMap(it -> Arrays.stream(it.filter())))
55-
.toArray(ContextFilter[]::new),
59+
Stream.ofNullable(parent)
60+
.filter($ -> !detached)
61+
.filter(Objects::nonNull)
62+
.map(Element::interaction)
63+
.flatMap(it -> Arrays.stream(it.filter()))).toArray(ContextFilter[]::new),
5664
Stream.concat(Arrays.stream(element.interaction.definitions()),
57-
Stream.ofNullable(parent).filter(Objects::nonNull).map(Element::interaction).flatMap(it -> Arrays.stream(it.definitions())))
58-
.toArray(ContextDefinition[]::new));
65+
Stream.ofNullable(parent)
66+
.filter($ -> !detached)
67+
.filter(Objects::nonNull)
68+
.map(Element::interaction)
69+
.flatMap(it -> Arrays.stream(it.definitions()))).toArray(ContextDefinition[]::new),
70+
detached);
5971
}
6072

6173
@Override

src/main/java/org/comroid/interaction/registry/RegistryHelper.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,12 @@
2424
import java.util.Set;
2525
import java.util.function.Function;
2626
import java.util.function.Predicate;
27+
import java.util.stream.Stream;
2728

2829
@Internal
2930
public final class RegistryHelper {
3031
public static Collection<InteractionNode> compileFromClass(@NonNull RegistrySource source, @NonNull Class<?> type) {
32+
var detached = new ArrayList<InteractionNode>();
3133
var children = new ArrayList<InteractionNode>();
3234

3335
for (var subtype : type.getClasses()) {
@@ -46,10 +48,11 @@ public static Collection<InteractionNode> compileFromClass(@NonNull RegistrySour
4648
var callable = constructMethod(source, method, base == null ? null : base.toInteractionElement()).orElse(null);
4749
if (callable == null) continue;
4850

49-
children.add(callable);
51+
if (callable.getInteraction().detached()) detached.add(callable);
52+
else children.add(callable);
5053
}
5154

52-
return base == null ? children : List.of(base);
55+
return Stream.concat(detached.stream(), Stream.ofNullable(base)).toList();
5356
}
5457

5558
public static Optional<GroupNode> constructGroup(@NonNull RegistrySource source, @NonNull Class<?> type, List<? extends InteractionNode> children) {

0 commit comments

Comments
 (0)