- add prototype Interactioncheck impementation.
- refactor dependency injection to have all widely used dependencies in the Marinara class.
This commit is contained in:
parent
582e0f0bae
commit
f89ae5e425
@ -1,22 +1,34 @@
|
|||||||
package net.tomatentum.marinara;
|
package net.tomatentum.marinara;
|
||||||
|
|
||||||
|
import net.tomatentum.marinara.registry.InteractionCheckRegistry;
|
||||||
import net.tomatentum.marinara.registry.InteractionRegistry;
|
import net.tomatentum.marinara.registry.InteractionRegistry;
|
||||||
import net.tomatentum.marinara.wrapper.LibraryWrapper;
|
import net.tomatentum.marinara.wrapper.LibraryWrapper;
|
||||||
|
|
||||||
public class Marinara {
|
public class Marinara {
|
||||||
|
|
||||||
public static <T extends LibraryWrapper> Marinara load(LibraryWrapper wrapper) {
|
public static <T extends LibraryWrapper> Marinara load(LibraryWrapper wrapper) {
|
||||||
InteractionRegistry registry = new InteractionRegistry(wrapper);
|
return new Marinara(wrapper);
|
||||||
return new Marinara(registry);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private InteractionRegistry registry;
|
private InteractionRegistry registry;
|
||||||
|
private InteractionCheckRegistry checkRegistry;
|
||||||
|
private LibraryWrapper wrapper;
|
||||||
|
|
||||||
private Marinara(InteractionRegistry registry) {
|
private Marinara(LibraryWrapper wrapper) {
|
||||||
this.registry = registry;
|
this.wrapper = wrapper;
|
||||||
|
this.registry = new InteractionRegistry(this);
|
||||||
|
this.checkRegistry = new InteractionCheckRegistry();
|
||||||
}
|
}
|
||||||
|
|
||||||
public InteractionRegistry getRegistry() {
|
public InteractionRegistry getRegistry() {
|
||||||
return registry;
|
return registry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public InteractionCheckRegistry getCheckRegistry() {
|
||||||
|
return checkRegistry;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LibraryWrapper getWrapper() {
|
||||||
|
return wrapper;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,26 @@
|
|||||||
|
package net.tomatentum.marinara.checks;
|
||||||
|
|
||||||
|
import java.lang.annotation.Annotation;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
|
||||||
|
public record AppliedCheck(InteractionCheck<?> check, Annotation annotation) {
|
||||||
|
|
||||||
|
public boolean pre() {
|
||||||
|
try {
|
||||||
|
return (boolean) check.getClass().getMethod("preExec", annotation.getClass()).invoke(check, annotation);
|
||||||
|
} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException | SecurityException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean post() {
|
||||||
|
try {
|
||||||
|
return (boolean) check.getClass().getMethod("postExec", annotation.getClass()).invoke(check, annotation);
|
||||||
|
} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException | SecurityException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
package net.tomatentum.marinara.checks;
|
||||||
|
|
||||||
|
import java.lang.annotation.Annotation;
|
||||||
|
|
||||||
|
public interface InteractionCheck<A extends Annotation> {
|
||||||
|
|
||||||
|
public boolean preExec(A annotation);
|
||||||
|
public boolean postExec(A annotation);
|
||||||
|
|
||||||
|
}
|
@ -2,18 +2,18 @@ package net.tomatentum.marinara.interaction.methods;
|
|||||||
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
import net.tomatentum.marinara.Marinara;
|
||||||
import net.tomatentum.marinara.interaction.InteractionHandler;
|
import net.tomatentum.marinara.interaction.InteractionHandler;
|
||||||
import net.tomatentum.marinara.interaction.InteractionType;
|
import net.tomatentum.marinara.interaction.InteractionType;
|
||||||
import net.tomatentum.marinara.parser.AnnotationParser;
|
import net.tomatentum.marinara.parser.AnnotationParser;
|
||||||
import net.tomatentum.marinara.parser.ButtonParser;
|
import net.tomatentum.marinara.parser.ButtonParser;
|
||||||
import net.tomatentum.marinara.wrapper.LibraryWrapper;
|
|
||||||
|
|
||||||
public class ButtonInteractionMethod extends InteractionMethod {
|
public class ButtonInteractionMethod extends InteractionMethod {
|
||||||
|
|
||||||
private String customId;
|
private String customId;
|
||||||
|
|
||||||
ButtonInteractionMethod(Method method, InteractionHandler handler, LibraryWrapper wrapper) {
|
ButtonInteractionMethod(Method method, InteractionHandler handler, Marinara marinara) {
|
||||||
super(method, handler, wrapper);
|
super(method, handler, marinara);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -26,12 +26,12 @@ public class ButtonInteractionMethod extends InteractionMethod {
|
|||||||
@Override
|
@Override
|
||||||
public Object getParameter(Object parameter, int index) {
|
public Object getParameter(Object parameter, int index) {
|
||||||
Class<?> type = getMethod().getParameterTypes()[index+1];
|
Class<?> type = getMethod().getParameterTypes()[index+1];
|
||||||
return wrapper.getComponentContextObject(parameter, type);
|
return marinara.getWrapper().getComponentContextObject(parameter, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canRun(Object context) {
|
public boolean canRun(Object context) {
|
||||||
return wrapper.getButtonId(context).equals(customId);
|
return marinara.getWrapper().getButtonId(context).equals(customId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -7,37 +7,48 @@ import java.util.ArrayList;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import net.tomatentum.marinara.Marinara;
|
||||||
|
import net.tomatentum.marinara.checks.AppliedCheck;
|
||||||
import net.tomatentum.marinara.interaction.InteractionHandler;
|
import net.tomatentum.marinara.interaction.InteractionHandler;
|
||||||
import net.tomatentum.marinara.interaction.InteractionType;
|
import net.tomatentum.marinara.interaction.InteractionType;
|
||||||
import net.tomatentum.marinara.interaction.annotation.Button;
|
import net.tomatentum.marinara.interaction.annotation.Button;
|
||||||
import net.tomatentum.marinara.interaction.commands.annotation.SlashCommand;
|
import net.tomatentum.marinara.interaction.commands.annotation.SlashCommand;
|
||||||
import net.tomatentum.marinara.interaction.commands.annotation.SubCommand;
|
import net.tomatentum.marinara.interaction.commands.annotation.SubCommand;
|
||||||
import net.tomatentum.marinara.parser.AnnotationParser;
|
import net.tomatentum.marinara.parser.AnnotationParser;
|
||||||
import net.tomatentum.marinara.wrapper.LibraryWrapper;
|
import net.tomatentum.marinara.parser.InteractionCheckParser;
|
||||||
|
|
||||||
public abstract class InteractionMethod {
|
public abstract class InteractionMethod {
|
||||||
|
|
||||||
public static InteractionMethod create(Method method, InteractionHandler handler, LibraryWrapper wrapper) {
|
public static InteractionMethod create(Method method, InteractionHandler handler, Marinara marinara) {
|
||||||
if (method.isAnnotationPresent(SlashCommand.class) || method.isAnnotationPresent(SubCommand.class))
|
if (method.isAnnotationPresent(SlashCommand.class) || method.isAnnotationPresent(SubCommand.class))
|
||||||
return new SlashCommandInteractionMethod(method, handler, wrapper);
|
return new SlashCommandInteractionMethod(method, handler, marinara);
|
||||||
if (method.isAnnotationPresent(Button.class))
|
if (method.isAnnotationPresent(Button.class))
|
||||||
return new ButtonInteractionMethod(method, handler, wrapper);
|
return new ButtonInteractionMethod(method, handler, marinara);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Method method;
|
protected Method method;
|
||||||
protected InteractionHandler handler;
|
protected InteractionHandler handler;
|
||||||
protected LibraryWrapper wrapper;
|
protected Marinara marinara;
|
||||||
protected AnnotationParser[] parsers;
|
protected List<AnnotationParser> parsers;
|
||||||
|
protected List<AppliedCheck> appliedChecks;
|
||||||
|
|
||||||
protected InteractionMethod(Method method, InteractionHandler handler, LibraryWrapper wrapper) {
|
protected InteractionMethod(Method method,
|
||||||
|
InteractionHandler handler,
|
||||||
|
Marinara marinara
|
||||||
|
) {
|
||||||
if (!Arrays.asList(handler.getClass().getMethods()).contains(method))
|
if (!Arrays.asList(handler.getClass().getMethods()).contains(method))
|
||||||
throw new InvalidParameterException("Method does not apply to specified handler");
|
throw new InvalidParameterException("Method does not apply to specified handler");
|
||||||
|
|
||||||
this.method = method;
|
this.method = method;
|
||||||
this.handler = handler;
|
this.handler = handler;
|
||||||
this.wrapper = wrapper;
|
this.marinara = marinara;
|
||||||
this.parsers = getParsers();
|
this.parsers = new ArrayList<>(Arrays.asList(getParsers()));
|
||||||
Arrays.stream(parsers).forEach(AnnotationParser::parse);
|
this.appliedChecks = new ArrayList<>();
|
||||||
|
|
||||||
|
parsers.add(new InteractionCheckParser(method, appliedChecks::add, marinara.getCheckRegistry()));
|
||||||
|
|
||||||
|
parsers.stream().forEach(AnnotationParser::parse);
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract AnnotationParser[] getParsers();
|
public abstract AnnotationParser[] getParsers();
|
||||||
@ -49,6 +60,23 @@ public abstract class InteractionMethod {
|
|||||||
public abstract InteractionType getType();
|
public abstract InteractionType getType();
|
||||||
|
|
||||||
public void run(Object context) {
|
public void run(Object context) {
|
||||||
|
this.appliedChecks.forEach(AppliedCheck::pre);
|
||||||
|
|
||||||
|
method.setAccessible(true);
|
||||||
|
try {
|
||||||
|
method.invoke(handler, getParameters(context));
|
||||||
|
}catch (IllegalAccessException | InvocationTargetException ex) {
|
||||||
|
throw new RuntimeException(ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.appliedChecks.forEach(AppliedCheck::post);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Method getMethod() {
|
||||||
|
return method;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Object[] getParameters(Object context) {
|
||||||
int parameterCount = method.getParameterCount();
|
int parameterCount = method.getParameterCount();
|
||||||
List<Object> parameters = new ArrayList<>();
|
List<Object> parameters = new ArrayList<>();
|
||||||
|
|
||||||
@ -59,16 +87,7 @@ public abstract class InteractionMethod {
|
|||||||
}
|
}
|
||||||
parameters.add(getParameter(context, i-1));
|
parameters.add(getParameter(context, i-1));
|
||||||
}
|
}
|
||||||
method.setAccessible(true);
|
return parameters.toArray();
|
||||||
try {
|
|
||||||
method.invoke(handler, parameters.toArray());
|
|
||||||
}catch (IllegalAccessException | InvocationTargetException ex) {
|
|
||||||
throw new RuntimeException(ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Method getMethod() {
|
|
||||||
return method;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -2,19 +2,19 @@ package net.tomatentum.marinara.interaction.methods;
|
|||||||
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
import net.tomatentum.marinara.Marinara;
|
||||||
import net.tomatentum.marinara.interaction.InteractionHandler;
|
import net.tomatentum.marinara.interaction.InteractionHandler;
|
||||||
import net.tomatentum.marinara.interaction.InteractionType;
|
import net.tomatentum.marinara.interaction.InteractionType;
|
||||||
import net.tomatentum.marinara.interaction.commands.ExecutableSlashCommandDefinition;
|
import net.tomatentum.marinara.interaction.commands.ExecutableSlashCommandDefinition;
|
||||||
import net.tomatentum.marinara.parser.AnnotationParser;
|
import net.tomatentum.marinara.parser.AnnotationParser;
|
||||||
import net.tomatentum.marinara.parser.SlashCommandParser;
|
import net.tomatentum.marinara.parser.SlashCommandParser;
|
||||||
import net.tomatentum.marinara.wrapper.LibraryWrapper;
|
|
||||||
|
|
||||||
public class SlashCommandInteractionMethod extends InteractionMethod {
|
public class SlashCommandInteractionMethod extends InteractionMethod {
|
||||||
|
|
||||||
private ExecutableSlashCommandDefinition commandDefinition;
|
private ExecutableSlashCommandDefinition commandDefinition;
|
||||||
|
|
||||||
SlashCommandInteractionMethod(Method method, InteractionHandler handler, LibraryWrapper wrapper) {
|
SlashCommandInteractionMethod(Method method, InteractionHandler handler, Marinara marinara) {
|
||||||
super(method, handler, wrapper);
|
super(method, handler, marinara);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -26,12 +26,12 @@ public class SlashCommandInteractionMethod extends InteractionMethod {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object getParameter(Object context, int index) {
|
public Object getParameter(Object context, int index) {
|
||||||
return wrapper.convertCommandOption(context, commandDefinition.options()[index].type(), commandDefinition.options()[index].name());
|
return marinara.getWrapper().convertCommandOption(context, commandDefinition.options()[index].type(), commandDefinition.options()[index].name());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canRun(Object context) {
|
public boolean canRun(Object context) {
|
||||||
ExecutableSlashCommandDefinition other = wrapper.getCommandDefinition(context);
|
ExecutableSlashCommandDefinition other = marinara.getWrapper().getCommandDefinition(context);
|
||||||
return commandDefinition.equals(other);
|
return commandDefinition.equals(other);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,42 @@
|
|||||||
|
package net.tomatentum.marinara.parser;
|
||||||
|
|
||||||
|
import java.lang.annotation.Annotation;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
import net.tomatentum.marinara.checks.AppliedCheck;
|
||||||
|
import net.tomatentum.marinara.checks.InteractionCheck;
|
||||||
|
import net.tomatentum.marinara.registry.InteractionCheckRegistry;
|
||||||
|
|
||||||
|
public class InteractionCheckParser implements AnnotationParser {
|
||||||
|
|
||||||
|
private InteractionCheckRegistry checkRegistry;
|
||||||
|
private Method method;
|
||||||
|
private Consumer<AppliedCheck> consumer;
|
||||||
|
|
||||||
|
public InteractionCheckParser(Method method, Consumer<AppliedCheck> consumer, InteractionCheckRegistry checkRegistry) {
|
||||||
|
this.checkRegistry = checkRegistry;
|
||||||
|
this.method = method;
|
||||||
|
this.consumer = consumer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void parse() {
|
||||||
|
Annotation[] annotations = method.getAnnotations();
|
||||||
|
Arrays.stream(annotations).forEach(this::convertAnnotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void convertAnnotation(Annotation annotation) {
|
||||||
|
Optional<InteractionCheck<?>> check = this.checkRegistry.getCheckFromAnnotation(annotation.getClass());
|
||||||
|
if (check.isPresent())
|
||||||
|
consumer.accept(new AppliedCheck(check.get(), annotation));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Method getMethod() {
|
||||||
|
return this.method;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
package net.tomatentum.marinara.registry;
|
||||||
|
|
||||||
|
import java.lang.annotation.Annotation;
|
||||||
|
import java.lang.reflect.TypeVariable;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
import net.tomatentum.marinara.checks.InteractionCheck;
|
||||||
|
|
||||||
|
public class InteractionCheckRegistry {
|
||||||
|
|
||||||
|
private List<InteractionCheck<?>> checks;
|
||||||
|
|
||||||
|
public InteractionCheckRegistry() {
|
||||||
|
this.checks = new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addCheck(InteractionCheck<?> check) {
|
||||||
|
checks.add(check);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Optional<InteractionCheck<?>> getCheckFromAnnotation(Class<? extends Annotation> annotation) {
|
||||||
|
for (InteractionCheck<?> interactionCheck : checks) {
|
||||||
|
TypeVariable<?> type = interactionCheck.getClass().getTypeParameters()[0];
|
||||||
|
if (type.getClass().equals(annotation.getClass()))
|
||||||
|
return Optional.of(interactionCheck);
|
||||||
|
}
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -5,27 +5,27 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
|
import net.tomatentum.marinara.Marinara;
|
||||||
import net.tomatentum.marinara.interaction.InteractionHandler;
|
import net.tomatentum.marinara.interaction.InteractionHandler;
|
||||||
import net.tomatentum.marinara.interaction.InteractionType;
|
import net.tomatentum.marinara.interaction.InteractionType;
|
||||||
import net.tomatentum.marinara.interaction.commands.SlashCommandDefinition;
|
import net.tomatentum.marinara.interaction.commands.SlashCommandDefinition;
|
||||||
import net.tomatentum.marinara.interaction.commands.ExecutableSlashCommandDefinition;
|
import net.tomatentum.marinara.interaction.commands.ExecutableSlashCommandDefinition;
|
||||||
import net.tomatentum.marinara.interaction.methods.SlashCommandInteractionMethod;
|
import net.tomatentum.marinara.interaction.methods.SlashCommandInteractionMethod;
|
||||||
import net.tomatentum.marinara.interaction.methods.InteractionMethod;
|
import net.tomatentum.marinara.interaction.methods.InteractionMethod;
|
||||||
import net.tomatentum.marinara.wrapper.LibraryWrapper;
|
|
||||||
|
|
||||||
public class InteractionRegistry {
|
public class InteractionRegistry {
|
||||||
private List<InteractionMethod> interactionMethods;
|
private List<InteractionMethod> interactionMethods;
|
||||||
private LibraryWrapper wrapper;
|
private Marinara marinara;
|
||||||
|
|
||||||
public InteractionRegistry(LibraryWrapper wrapper) {
|
public InteractionRegistry(Marinara marinara) {
|
||||||
this.interactionMethods = new ArrayList<>();
|
this.interactionMethods = new ArrayList<>();
|
||||||
this.wrapper = wrapper;
|
this.marinara = marinara;
|
||||||
wrapper.subscribeInteractions(this::handle);
|
marinara.getWrapper().subscribeInteractions(this::handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addInteractions(InteractionHandler interactionHandler) {
|
public void addInteractions(InteractionHandler interactionHandler) {
|
||||||
for (Method method : interactionHandler.getClass().getMethods()) {
|
for (Method method : interactionHandler.getClass().getMethods()) {
|
||||||
InteractionMethod iMethod = InteractionMethod.create(method, interactionHandler, wrapper);
|
InteractionMethod iMethod = InteractionMethod.create(method, interactionHandler, marinara);
|
||||||
if (iMethod != null)
|
if (iMethod != null)
|
||||||
this.interactionMethods.add(iMethod);
|
this.interactionMethods.add(iMethod);
|
||||||
}
|
}
|
||||||
@ -48,12 +48,12 @@ public class InteractionRegistry {
|
|||||||
defs.add(new SlashCommandDefinition(def.applicationCommand()).addExecutableCommand(def));
|
defs.add(new SlashCommandDefinition(def.applicationCommand()).addExecutableCommand(def));
|
||||||
});
|
});
|
||||||
|
|
||||||
wrapper.registerSlashCommands(defs.toArray(new SlashCommandDefinition[0]));
|
marinara.getWrapper().registerSlashCommands(defs.toArray(new SlashCommandDefinition[0]));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void handle(Object context) {
|
public void handle(Object context) {
|
||||||
interactionMethods.forEach((m) -> {
|
interactionMethods.forEach((m) -> {
|
||||||
InteractionType type = wrapper.getInteractionType(context.getClass());
|
InteractionType type = marinara.getWrapper().getInteractionType(context.getClass());
|
||||||
if (m.getType().equals(type))
|
if (m.getType().equals(type))
|
||||||
m.run(context);
|
m.run(context);
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user