diff --git a/lib/src/main/java/net/tomatentum/marinara/registry/InteractionRegistry.java b/lib/src/main/java/net/tomatentum/marinara/registry/InteractionRegistry.java
index 3c3dc9c..a708c71 100644
--- a/lib/src/main/java/net/tomatentum/marinara/registry/InteractionRegistry.java
+++ b/lib/src/main/java/net/tomatentum/marinara/registry/InteractionRegistry.java
@@ -64,7 +64,7 @@ public class InteractionRegistry {
.aggregate(slashIdentifiers)
.toArray(SlashCommandDefinition[]::new);
- marinara.getWrapper().registerSlashCommands(defs);
+ marinara.getWrapper().getRegisterer().register(defs);
logger.info("Registered all SlashCommands");
}
diff --git a/lib/src/main/java/net/tomatentum/marinara/wrapper/CommandRegisterer.java b/lib/src/main/java/net/tomatentum/marinara/wrapper/CommandRegisterer.java
new file mode 100644
index 0000000..41e17b0
--- /dev/null
+++ b/lib/src/main/java/net/tomatentum/marinara/wrapper/CommandRegisterer.java
@@ -0,0 +1,45 @@
+package net.tomatentum.marinara.wrapper;
+
+import java.util.Arrays;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import net.tomatentum.marinara.interaction.commands.SlashCommandDefinition;
+import net.tomatentum.marinara.util.ObjectAggregator;
+
+public class CommandRegisterer {
+
+ public static CommandRegisterer of(Strategy strategy, CommandConverter converter) {
+ return new CommandRegisterer(strategy, converter);
+ }
+
+ private Strategy strategy;
+ private CommandConverter converter;
+
+ CommandRegisterer(Strategy strategy, CommandConverter converter) {
+ this.strategy = strategy;
+ this.converter = converter;
+ }
+
+ public void register(SlashCommandDefinition[] slashDefs) {
+ Set> serverCommands = new ObjectAggregator>(
+ def -> Arrays.stream(def.serverIds()).boxed().toList(),
+ (l, o) -> l.add(converter.convert(o)),
+ ServerCommandList::new)
+ .aggregate(Arrays.asList(slashDefs)).stream()
+ .collect(Collectors.toSet());
+
+ Set globalCommands = Arrays.stream(slashDefs)
+ .filter(x -> x.serverIds().length <= 0)
+ .map(converter::convert)
+ .collect(Collectors.toSet());
+
+ serverCommands.forEach(strategy::registerServer);
+ strategy.registerGlobal(globalCommands);
+ }
+
+ public interface Strategy {
+ void registerServer(ServerCommandList commands);
+ void registerGlobal(Set defs);
+ }
+}
diff --git a/lib/src/main/java/net/tomatentum/marinara/wrapper/LibraryWrapper.java b/lib/src/main/java/net/tomatentum/marinara/wrapper/LibraryWrapper.java
index eeec879..5b3ba04 100644
--- a/lib/src/main/java/net/tomatentum/marinara/wrapper/LibraryWrapper.java
+++ b/lib/src/main/java/net/tomatentum/marinara/wrapper/LibraryWrapper.java
@@ -3,9 +3,6 @@ package net.tomatentum.marinara.wrapper;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
-
-import net.tomatentum.marinara.interaction.commands.SlashCommandDefinition;
-
public abstract class LibraryWrapper {
private List> interactionSubscriber;
@@ -25,8 +22,7 @@ public abstract class LibraryWrapper {
interactionSubscriber.remove(consumer);
}
- public abstract void registerSlashCommands(SlashCommandDefinition[] defs);
-
+ public abstract CommandRegisterer> getRegisterer();
public abstract IdentifierProvider createIdentifierProvider();
public abstract ContextObjectProvider getContextObjectProvider();
diff --git a/lib/src/main/java/net/tomatentum/marinara/wrapper/ServerCommandList.java b/lib/src/main/java/net/tomatentum/marinara/wrapper/ServerCommandList.java
new file mode 100644
index 0000000..24fdf29
--- /dev/null
+++ b/lib/src/main/java/net/tomatentum/marinara/wrapper/ServerCommandList.java
@@ -0,0 +1,16 @@
+package net.tomatentum.marinara.wrapper;
+
+import java.util.HashSet;
+
+public class ServerCommandList extends HashSet{
+
+ private long serverId;
+
+ public ServerCommandList(long serverId) {
+ this.serverId = serverId;
+ }
+
+ public long serverId() {
+ return serverId;
+ }
+}