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; + } +}