package net.tomatentum.marinara.wrapper; import java.util.Arrays; import java.util.Set; import java.util.stream.Collectors; import org.slf4j.Logger; import net.tomatentum.marinara.interaction.commands.SlashCommandDefinition; import net.tomatentum.marinara.util.LoggerUtil; import net.tomatentum.marinara.util.ObjectAggregator; public class CommandRegisterer { public static CommandRegisterer of(Strategy strategy, CommandConverter converter) { return new CommandRegisterer(strategy, converter); } private Logger logger = LoggerUtil.getLogger(getClass()); 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); logger.info("Registered all SlashCommands"); } public interface Strategy { void registerServer(ServerCommandList commands); void registerGlobal(Set defs); } }