Compare commits

..

No commits in common. "9f87f47b1ff8c5f25340efb1d19b6064e0f0b1b0" and "6bd6021b8642d9518310f3486e0afe169ff9a33a" have entirely different histories.

7 changed files with 32 additions and 71 deletions

@ -2,12 +2,16 @@
# https://docs.gradle.org/current/userguide/platforms.html#sub::toml-dependencies-format # https://docs.gradle.org/current/userguide/platforms.html#sub::toml-dependencies-format
[versions] [versions]
commons-math3 = "3.6.1"
guava = "33.0.0-jre"
junit-jupiter = "5.10.2" junit-jupiter = "5.10.2"
log4j = "2.24.1" log4j = "2.24.1"
javacord = "3.8.0" javacord = "3.8.0"
geantyref = "2.0.0" geantyref = "2.0.0"
[libraries] [libraries]
commons-math3 = { module = "org.apache.commons:commons-math3", version.ref = "commons-math3" }
guava = { module = "com.google.guava:guava", version.ref = "guava" }
junit-jupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit-jupiter" } junit-jupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit-jupiter" }
log4j = { module = "org.apache.logging.log4j:log4j-core", version.ref = "log4j"} log4j = { module = "org.apache.logging.log4j:log4j-core", version.ref = "log4j"}
javacord = { module = "org.javacord:javacord", version.ref = "javacord"} javacord = { module = "org.javacord:javacord", version.ref = "javacord"}

@ -1,13 +1,24 @@
package net.tomatentum.marinara; package net.tomatentum.marinara;
import java.lang.reflect.Constructor;
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(Class<T> clazz) {
InteractionRegistry registry = new InteractionRegistry(wrapper); try {
return new Marinara(registry); Constructor<T> ctor = clazz.getConstructor();
ctor.setAccessible(true);
T wrapper = ctor.newInstance();
InteractionRegistry registry = new InteractionRegistry(wrapper);
return new Marinara(registry);
}catch (Exception ex) {
System.err.println(ex);
System.exit(100);
return null;
}
} }
private InteractionRegistry registry; private InteractionRegistry registry;

@ -12,7 +12,7 @@ import net.tomatentum.marinara.interaction.commands.annotation.SubCommandGroup;
public class SlashCommandDefinition { public class SlashCommandDefinition {
private List<ExecutableSlashCommandDefinition> executableDefinitons; private List<ExecutableSlashCommandDefinition> executableDefinitons;
private SlashCommand slashCommand; private SlashCommand slashCommand;
private boolean isRootCommand; private boolean isRootCommand = false;
public SlashCommandDefinition(SlashCommand applicationCommand) { public SlashCommandDefinition(SlashCommand applicationCommand) {
this.executableDefinitons = new ArrayList<>(); this.executableDefinitons = new ArrayList<>();
@ -23,15 +23,17 @@ public class SlashCommandDefinition {
if (def.applicationCommand() != null) { if (def.applicationCommand() != null) {
if (slashCommand == null) if (slashCommand == null)
this.slashCommand = def.applicationCommand(); this.slashCommand = def.applicationCommand();
if (!this.slashCommand.name().equals(def.applicationCommand().name())) if (!this.slashCommand.equals(def.applicationCommand()))
throw new IllegalArgumentException(def + ": has a non matching Application Command description. Please edit it to equal all other descriptions or remove it to use other definitions descriptions"); throw new IllegalArgumentException(def + ": has a non matching Application Command description. Please edit it to equal all other descriptions or remove it to use other definitions descriptions");
} }
if (isRootCommand) {
if (executableDefinitons.isEmpty()) if (!def.isRootCommand())
this.isRootCommand = def.isRootCommand(); throw new IllegalArgumentException(def + ": cannot have subcommands and rootcommand definitions together");
long subCommandAmount = executableDefinitons.stream()
if ((isRootCommand && !def.isRootCommand()) || (!isRootCommand && def.isRootCommand())) { .filter((x) -> !x.isRootCommand())
throw new IllegalArgumentException(def + ": cannot have subcommands and rootcommand definitions together"); .count();
if (subCommandAmount > 0)
throw new IllegalArgumentException(def + ": cannot have subcommands and rootcommand definitions together");
} }
executableDefinitons.add(def); executableDefinitons.add(def);
@ -51,7 +53,7 @@ public class SlashCommandDefinition {
subCommandGroupMap.put(x.name(), x); subCommandGroupMap.put(x.name(), x);
}); });
return subCommandGroupMap.values().toArray(new SubCommandGroup[0]); return (SubCommandGroup[]) subCommandGroupMap.values().toArray();
} }
public SubCommand[] getSubCommands(String groupName) { public SubCommand[] getSubCommands(String groupName) {
@ -74,7 +76,7 @@ public class SlashCommandDefinition {
subCommandMap.put(x.name(), x); subCommandMap.put(x.name(), x);
}); });
return subCommandMap.values().toArray(new SubCommand[0]); return (SubCommand[]) subCommandMap.values().toArray();
} }
public SlashCommand getFullSlashCommand() { public SlashCommand getFullSlashCommand() {

@ -3,7 +3,6 @@ package net.tomatentum.marinara.registry;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import net.tomatentum.marinara.interaction.InteractionHandler; import net.tomatentum.marinara.interaction.InteractionHandler;
@ -19,7 +18,6 @@ public class InteractionRegistry {
private LibraryWrapper wrapper; private LibraryWrapper wrapper;
public InteractionRegistry(LibraryWrapper wrapper) { public InteractionRegistry(LibraryWrapper wrapper) {
this.interactionMethods = new ArrayList<>();
this.wrapper = wrapper; this.wrapper = wrapper;
wrapper.subscribeInteractions(this::handle); wrapper.subscribeInteractions(this::handle);
} }
@ -33,7 +31,6 @@ public class InteractionRegistry {
public void registerCommands() { public void registerCommands() {
List<SlashCommandDefinition> defs = new ArrayList<>(); List<SlashCommandDefinition> defs = new ArrayList<>();
List<ExecutableSlashCommandDefinition> execDefs = interactionMethods.stream() List<ExecutableSlashCommandDefinition> execDefs = interactionMethods.stream()
.filter(Objects::nonNull)
.filter((x) -> x.getClass().isAssignableFrom(SlashCommandInteractionMethod.class)) .filter((x) -> x.getClass().isAssignableFrom(SlashCommandInteractionMethod.class))
.map((x) -> ((SlashCommandInteractionMethod)x).getCommandDefinition()) .map((x) -> ((SlashCommandInteractionMethod)x).getCommandDefinition())
.toList(); .toList();

@ -30,8 +30,8 @@ public final class ReflectionUtil {
if (!isAnnotationPresent(method, SlashCommand.class)) if (!isAnnotationPresent(method, SlashCommand.class))
throw new RuntimeException(method.getName() + ": Missing ApplicationCommand Annotation on either Class or Method"); throw new RuntimeException(method.getName() + ": Missing ApplicationCommand Annotation on either Class or Method");
if ((method.isAnnotationPresent(SubCommand.class) && if (!(method.isAnnotationPresent(SubCommand.class) &&
!isAnnotationPresent(method, SlashCommand.class))) { isAnnotationPresent(method, SlashCommand.class))) {
throw new RuntimeException(method.getName() + ": Missing ApplicationCommand Annotation on either Method or Class"); throw new RuntimeException(method.getName() + ": Missing ApplicationCommand Annotation on either Method or Class");
} }
} }

@ -1,25 +0,0 @@
package net.tomatentum.marinara.test;
import org.javacord.api.DiscordApi;
import org.javacord.api.DiscordApiBuilder;
import org.junit.jupiter.api.Test;
import net.tomatentum.marinara.Marinara;
import net.tomatentum.marinare.wrapper.javacord.JavacordWrapper;
public class SlashCommandTest {
String DISCORD_TOKEN = System.getenv("DISCORD_TEST_TOKEN");
@Test
public void testSlashCommand() {
DiscordApi api = new DiscordApiBuilder()
.setToken(DISCORD_TOKEN)
.login().join();
Marinara marinara = Marinara.load(new JavacordWrapper(api));
marinara.getRegistry().addInteractions(new TestCommand());
marinara.getRegistry().registerCommands();
System.out.println("done");
}
}

@ -1,28 +0,0 @@
package net.tomatentum.marinara.test;
import org.javacord.api.interaction.SlashCommandInteraction;
import net.tomatentum.marinara.interaction.InteractionHandler;
import net.tomatentum.marinara.interaction.commands.annotation.SlashCommand;
import net.tomatentum.marinara.interaction.commands.annotation.SlashCommandOption;
import net.tomatentum.marinara.interaction.commands.option.SlashCommandOptionType;
public class TestCommand implements InteractionHandler {
@SlashCommand(
name = "test",
description = "testingen",
serverIds = {
1037753048602255440L
},
options = {
@SlashCommandOption(
name = "pommes",
description = "mit Fett",
type = SlashCommandOptionType.MENTIONABLE
)
}
)
public void exec(SlashCommandInteraction interaction) {
System.out.println("Success!");
}
}