Skip to content

Commit 3e16c64

Browse files
committed
update version and stuff
1 parent e729f1a commit 3e16c64

File tree

5 files changed

+188
-30
lines changed

5 files changed

+188
-30
lines changed

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ subprojects {
1313
apply(plugin = "maven-publish")
1414

1515
group = "de.derioo.javautils"
16-
version = "2.6.15"
16+
version = "2.7.0"
1717

1818
repositories {
1919
mavenCentral()
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package de.derioo.javautils.common;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
import lombok.experimental.UtilityClass;
6+
import org.jetbrains.annotations.NotNull;
7+
8+
import java.lang.reflect.InvocationTargetException;
9+
import java.lang.reflect.Method;
10+
import java.lang.reflect.Parameter;
11+
import java.util.*;
12+
import java.util.function.BiPredicate;
13+
14+
@UtilityClass
15+
public class ReflectionsUtility {
16+
17+
public Object callMethod(@NotNull Method method, Object instance, Object... args) throws InvocationTargetException, IllegalAccessException {
18+
return callMethod(method, instance, (o, parameter) -> true, args);
19+
}
20+
21+
public Object callMethod(@NotNull Method method, Object instance, List<Object> args) throws InvocationTargetException, IllegalAccessException {
22+
return callMethod(method, instance, (o, parameter) -> true, args.toArray(Object[]::new));
23+
}
24+
25+
public Object callMethod(@NotNull Method method, Object instance, BiPredicate<Object, Parameter> matches, List<Object> args) throws InvocationTargetException, IllegalAccessException {
26+
return callMethod(method, instance, matches, args.toArray(Object[]::new));
27+
}
28+
29+
public Object callMethod(@NotNull Method method, Object instance, BiPredicate<Object, Parameter> matches, Object... args) throws InvocationTargetException, IllegalAccessException {
30+
List<Object> params = new ArrayList<>();
31+
List<Object> currentArgs = new ArrayList<>(List.of(args));
32+
for (Parameter parameter : method.getParameters()) {
33+
Pair<Object, Integer> result = find(parameter, matches, currentArgs.toArray(Object[]::new));
34+
params.add(result.getFirst());
35+
if (result.getSecond() != null) currentArgs.remove((int) result.getSecond());
36+
}
37+
method.setAccessible(true);
38+
return method.invoke(instance, params.toArray(Object[]::new));
39+
}
40+
41+
42+
private Pair<Object, Integer> find(Parameter parameter, BiPredicate<Object, Parameter> matches, Object... args) {
43+
return Arrays.stream(args)
44+
.filter(o -> {
45+
boolean assignableFrom = o.getClass().isAssignableFrom(parameter.getType());
46+
boolean test = matches.test(o, parameter);
47+
return assignableFrom && test;
48+
})
49+
.findFirst()
50+
.map(o -> new Pair<>(o, Arrays.asList(args).indexOf(o)))
51+
.orElseGet(() -> {
52+
for (int i = 0; i < args.length; i++) {
53+
Object current = args[i];
54+
for (Method method : current.getClass().getDeclaredMethods()) {
55+
if (method.getParameters().length != 0) continue;
56+
if (!method.getName().equals("get")) continue;
57+
if (!method.getReturnType().equals(parameter.getType())) continue;
58+
try {
59+
return new Pair<>(method.invoke(current), i);
60+
} catch (IllegalAccessException | InvocationTargetException e) {
61+
return new Pair<>(null, null);
62+
}
63+
}
64+
}
65+
return new Pair<>(null, null);
66+
});
67+
}
68+
69+
@AllArgsConstructor
70+
@Getter
71+
private static class Pair<T, V> {
72+
73+
private final T first;
74+
private final V second;
75+
76+
}
77+
78+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package de.derioo.javautils.common;
2+
3+
import org.assertj.core.api.Assertions;
4+
import org.junit.jupiter.api.Test;
5+
6+
import java.lang.reflect.InvocationTargetException;
7+
import java.lang.reflect.Method;
8+
9+
import static de.derioo.javautils.common.ReflectionsUtility.callMethod;
10+
11+
public class ReflectionsUtilityTest {
12+
13+
@Test
14+
public void test() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
15+
Method method = getClass().getMethod("testMethod", String.class, Boolean.class);
16+
callMethod(method, this, (o, parameter) -> {
17+
if (o instanceof Boolean && ((Boolean) o).booleanValue()) return false;
18+
return true;
19+
}, "abcasd", true, false);
20+
}
21+
22+
23+
public void testMethod(String abc, Boolean abcd) {
24+
Assertions.assertThat(abc).isEqualTo("abcasd");
25+
Assertions.assertThat(abcd).isFalse();
26+
}
27+
28+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package de.derioo.javautils.discord.command.parsed;
2+
3+
import com.cronutils.model.Cron;
4+
import lombok.Getter;
5+
import lombok.RequiredArgsConstructor;
6+
7+
import java.util.Date;
8+
9+
@Getter
10+
@RequiredArgsConstructor
11+
public class ParsedArgument<T> {
12+
13+
private final T value;
14+
15+
private final ParsedCommand.ParsedSubArgument argument;
16+
17+
18+
public static class StringArgument extends ParsedArgument<String> {
19+
20+
21+
public StringArgument(String value, ParsedCommand.ParsedSubArgument argument) {
22+
super(value, argument);
23+
}
24+
25+
public String get() {
26+
return getValue();
27+
}
28+
29+
}
30+
31+
public static class DateArgument extends ParsedArgument<Date> {
32+
33+
34+
public DateArgument(Date value, ParsedCommand.ParsedSubArgument argument) {
35+
super(value, argument);
36+
}
37+
38+
public Date get() {
39+
return getValue();
40+
}
41+
42+
}
43+
44+
public static class CronArgument extends ParsedArgument<Cron> {
45+
46+
47+
public CronArgument(Cron value, ParsedCommand.ParsedSubArgument argument) {
48+
super(value, argument);
49+
}
50+
51+
public Cron get() {
52+
return getValue();
53+
}
54+
55+
}
56+
57+
58+
}

discord/src/main/java/de/derioo/javautils/discord/command/reciever/predefined/PrefixedReceiver.java

Lines changed: 23 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package de.derioo.javautils.discord.command.reciever.predefined;
22

33
import com.cronutils.model.Cron;
4+
import de.derioo.javautils.common.ReflectionsUtility;
45
import de.derioo.javautils.common.StringUtility;
56
import de.derioo.javautils.discord.command.CommandManager;
67
import de.derioo.javautils.discord.command.annotations.Argument;
8+
import de.derioo.javautils.discord.command.parsed.ParsedArgument;
79
import de.derioo.javautils.discord.command.parsed.ParsedCommand;
810
import de.derioo.javautils.discord.command.parsed.parser.CronExtractor;
911
import de.derioo.javautils.discord.command.parsed.parser.DateExtractor;
@@ -45,7 +47,7 @@ public boolean receive(MessageReceivedEvent event) {
4547

4648

4749
for (ParsedCommand.ParsedArgument argument : command.getArguments()) {
48-
Pair<Boolean, List<Object>> booleanListPair;
50+
Pair<Boolean, List<ParsedArgument<?>>> booleanListPair;
4951
try {
5052
booleanListPair = checkIfArgumentCouldMatch(argument, after);
5153
} catch (Exception e) {
@@ -57,28 +59,20 @@ public boolean receive(MessageReceivedEvent event) {
5759
continue;
5860
}
5961

60-
List<Object> params = new ArrayList<>();
61-
int argumentsCount = 0;
62-
for (Parameter parameter : argument.getMethod().getParameters()) {
63-
if (parameter.isAnnotationPresent(Argument.class)) {
64-
params.add(booleanListPair.getSecond().get(argumentsCount++));
65-
continue;
66-
}
67-
if (parameter.getType().isAssignableFrom(MessageReceivedEvent.class)) {
68-
params.add(event);
69-
continue;
70-
}
71-
if (parameter.getType().isAssignableFrom(ReceiveContext.class)) {
72-
params.add(new ReceiveContext(command, args));
73-
continue;
74-
}
75-
params.add(null);
76-
}
7762
try {
78-
argument.getMethod().setAccessible(true);
79-
argument.getMethod().invoke(command.getCommand(), params.toArray(Object[]::new));
63+
List<Object> args = new ArrayList<>();
64+
args.add(new ReceiveContext(command, args));
65+
args.add(event);
66+
args.addAll(booleanListPair.getSecond());
67+
ReflectionsUtility
68+
.callMethod(argument.getMethod(), command.getCommand(), (o, parameter) -> {
69+
if (!parameter.isAnnotationPresent(Argument.class)) return true;
70+
if (!(o instanceof ParsedArgument<?> arg)) return true;
71+
Argument annotation = parameter.getAnnotation(Argument.class);
72+
return arg.getArgument().getType().equals(annotation.type()) && arg.getArgument().getValue().equals(annotation.value());
73+
}, args);
8074
return true;
81-
} catch (IllegalAccessException | InvocationTargetException e) {
75+
} catch (InvocationTargetException | IllegalAccessException e) {
8276
throw new RuntimeException(e);
8377
}
8478
}
@@ -89,9 +83,9 @@ public boolean receive(MessageReceivedEvent event) {
8983

9084

9185
@Contract("_, _ -> new")
92-
private @NotNull Pair<Boolean, List<Object>> checkIfArgumentCouldMatch(ParsedCommand.@NotNull ParsedArgument argument, String after) {
86+
private @NotNull Pair<Boolean, List<ParsedArgument<?>>> checkIfArgumentCouldMatch(ParsedCommand.@NotNull ParsedArgument argument, String after) {
9387
boolean matches = true;
94-
List<Object> args = new ArrayList<>();
88+
List<ParsedArgument<?>> args = new ArrayList<>();
9589
String current = after;
9690
for (ParsedCommand.ParsedSubArgument arg : argument.getSubArguments()) {
9791
switch (arg.getType()) {
@@ -100,41 +94,41 @@ public boolean receive(MessageReceivedEvent event) {
10094
Matcher matcher = pattern.matcher(current);
10195
String group = matcher.find() ? matcher.group() : "";
10296
if (!group.equals(arg.getValue())) matches = false;
103-
args.add(group);
97+
args.add(new ParsedArgument.StringArgument(group, arg));
10498
current = StringUtility.replaceFirst(current, group, "").trim();
10599
}
106100
case REGEX -> {
107101
Pattern pattern = Pattern.compile(arg.getValue());
108102
Matcher matcher = pattern.matcher(current);
109103
String group = matcher.find() ? matcher.group() : "";
110-
args.add(group);
104+
args.add(new ParsedArgument.StringArgument(group, arg));
111105
if (!group.equals(arg.getValue())) matches = false;
112106
current = StringUtility.replaceFirst(current, group, "").trim();
113107
}
114108
case DATE -> {
115109
DateExtractor extractor = new DateExtractor();
116110
Pair<String, Date> extract = extractor.extract(current);
117-
args.add(extract.getSecond());
111+
args.add(new ParsedArgument.DateArgument(extract.getSecond(), arg));
118112
current = StringUtility.replaceFirst(current, extract.getFirst(), "").trim();
119113
}
120114
case CRON_JOB -> {
121115
CronExtractor extractor = new CronExtractor();
122116
Pair<String, Cron> extract = extractor.extract(current);
123-
args.add(extract.getSecond());
117+
args.add(new ParsedArgument.CronArgument(extract.getSecond(), arg));
124118
current = StringUtility.replaceFirst(current, extract.getFirst(), "").trim();
125119
}
126120
case STRING -> {
127121
Pattern pattern = Pattern.compile("(^\\S*)");
128122
Matcher matcher = pattern.matcher(current);
129123
String group = matcher.find() ? matcher.group() : "";
130-
args.add(group);
124+
args.add(new ParsedArgument.StringArgument(group, arg));
131125
current = StringUtility.replaceFirst(current, group, "").trim();
132126
}
133127
case GREEDY_STRING -> {
134128
Pattern pattern = Pattern.compile("(^.*)");
135129
Matcher matcher = pattern.matcher(current);
136130
String group = matcher.find() ? matcher.group() : "";
137-
args.add(group);
131+
args.add(new ParsedArgument.StringArgument(group, arg));
138132
current = StringUtility.replaceFirst(current, group, "").trim();
139133
}
140134
}

0 commit comments

Comments
 (0)