Compare commits

...

2 Commits

Author SHA1 Message Date
76d4d5b525
add Javacord impl 2024-11-05 15:55:01 +01:00
0ce0b3eb4f
Add Button Interaction with specific method parameter support. 2024-11-05 15:54:49 +01:00
4 changed files with 87 additions and 9 deletions

@ -0,0 +1,5 @@
package net.tomatentum.marinara.interaction.annotation;
public @interface Button {
public String customId();
}

@ -0,0 +1,40 @@
package net.tomatentum.marinara.interaction.methods;
import java.lang.reflect.Method;
import net.tomatentum.marinara.interaction.InteractionHandler;
import net.tomatentum.marinara.interaction.InteractionType;
import net.tomatentum.marinara.interaction.annotation.Button;
import net.tomatentum.marinara.wrapper.LibraryWrapper;
public class ButtonInteractionMethod extends InteractionMethod {
private String customId;
ButtonInteractionMethod(Method method, InteractionHandler handler, LibraryWrapper wrapper) {
super(method, handler, wrapper);
parseMethod();
}
@Override
public Object getParameter(Object parameter, int index) {
Class<?> type = getMethod().getParameterTypes()[index];
return wrapper.getComponentContextObject(parameter, type);
}
@Override
public boolean canRun(Object context) {
return wrapper.getButtonId(context).equals(customId);
}
@Override
public InteractionType getType() {
return InteractionType.BUTTON;
}
private void parseMethod() {
Button button = getMethod().getAnnotation(Button.class);
this.customId = button.customId();
}
}

@ -17,7 +17,6 @@ public abstract class LibraryWrapper {
interactionSubscriber = new ArrayList<>();
}
public abstract void registerSlashCommands(SlashCommandDefinition[] defs);
public void handleInteraction(Object context) {
interactionSubscriber.forEach((o) -> o.accept(context));
@ -31,6 +30,11 @@ public abstract class LibraryWrapper {
}
public abstract InteractionType getInteractionType(Class<?> clazz);
public abstract void registerSlashCommands(SlashCommandDefinition[] defs);
public abstract Object convertCommandOption(Object context, SlashCommandOptionType type, String optionName);
public abstract ExecutableSlashCommandDefinition getCommandDefinition(Object context);
public abstract String getButtonId(Object context);
public abstract Object getComponentContextObject(Object context, Class<?> type);
}

@ -6,10 +6,13 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import org.javacord.api.DiscordApi;
import org.javacord.api.entity.channel.TextChannel;
import org.javacord.api.interaction.ApplicationCommandInteraction;
import org.javacord.api.interaction.ButtonInteraction;
import org.javacord.api.interaction.SlashCommandBuilder;
import org.javacord.api.interaction.SlashCommandInteraction;
import org.javacord.api.interaction.SlashCommandInteractionOption;
@ -35,6 +38,14 @@ public class JavacordWrapper extends LibraryWrapper {
api.addInteractionCreateListener((e) -> handleInteraction(e.getInteraction()));
}
@Override
public InteractionType getInteractionType(Class<?> clazz) {
if (ApplicationCommandInteraction.class.isAssignableFrom(clazz))
return InteractionType.COMMAND;
return null;
}
@Override
public void registerSlashCommands(SlashCommandDefinition[] defs) {
HashMap<Long, Set<SlashCommandBuilder>> serverCommands = new HashMap<>();
@ -56,14 +67,6 @@ public class JavacordWrapper extends LibraryWrapper {
api.bulkOverwriteGlobalApplicationCommands(globalCommands);
}
@Override
public InteractionType getInteractionType(Class<?> clazz) {
if (ApplicationCommandInteraction.class.isAssignableFrom(clazz))
return InteractionType.COMMAND;
return null;
}
@Override
public Object convertCommandOption(Object context, SlashCommandOptionType type, String optionName) {
if (!(context instanceof SlashCommandInteraction))
@ -156,4 +159,30 @@ public class JavacordWrapper extends LibraryWrapper {
return null;
}
}
@Override
public String getButtonId(Object context) {
ButtonInteraction button = (ButtonInteraction) context;
return button.getCustomId();
}
@Override
public Object getComponentContextObject(Object context, Class<?> type) {
ButtonInteraction button = (ButtonInteraction) context;
switch (type.getName()) {
case "TextChannel":
return button.getChannel().orElse(null);
case "Message":
return button.getMessage();
case "Server":
return button.getServer().orElse(null);
case "User":
return button.getUser();
case "Member":
return button.getUser();
}
return null;
}
}