From 432cf78a2e19cf555f76d4a4b171a2b096d004d3 Mon Sep 17 00:00:00 2001 From: tueem Date: Wed, 5 Mar 2025 21:44:12 +0100 Subject: [PATCH] add IdentifierProvider and wrapper implementations --- .../ident/RootCommandIdentifier.java | 25 +++---- .../ident/SlashCommandIdentifier.java | 25 +++---- .../marinara/parser/SlashCommandParser.java | 6 +- .../registry/InteractionRegistry.java | 7 +- .../marinara/wrapper/IdentifierProvider.java | 72 +++++++++++++++++++ .../marinara/wrapper/LibraryWrapper.java | 7 +- .../wrapper/discord4j/Discord4JWrapper.java | 58 +++------------ .../AutocompleteIdentifierConverter.java | 38 ++++++++++ .../ButtonIdentifierConverter.java | 15 ++++ .../SlashCommandIdentifierConverter.java | 39 ++++++++++ .../wrapper/javacord/JavacordWrapper.java | 58 +++------------ .../AutocompleteIdentifierConverter.java | 37 ++++++++++ .../ButtonIdentifierConverter.java | 16 +++++ .../SlashCommandIdentifierConverter.java | 38 ++++++++++ 14 files changed, 305 insertions(+), 136 deletions(-) create mode 100644 lib/src/main/java/net/tomatentum/marinara/wrapper/IdentifierProvider.java create mode 100644 wrapper/discord4j/src/main/java/net/tomatentum/marinara/wrapper/discord4j/identifierconverter/AutocompleteIdentifierConverter.java create mode 100644 wrapper/discord4j/src/main/java/net/tomatentum/marinara/wrapper/discord4j/identifierconverter/ButtonIdentifierConverter.java create mode 100644 wrapper/discord4j/src/main/java/net/tomatentum/marinara/wrapper/discord4j/identifierconverter/SlashCommandIdentifierConverter.java create mode 100644 wrapper/javacord/src/main/java/net/tomatentum/marinara/wrapper/javacord/identifierconverter/AutocompleteIdentifierConverter.java create mode 100644 wrapper/javacord/src/main/java/net/tomatentum/marinara/wrapper/javacord/identifierconverter/ButtonIdentifierConverter.java create mode 100644 wrapper/javacord/src/main/java/net/tomatentum/marinara/wrapper/javacord/identifierconverter/SlashCommandIdentifierConverter.java diff --git a/lib/src/main/java/net/tomatentum/marinara/interaction/ident/RootCommandIdentifier.java b/lib/src/main/java/net/tomatentum/marinara/interaction/ident/RootCommandIdentifier.java index d32a6a7..ae0e6d4 100644 --- a/lib/src/main/java/net/tomatentum/marinara/interaction/ident/RootCommandIdentifier.java +++ b/lib/src/main/java/net/tomatentum/marinara/interaction/ident/RootCommandIdentifier.java @@ -1,5 +1,6 @@ package net.tomatentum.marinara.interaction.ident; +import net.tomatentum.marinara.interaction.InteractionType; import net.tomatentum.marinara.interaction.commands.annotation.SlashCommandOption; public class RootCommandIdentifier extends SlashCommandIdentifier { @@ -10,10 +11,10 @@ public class RootCommandIdentifier extends SlashCommandIdentifier { InteractionIdentifier parent, String name, String description, + InteractionType type, SlashCommandOption[] options, - boolean isAutocomplete, long[] serverIds) { - super(parent, name, description, options, isAutocomplete); + super(parent, name, description, type, options); this.serverIds = serverIds; } @@ -26,7 +27,6 @@ public class RootCommandIdentifier extends SlashCommandIdentifier { private String name; private String description; private SlashCommandOption[] options; - private boolean isAutocomplete = false; private long[] serverIds; @@ -66,15 +66,6 @@ public class RootCommandIdentifier extends SlashCommandIdentifier { return this; } - public boolean autocomplete() { - return this.isAutocomplete; - } - - public Builder autocomplete(boolean isAutocomplete) { - this.isAutocomplete = isAutocomplete; - return this; - } - public long[] serverIds() { return this.serverIds; } @@ -84,8 +75,14 @@ public class RootCommandIdentifier extends SlashCommandIdentifier { return this; } - public SlashCommandIdentifier build() { - return new RootCommandIdentifier(parent, name, description, options, isAutocomplete, serverIds); + public SlashCommandIdentifier build(boolean autocomplete) { + return new RootCommandIdentifier( + parent, + name, + description, + autocomplete ? InteractionType.AUTOCOMPLETE : InteractionType.COMMAND, + options, + serverIds); } } diff --git a/lib/src/main/java/net/tomatentum/marinara/interaction/ident/SlashCommandIdentifier.java b/lib/src/main/java/net/tomatentum/marinara/interaction/ident/SlashCommandIdentifier.java index 8ecad75..7284a2a 100644 --- a/lib/src/main/java/net/tomatentum/marinara/interaction/ident/SlashCommandIdentifier.java +++ b/lib/src/main/java/net/tomatentum/marinara/interaction/ident/SlashCommandIdentifier.java @@ -11,10 +11,10 @@ public class SlashCommandIdentifier extends InteractionIdentifier { InteractionIdentifier parent, String name, String description, - SlashCommandOption[] options, - boolean isAutocomplete + InteractionType type, + SlashCommandOption[] options ) { - super(parent, name, description, isAutocomplete ? InteractionType.AUTOCOMPLETE : InteractionType.COMMAND); + super(parent, name, description, type); this.options = options; } @@ -27,7 +27,6 @@ public class SlashCommandIdentifier extends InteractionIdentifier { private String name; private String description; private SlashCommandOption[] options; - private boolean isAutocomplete = false; public InteractionIdentifier parent() { return parent; @@ -65,17 +64,13 @@ public class SlashCommandIdentifier extends InteractionIdentifier { return this; } - public boolean autocomplete() { - return this.isAutocomplete; - } - - public Builder autocomplete(boolean isAutocomplete) { - this.isAutocomplete = isAutocomplete; - return this; - } - - public SlashCommandIdentifier build() { - return new SlashCommandIdentifier(parent, name, description, options, isAutocomplete); + public SlashCommandIdentifier build(boolean autocomplete) { + return new SlashCommandIdentifier( + parent, + name, + description, + autocomplete ? InteractionType.AUTOCOMPLETE : InteractionType.COMMAND, + options); } } diff --git a/lib/src/main/java/net/tomatentum/marinara/parser/SlashCommandParser.java b/lib/src/main/java/net/tomatentum/marinara/parser/SlashCommandParser.java index 0cd7072..ca07241 100644 --- a/lib/src/main/java/net/tomatentum/marinara/parser/SlashCommandParser.java +++ b/lib/src/main/java/net/tomatentum/marinara/parser/SlashCommandParser.java @@ -37,9 +37,8 @@ public class SlashCommandParser implements AnnotationParser { .name(cmd.name()) .description(cmd.description()) .options(cmd.options()) - .autocomplete(isAutoComplete) .serverIds(cmd.serverIds()) - .build(); + .build(isAutoComplete); if (ReflectionUtil.isAnnotationPresent(method, SubCommandGroup.class)) { SubCommandGroup cmdGroup = ReflectionUtil.getAnnotation(method, SubCommandGroup.class); @@ -57,8 +56,7 @@ public class SlashCommandParser implements AnnotationParser { .name(subCmd.name()) .description(subCmd.description()) .options(subCmd.options()) - .autocomplete(isAutoComplete) - .build(); + .build(isAutoComplete); } logger.trace("Parsed using SlashCommandParser for method {} with the result:\n{}", ReflectionUtil.getFullMethodName(method), lastIdentifier.toString()); diff --git a/lib/src/main/java/net/tomatentum/marinara/registry/InteractionRegistry.java b/lib/src/main/java/net/tomatentum/marinara/registry/InteractionRegistry.java index 59d01b7..08677c9 100644 --- a/lib/src/main/java/net/tomatentum/marinara/registry/InteractionRegistry.java +++ b/lib/src/main/java/net/tomatentum/marinara/registry/InteractionRegistry.java @@ -16,17 +16,19 @@ import net.tomatentum.marinara.interaction.commands.SlashCommandDefinition; import net.tomatentum.marinara.interaction.ident.RootCommandIdentifier; import net.tomatentum.marinara.interaction.ident.SlashCommandIdentifier; import net.tomatentum.marinara.util.LoggerUtil; -import net.tomatentum.marinara.wrapper.LibraryWrapper; +import net.tomatentum.marinara.wrapper.IdentifierProvider; import net.tomatentum.marinara.interaction.methods.InteractionMethod; public class InteractionRegistry { private Logger logger = LoggerUtil.getLogger(getClass()); private Set interactions; private Marinara marinara; + private IdentifierProvider identifierProvider; public InteractionRegistry(Marinara marinara) { this.interactions = new HashSet<>(); this.marinara = marinara; + this.identifierProvider = marinara.getWrapper().createIdentifierProvider(); marinara.getWrapper().subscribeInteractions(this::handle); } @@ -74,9 +76,8 @@ public class InteractionRegistry { public void handle(Object context) { logger.debug("Received {} interaction ", context); - LibraryWrapper wrapper = marinara.getWrapper(); interactions.forEach((e) -> { - if (wrapper.getInteractionIdentifier(context).equals(e.identifier())) { + if (this.identifierProvider.provide(context).equals(e.identifier())) { logger.info("Running {} interaction using {}\ncontext: {}", e.type(), e.toString(), context.toString()); e.runAll(context); } diff --git a/lib/src/main/java/net/tomatentum/marinara/wrapper/IdentifierProvider.java b/lib/src/main/java/net/tomatentum/marinara/wrapper/IdentifierProvider.java new file mode 100644 index 0000000..1d3f31d --- /dev/null +++ b/lib/src/main/java/net/tomatentum/marinara/wrapper/IdentifierProvider.java @@ -0,0 +1,72 @@ +package net.tomatentum.marinara.wrapper; + +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.logging.log4j.Logger; + +import io.leangen.geantyref.GenericTypeReflector; +import net.tomatentum.marinara.interaction.ident.InteractionIdentifier; +import net.tomatentum.marinara.util.LoggerUtil; +import net.tomatentum.marinara.util.ReflectionUtil; + +public class IdentifierProvider { + + public static IdentifierProvider of(Converter... converter) { + return new IdentifierProvider(Arrays.asList(converter)); + } + + private Map, Converter> converter; + private Logger logger = LoggerUtil.getLogger(getClass()); + + private IdentifierProvider(List> converter) { + this.converter = new HashMap<>(); + for (Converter conv : converter) { + if (conv.getClass().getName().contains("$$Lambda")) + throw new IllegalArgumentException("Lambdas cannot be used for IdentifierConverter because of Type erasure."); + Type type = GenericTypeReflector.getExactSuperType(conv.getClass(), Converter.class); + Type parameterType = (Class) ((ParameterizedType) type).getActualTypeArguments()[0]; + if (!(parameterType instanceof Class)) + throw new IllegalArgumentException("Only full Class types are supported by IdentiferConverters"); + this.converter.put((Class) parameterType, conv); + } + } + + public InteractionIdentifier provide(Object context) { + Type type = ReflectionUtil.getMostSpecificClass( + converter.keySet().stream().filter(x -> x.isAssignableFrom(context.getClass())).toArray(Class[]::new), + context.getClass()); + + if (type == null) + logger.debug("No Identifier converter found for context {}", context.getClass().toString()); + + @SuppressWarnings("unchecked") + Converter conv = (Converter) converter.get(type); + + return conv.convert(context); + } + + @FunctionalInterface + public interface Converter { + InteractionIdentifier convert(T context); + } + + public static class LambdaWrapper implements Converter { + + private Converter converter; + + LambdaWrapper(Converter converter) { + this.converter = converter; + } + + @Override + public InteractionIdentifier convert(T context) { + return this.converter.convert(context); + } + + } +} diff --git a/lib/src/main/java/net/tomatentum/marinara/wrapper/LibraryWrapper.java b/lib/src/main/java/net/tomatentum/marinara/wrapper/LibraryWrapper.java index 0a4ede7..eeec879 100644 --- a/lib/src/main/java/net/tomatentum/marinara/wrapper/LibraryWrapper.java +++ b/lib/src/main/java/net/tomatentum/marinara/wrapper/LibraryWrapper.java @@ -5,14 +5,13 @@ import java.util.List; import java.util.function.Consumer; import net.tomatentum.marinara.interaction.commands.SlashCommandDefinition; -import net.tomatentum.marinara.interaction.ident.InteractionIdentifier; public abstract class LibraryWrapper { private List> interactionSubscriber; protected LibraryWrapper() { - interactionSubscriber = new ArrayList<>(); + this.interactionSubscriber = new ArrayList<>(); } public void handleInteraction(Object context) { @@ -27,8 +26,8 @@ public abstract class LibraryWrapper { } public abstract void registerSlashCommands(SlashCommandDefinition[] defs); - public abstract InteractionIdentifier getInteractionIdentifier(Object context); - + + public abstract IdentifierProvider createIdentifierProvider(); public abstract ContextObjectProvider getContextObjectProvider(); } \ No newline at end of file diff --git a/wrapper/discord4j/src/main/java/net/tomatentum/marinara/wrapper/discord4j/Discord4JWrapper.java b/wrapper/discord4j/src/main/java/net/tomatentum/marinara/wrapper/discord4j/Discord4JWrapper.java index 6b58a0b..4490885 100644 --- a/wrapper/discord4j/src/main/java/net/tomatentum/marinara/wrapper/discord4j/Discord4JWrapper.java +++ b/wrapper/discord4j/src/main/java/net/tomatentum/marinara/wrapper/discord4j/Discord4JWrapper.java @@ -8,9 +8,6 @@ import java.util.function.Function; import org.apache.logging.log4j.Logger; import discord4j.core.GatewayDiscordClient; -import discord4j.core.event.domain.interaction.ButtonInteractionEvent; -import discord4j.core.event.domain.interaction.ChatInputAutoCompleteEvent; -import discord4j.core.event.domain.interaction.ChatInputInteractionEvent; import discord4j.core.event.domain.interaction.InteractionCreateEvent; import discord4j.core.object.command.ApplicationCommandInteractionOption; import discord4j.core.object.command.ApplicationCommandOption.Type; @@ -18,13 +15,15 @@ import discord4j.discordjson.json.ApplicationCommandOptionChoiceData; import discord4j.discordjson.json.ApplicationCommandOptionData; import discord4j.discordjson.json.ApplicationCommandRequest; -import net.tomatentum.marinara.interaction.InteractionType; import net.tomatentum.marinara.interaction.commands.SlashCommandDefinition; -import net.tomatentum.marinara.interaction.ident.InteractionIdentifier; import net.tomatentum.marinara.util.LoggerUtil; import net.tomatentum.marinara.wrapper.CommandConverter; import net.tomatentum.marinara.wrapper.ContextObjectProvider; +import net.tomatentum.marinara.wrapper.IdentifierProvider; import net.tomatentum.marinara.wrapper.LibraryWrapper; +import net.tomatentum.marinara.wrapper.discord4j.identifierconverter.AutocompleteIdentifierConverter; +import net.tomatentum.marinara.wrapper.discord4j.identifierconverter.ButtonIdentifierConverter; +import net.tomatentum.marinara.wrapper.discord4j.identifierconverter.SlashCommandIdentifierConverter; public class Discord4JWrapper extends LibraryWrapper { @@ -82,49 +81,12 @@ public class Discord4JWrapper extends LibraryWrapper { } @Override - public InteractionIdentifier getInteractionIdentifier(Object context) { - - if (context instanceof ButtonInteractionEvent) { - ButtonInteractionEvent interaction = (ButtonInteractionEvent) context; - return InteractionIdentifier.builder().name(interaction.getCustomId()).type(InteractionType.BUTTON).build(); - } - - List options; - String commandName; - boolean isAutocomplete = false; - - if (context instanceof ChatInputInteractionEvent) { - ChatInputInteractionEvent interaction = (ChatInputInteractionEvent) context; - options = SUB_FILTER.apply(interaction.getOptions()); - commandName = interaction.getCommandName(); - }else if (context instanceof ChatInputAutoCompleteEvent) { - ChatInputAutoCompleteEvent interaction = (ChatInputAutoCompleteEvent) context; - options = SUB_FILTER.apply(interaction.getOptions()); - commandName = interaction.getCommandName(); - isAutocomplete = true; - }else - return null; - - InteractionIdentifier last = InteractionIdentifier.slashBuilder().name(commandName).autocomplete(isAutocomplete).build(); - - if (!options.isEmpty()) { - List sub_options = SUB_FILTER.apply(options.getFirst().getOptions()); - if (!sub_options.isEmpty()) { - last = InteractionIdentifier.builder() - .name(options.getFirst().getName()) - .type(isAutocomplete ? InteractionType.AUTOCOMPLETE : InteractionType.COMMAND) - .parent(last).build(); - last = InteractionIdentifier.slashBuilder() - .name(sub_options.getFirst().getName()) - .autocomplete(isAutocomplete) - .parent(last).build(); - }else - last = InteractionIdentifier.slashBuilder() - .name(options.getFirst().getName()) - .autocomplete(isAutocomplete) - .parent(last).build(); - } - return last; + public IdentifierProvider createIdentifierProvider() { + return IdentifierProvider.of( + new SlashCommandIdentifierConverter(), + new AutocompleteIdentifierConverter(), + new ButtonIdentifierConverter() + ); } @Override diff --git a/wrapper/discord4j/src/main/java/net/tomatentum/marinara/wrapper/discord4j/identifierconverter/AutocompleteIdentifierConverter.java b/wrapper/discord4j/src/main/java/net/tomatentum/marinara/wrapper/discord4j/identifierconverter/AutocompleteIdentifierConverter.java new file mode 100644 index 0000000..49761d9 --- /dev/null +++ b/wrapper/discord4j/src/main/java/net/tomatentum/marinara/wrapper/discord4j/identifierconverter/AutocompleteIdentifierConverter.java @@ -0,0 +1,38 @@ +package net.tomatentum.marinara.wrapper.discord4j.identifierconverter; + +import java.util.List; + +import discord4j.core.event.domain.interaction.ChatInputAutoCompleteEvent; +import discord4j.core.object.command.ApplicationCommandInteractionOption; +import net.tomatentum.marinara.interaction.InteractionType; +import net.tomatentum.marinara.interaction.ident.InteractionIdentifier; +import net.tomatentum.marinara.wrapper.IdentifierProvider; +import net.tomatentum.marinara.wrapper.discord4j.Discord4JWrapper; + +public class AutocompleteIdentifierConverter implements IdentifierProvider.Converter { + + @Override + public InteractionIdentifier convert(ChatInputAutoCompleteEvent context) { + List options = Discord4JWrapper.SUB_FILTER.apply(context.getOptions()); + String commandName = context.getCommandName(); + + if (!options.isEmpty()) { + List sub_options = Discord4JWrapper.SUB_FILTER.apply(options.getFirst().getOptions()); + if (!sub_options.isEmpty()) + return InteractionIdentifier.createHierarchy( + InteractionType.AUTOCOMPLETE, + commandName, + options.getFirst().getName(), + sub_options.getFirst().getName()); + else + return InteractionIdentifier.createHierarchy( + InteractionType.AUTOCOMPLETE, + commandName, + options.getFirst().getName()); + }else + return InteractionIdentifier.createHierarchy( + InteractionType.AUTOCOMPLETE, + commandName); + } + +} diff --git a/wrapper/discord4j/src/main/java/net/tomatentum/marinara/wrapper/discord4j/identifierconverter/ButtonIdentifierConverter.java b/wrapper/discord4j/src/main/java/net/tomatentum/marinara/wrapper/discord4j/identifierconverter/ButtonIdentifierConverter.java new file mode 100644 index 0000000..8751d4f --- /dev/null +++ b/wrapper/discord4j/src/main/java/net/tomatentum/marinara/wrapper/discord4j/identifierconverter/ButtonIdentifierConverter.java @@ -0,0 +1,15 @@ +package net.tomatentum.marinara.wrapper.discord4j.identifierconverter; + +import discord4j.core.event.domain.interaction.ButtonInteractionEvent; +import net.tomatentum.marinara.interaction.InteractionType; +import net.tomatentum.marinara.interaction.ident.InteractionIdentifier; +import net.tomatentum.marinara.wrapper.IdentifierProvider; + +public class ButtonIdentifierConverter implements IdentifierProvider.Converter { + + @Override + public InteractionIdentifier convert(ButtonInteractionEvent context) { + return InteractionIdentifier.builder().name(context.getCustomId()).type(InteractionType.BUTTON).build(); + } + +} diff --git a/wrapper/discord4j/src/main/java/net/tomatentum/marinara/wrapper/discord4j/identifierconverter/SlashCommandIdentifierConverter.java b/wrapper/discord4j/src/main/java/net/tomatentum/marinara/wrapper/discord4j/identifierconverter/SlashCommandIdentifierConverter.java new file mode 100644 index 0000000..612cd0a --- /dev/null +++ b/wrapper/discord4j/src/main/java/net/tomatentum/marinara/wrapper/discord4j/identifierconverter/SlashCommandIdentifierConverter.java @@ -0,0 +1,39 @@ +package net.tomatentum.marinara.wrapper.discord4j.identifierconverter; + +import java.util.List; + +import discord4j.core.event.domain.interaction.ChatInputInteractionEvent; +import discord4j.core.object.command.ApplicationCommandInteractionOption; +import net.tomatentum.marinara.interaction.InteractionType; +import net.tomatentum.marinara.interaction.ident.InteractionIdentifier; +import net.tomatentum.marinara.wrapper.IdentifierProvider; +import net.tomatentum.marinara.wrapper.discord4j.Discord4JWrapper; + +public class SlashCommandIdentifierConverter implements IdentifierProvider.Converter { + + @Override + public InteractionIdentifier convert(ChatInputInteractionEvent context) { + List options = Discord4JWrapper.SUB_FILTER.apply(context.getOptions()); + String commandName = context.getCommandName(); + + if (!options.isEmpty()) { + List sub_options = Discord4JWrapper.SUB_FILTER.apply(options.getFirst().getOptions()); + if (!sub_options.isEmpty()) + return InteractionIdentifier.createHierarchy( + InteractionType.COMMAND, + commandName, + options.getFirst().getName(), + sub_options.getFirst().getName()); + else + return InteractionIdentifier.createHierarchy( + InteractionType.COMMAND, + commandName, + options.getFirst().getName()); + }else + return InteractionIdentifier.createHierarchy( + InteractionType.COMMAND, + commandName); + + } + +} diff --git a/wrapper/javacord/src/main/java/net/tomatentum/marinara/wrapper/javacord/JavacordWrapper.java b/wrapper/javacord/src/main/java/net/tomatentum/marinara/wrapper/javacord/JavacordWrapper.java index fb1a038..5545e32 100644 --- a/wrapper/javacord/src/main/java/net/tomatentum/marinara/wrapper/javacord/JavacordWrapper.java +++ b/wrapper/javacord/src/main/java/net/tomatentum/marinara/wrapper/javacord/JavacordWrapper.java @@ -2,26 +2,23 @@ package net.tomatentum.marinara.wrapper.javacord; import java.util.HashMap; import java.util.HashSet; -import java.util.List; import java.util.Set; import org.apache.logging.log4j.Logger; import org.javacord.api.DiscordApi; -import org.javacord.api.interaction.AutocompleteInteraction; -import org.javacord.api.interaction.ButtonInteraction; import org.javacord.api.interaction.SlashCommandBuilder; -import org.javacord.api.interaction.SlashCommandInteraction; -import org.javacord.api.interaction.SlashCommandInteractionOption; import org.javacord.api.interaction.SlashCommandOption; import org.javacord.api.interaction.SlashCommandOptionChoice; -import net.tomatentum.marinara.interaction.InteractionType; import net.tomatentum.marinara.interaction.commands.SlashCommandDefinition; -import net.tomatentum.marinara.interaction.ident.InteractionIdentifier; import net.tomatentum.marinara.wrapper.CommandConverter; import net.tomatentum.marinara.wrapper.ContextObjectProvider; +import net.tomatentum.marinara.wrapper.IdentifierProvider; import net.tomatentum.marinara.util.LoggerUtil; import net.tomatentum.marinara.wrapper.LibraryWrapper; +import net.tomatentum.marinara.wrapper.javacord.identifierconverter.AutocompleteIdentifierConverter; +import net.tomatentum.marinara.wrapper.javacord.identifierconverter.ButtonIdentifierConverter; +import net.tomatentum.marinara.wrapper.javacord.identifierconverter.SlashCommandIdentifierConverter; public class JavacordWrapper extends LibraryWrapper { @@ -65,47 +62,12 @@ public class JavacordWrapper extends LibraryWrapper { } @Override - public InteractionIdentifier getInteractionIdentifier(Object context) { - if (context instanceof ButtonInteraction) { - ButtonInteraction button = (ButtonInteraction) context; - return InteractionIdentifier.builder().name(button.getCustomId()).type(InteractionType.BUTTON).build(); - } - - if (!(context instanceof SlashCommandInteraction)) - return null; - - boolean isAutocomplete = false; - - if (context instanceof AutocompleteInteraction) - isAutocomplete = true; - - SlashCommandInteraction interaction = (SlashCommandInteraction) context; - InteractionIdentifier lastIdentifier = InteractionIdentifier.rootBuilder() - .name(interaction.getCommandName()) - .autocomplete(isAutocomplete) - .build(); - List options = interaction.getOptions(); - if (!options.isEmpty()) { - if (!options.getFirst().getArguments().isEmpty()) { - lastIdentifier = InteractionIdentifier.builder() - .name(options.getFirst().getName()) - .type(isAutocomplete ? InteractionType.AUTOCOMPLETE : InteractionType.COMMAND) - .parent(lastIdentifier) - .build(); - lastIdentifier = InteractionIdentifier.slashBuilder() - .name(options.getFirst().getOptions().getFirst().getName()) - .autocomplete(isAutocomplete) - .parent(lastIdentifier) - .build(); - }else - lastIdentifier = InteractionIdentifier.slashBuilder() - .name(options.getFirst().getName()) - .autocomplete(isAutocomplete) - .parent(lastIdentifier) - .build(); - } - - return lastIdentifier; + public IdentifierProvider createIdentifierProvider() { + return IdentifierProvider.of( + new SlashCommandIdentifierConverter(), + new AutocompleteIdentifierConverter(), + new ButtonIdentifierConverter() + ); } @Override diff --git a/wrapper/javacord/src/main/java/net/tomatentum/marinara/wrapper/javacord/identifierconverter/AutocompleteIdentifierConverter.java b/wrapper/javacord/src/main/java/net/tomatentum/marinara/wrapper/javacord/identifierconverter/AutocompleteIdentifierConverter.java new file mode 100644 index 0000000..65fef44 --- /dev/null +++ b/wrapper/javacord/src/main/java/net/tomatentum/marinara/wrapper/javacord/identifierconverter/AutocompleteIdentifierConverter.java @@ -0,0 +1,37 @@ +package net.tomatentum.marinara.wrapper.javacord.identifierconverter; + +import java.util.List; + +import org.javacord.api.interaction.AutocompleteInteraction; +import org.javacord.api.interaction.SlashCommandInteractionOption; + +import net.tomatentum.marinara.interaction.InteractionType; +import net.tomatentum.marinara.interaction.ident.InteractionIdentifier; +import net.tomatentum.marinara.wrapper.IdentifierProvider; + +public class AutocompleteIdentifierConverter implements IdentifierProvider.Converter { + + @Override + public InteractionIdentifier convert(AutocompleteInteraction context) { + List options = context.getOptions(); + String commandName = context.getCommandName(); + if (!options.isEmpty()) { + List sub_options = context.getOptions().getFirst().getOptions(); + if (!sub_options.isEmpty()) + return InteractionIdentifier.createHierarchy( + InteractionType.AUTOCOMPLETE, + commandName, + options.getFirst().getName(), + sub_options.getFirst().getName()); + else + return InteractionIdentifier.createHierarchy( + InteractionType.AUTOCOMPLETE, + commandName, + options.getFirst().getName()); + }else + return InteractionIdentifier.createHierarchy( + InteractionType.AUTOCOMPLETE, + commandName); + } + +} diff --git a/wrapper/javacord/src/main/java/net/tomatentum/marinara/wrapper/javacord/identifierconverter/ButtonIdentifierConverter.java b/wrapper/javacord/src/main/java/net/tomatentum/marinara/wrapper/javacord/identifierconverter/ButtonIdentifierConverter.java new file mode 100644 index 0000000..209ce32 --- /dev/null +++ b/wrapper/javacord/src/main/java/net/tomatentum/marinara/wrapper/javacord/identifierconverter/ButtonIdentifierConverter.java @@ -0,0 +1,16 @@ +package net.tomatentum.marinara.wrapper.javacord.identifierconverter; + +import org.javacord.api.interaction.ButtonInteraction; + +import net.tomatentum.marinara.interaction.InteractionType; +import net.tomatentum.marinara.interaction.ident.InteractionIdentifier; +import net.tomatentum.marinara.wrapper.IdentifierProvider; + +public class ButtonIdentifierConverter implements IdentifierProvider.Converter { + + @Override + public InteractionIdentifier convert(ButtonInteraction context) { + return InteractionIdentifier.builder().name(context.getCustomId()).type(InteractionType.BUTTON).build(); + } + +} diff --git a/wrapper/javacord/src/main/java/net/tomatentum/marinara/wrapper/javacord/identifierconverter/SlashCommandIdentifierConverter.java b/wrapper/javacord/src/main/java/net/tomatentum/marinara/wrapper/javacord/identifierconverter/SlashCommandIdentifierConverter.java new file mode 100644 index 0000000..4b90bd1 --- /dev/null +++ b/wrapper/javacord/src/main/java/net/tomatentum/marinara/wrapper/javacord/identifierconverter/SlashCommandIdentifierConverter.java @@ -0,0 +1,38 @@ +package net.tomatentum.marinara.wrapper.javacord.identifierconverter; + +import java.util.List; + +import org.javacord.api.interaction.SlashCommandInteraction; +import org.javacord.api.interaction.SlashCommandInteractionOption; + +import net.tomatentum.marinara.interaction.InteractionType; +import net.tomatentum.marinara.interaction.ident.InteractionIdentifier; +import net.tomatentum.marinara.wrapper.IdentifierProvider; + +public class SlashCommandIdentifierConverter implements IdentifierProvider.Converter { + + @Override + public InteractionIdentifier convert(SlashCommandInteraction context) { + List options = context.getOptions(); + String commandName = context.getCommandName(); + if (!options.isEmpty()) { + List sub_options = context.getOptions().getFirst().getOptions(); + if (!sub_options.isEmpty()) + return InteractionIdentifier.createHierarchy( + InteractionType.COMMAND, + commandName, + options.getFirst().getName(), + sub_options.getFirst().getName()); + else + return InteractionIdentifier.createHierarchy( + InteractionType.COMMAND, + commandName, + options.getFirst().getName()); + }else + return InteractionIdentifier.createHierarchy( + InteractionType.COMMAND, + commandName); + + } + +}