refactor(interaction): seperate InteractionMethod to ReflectedMethod
Some checks failed
github-mirror / push-github (push) Successful in 3s
Build / Gradle-Build (push) Successful in 31s
Test / Gradle-Test (push) Failing after 43s

This commit is contained in:
tueem 2025-03-26 22:22:39 +01:00
parent 0590789359
commit 0973016a74
Signed by: tueem
GPG Key ID: 65C8667EC17A88FB
5 changed files with 102 additions and 64 deletions

View File

@ -1,4 +1,4 @@
package net.tomatentum.marinara.interaction.methods; package net.tomatentum.marinara.interaction.components.methods;
import java.lang.reflect.Method; import java.lang.reflect.Method;
@ -6,6 +6,7 @@ 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.ident.InteractionIdentifier; import net.tomatentum.marinara.interaction.ident.InteractionIdentifier;
import net.tomatentum.marinara.interaction.methods.InteractionMethod;
import net.tomatentum.marinara.parser.AnnotationParser; import net.tomatentum.marinara.parser.AnnotationParser;
import net.tomatentum.marinara.parser.ButtonParser; import net.tomatentum.marinara.parser.ButtonParser;
@ -13,14 +14,14 @@ public class ButtonInteractionMethod extends InteractionMethod {
private String customId; private String customId;
ButtonInteractionMethod(Method method, InteractionHandler handler, Marinara marinara) { public ButtonInteractionMethod(Method method, InteractionHandler handler, Marinara marinara) {
super(method, handler, marinara); super(method, handler, marinara);
} }
@Override @Override
public AnnotationParser[] parsers() { public AnnotationParser[] provideParsers() {
return new AnnotationParser[] { return new AnnotationParser[] {
new ButtonParser(method, (x) -> { this.customId = x; } ) new ButtonParser(method(), (x) -> { this.customId = x; } )
}; };
} }

View File

@ -20,9 +20,9 @@ public class AutoCompleteInteractionMethod extends InteractionMethod {
} }
@Override @Override
public AnnotationParser[] parsers() { public AnnotationParser[] provideParsers() {
return new AnnotationParser[] { return new AnnotationParser[] {
new SlashCommandParser(method, true, (x) -> { this.interactionIdentifier = x; } ) new SlashCommandParser(method(), true, (x) -> { this.interactionIdentifier = x; } )
}; };
} }

View File

@ -1,14 +1,9 @@
package net.tomatentum.marinara.interaction.methods; package net.tomatentum.marinara.interaction.methods;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.security.InvalidParameterException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import org.slf4j.Logger;
import net.tomatentum.marinara.Marinara; import net.tomatentum.marinara.Marinara;
import net.tomatentum.marinara.checks.AppliedCheck; import net.tomatentum.marinara.checks.AppliedCheck;
import net.tomatentum.marinara.interaction.InteractionHandler; import net.tomatentum.marinara.interaction.InteractionHandler;
@ -16,13 +11,13 @@ import net.tomatentum.marinara.interaction.annotation.AutoComplete;
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.interaction.components.methods.ButtonInteractionMethod;
import net.tomatentum.marinara.interaction.ident.InteractionIdentifier; import net.tomatentum.marinara.interaction.ident.InteractionIdentifier;
import net.tomatentum.marinara.parser.AnnotationParser; import net.tomatentum.marinara.parser.AnnotationParser;
import net.tomatentum.marinara.parser.InteractionCheckParser; import net.tomatentum.marinara.parser.InteractionCheckParser;
import net.tomatentum.marinara.util.LoggerUtil; import net.tomatentum.marinara.util.ReflectedMethod;
import net.tomatentum.marinara.util.ReflectionUtil;
public abstract class InteractionMethod { public abstract class InteractionMethod extends ReflectedMethod {
public static InteractionMethod create(Method method, InteractionHandler handler, Marinara marinara) { public static InteractionMethod create(Method method, InteractionHandler handler, Marinara marinara) {
if (method.isAnnotationPresent(AutoComplete.class)) if (method.isAnnotationPresent(AutoComplete.class))
@ -34,72 +29,39 @@ public abstract class InteractionMethod {
return null; return null;
} }
protected Method method;
protected InteractionHandler handler;
protected Marinara marinara; protected Marinara marinara;
protected List<AnnotationParser> parsers;
protected List<AppliedCheck> appliedChecks; protected List<AppliedCheck> appliedChecks;
private Logger logger = LoggerUtil.getLogger(getClass());
protected InteractionMethod( protected InteractionMethod(
Method method, Method method,
InteractionHandler handler, InteractionHandler handler,
Marinara marinara Marinara marinara
) { ) {
if (!Arrays.asList(handler.getClass().getMethods()).contains(method)) super(method, handler);
throw new InvalidParameterException("Method does not apply to specified handler");
this.method = method;
this.handler = handler;
this.marinara = marinara; this.marinara = marinara;
this.parsers = new ArrayList<>(Arrays.asList(parsers()));
this.appliedChecks = new ArrayList<>(); this.appliedChecks = new ArrayList<>();
parsers.add(new InteractionCheckParser(method, appliedChecks::add, marinara.getCheckRegistry()));
parsers.stream().forEach(AnnotationParser::parse);
} }
public void run(Object context) { @Override
public AnnotationParser[] provideParsers() {
return new AnnotationParser[] {
new InteractionCheckParser(method(), appliedChecks::add, marinara.getCheckRegistry())
};
}
@Override
public Object run(Object context) {
Object result = null;
if (this.appliedChecks.stream().filter(x -> !x.pre(context)).count() > 0) if (this.appliedChecks.stream().filter(x -> !x.pre(context)).count() > 0)
return; return null;
method.setAccessible(true); result = super.run(context);
try {
method.invoke(handler, getParameters(context));
}catch (IllegalAccessException | InvocationTargetException ex) {
logger.error("InteractionMethod failed to run", ex);
}
this.appliedChecks.forEach(x -> x.post(context)); this.appliedChecks.forEach(x -> x.post(context));
return result;
} }
public abstract AnnotationParser[] parsers();
public abstract Object getParameter(Object context, int index);
public abstract InteractionIdentifier identifier(); public abstract InteractionIdentifier identifier();
public Method method() {
return method;
}
private Object[] getParameters(Object context) {
int parameterCount = method.getParameterCount();
List<Object> parameters = new ArrayList<>();
for (int i = 0; i < parameterCount; i++) {
Object parameter;
if (i == 0) {
parameter = context;
}else
parameter = getParameter(context, i-1);
logger.trace("Found parameter {}={} for method {}", parameter != null ? parameter.getClass().toString() : " ", parameter, ReflectionUtil.getFullMethodName(method));
parameters.add(parameter);
}
return parameters.toArray();
}
} }

View File

@ -18,9 +18,9 @@ public class SlashCommandInteractionMethod extends InteractionMethod {
} }
@Override @Override
public AnnotationParser[] parsers() { public AnnotationParser[] provideParsers() {
return new AnnotationParser[] { return new AnnotationParser[] {
new SlashCommandParser(method, false, (x) -> { this.interactionIdentifier = x; } ) new SlashCommandParser(method(), false, (x) -> { this.interactionIdentifier = x; } )
}; };
} }

View File

@ -0,0 +1,75 @@
package net.tomatentum.marinara.util;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.security.InvalidParameterException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.slf4j.Logger;
import net.tomatentum.marinara.parser.AnnotationParser;
public abstract class ReflectedMethod {
private Logger logger = LoggerUtil.getLogger(getClass());
private Method method;
private Object containingObject;
protected List<AnnotationParser> parsers;
public ReflectedMethod(Method method, Object containingObject) {
if (!Arrays.asList(containingObject.getClass().getMethods()).contains(method))
throw new InvalidParameterException("Method does not apply to specified handler");
this.method = method;
this.containingObject = containingObject;
this.parsers = new ArrayList<>(Arrays.asList(provideParsers()));
this.parsers.stream().forEach(AnnotationParser::parse);
}
public abstract Object getParameter(Object context, int index);
public abstract AnnotationParser[] provideParsers();
public Object run(Object context) {
method.setAccessible(true);
try {
return method.invoke(containingObject, getParameters(context));
}catch (IllegalAccessException | InvocationTargetException ex) {
logger.error("ReflectedMethod failed to run", ex);
return null;
}
}
public Method method() {
return this.method;
}
public Object containingObject() {
return this.containingObject;
}
public List<AnnotationParser> parsers() {
return this.parsers;
}
private Object[] getParameters(Object context) {
int parameterCount = method.getParameterCount();
List<Object> parameters = new ArrayList<>();
for (int i = 0; i < parameterCount; i++) {
Object parameter;
if (i == 0) {
parameter = context;
}else
parameter = getParameter(context, i-1);
logger.trace("Found parameter {}={} for method {}", parameter != null ? parameter.getClass().toString() : " ", parameter, ReflectionUtil.getFullMethodName(method));
parameters.add(parameter);
}
return parameters.toArray();
}
}