diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/DisableFeature.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/DisableFeature.java index 12f3c5aa5..c209cc2fe 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/DisableFeature.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/DisableFeature.java @@ -14,14 +14,18 @@ import dev.sheldan.abstracto.core.config.FeatureConfig; import dev.sheldan.abstracto.core.config.FeatureDefinition; import dev.sheldan.abstracto.core.interaction.InteractionService; import dev.sheldan.abstracto.core.interaction.slash.SlashCommandPrivilegeLevels; +import dev.sheldan.abstracto.core.interaction.slash.parameter.SlashCommandAutoCompleteService; +import dev.sheldan.abstracto.core.models.database.AFeatureFlag; import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.models.template.commands.FeatureSwitchModel; import dev.sheldan.abstracto.core.service.FeatureConfigService; import dev.sheldan.abstracto.core.service.FeatureFlagService; import dev.sheldan.abstracto.core.interaction.slash.parameter.SlashCommandParameterService; +import dev.sheldan.abstracto.core.service.management.FeatureFlagManagementService; import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.core.templating.model.MessageToSend; import dev.sheldan.abstracto.core.templating.service.TemplateService; +import net.dv8tion.jda.api.events.interaction.command.CommandAutoCompleteInteractionEvent; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -54,6 +58,12 @@ public class DisableFeature extends AbstractConditionableCommand { @Autowired private InteractionService interactionService; + @Autowired + private SlashCommandAutoCompleteService slashCommandAutoCompleteService; + + @Autowired + private FeatureFlagManagementService featureFlagManagementService; + private static final String DISABLE_FEATURE_DEPENDENCIES_RESPONSE_TEMPLATE_KEY = "disableFeature_feature_dependencies_response"; private static final String DISABLE_FEATURE_RESPONSE_TEMPLATE_KEY = "disableFeature_response"; private static final String FEATURE_NAME_PARAMETER = "featureName"; @@ -99,6 +109,21 @@ public class DisableFeature extends AbstractConditionableCommand { return featureDependencies; } + @Override + public List performAutoComplete(CommandAutoCompleteInteractionEvent event) { + if(slashCommandAutoCompleteService.matchesParameter(event.getFocusedOption(), FEATURE_NAME_PARAMETER)) { + String input = event.getFocusedOption().getValue().toLowerCase(); + AServer server = serverManagementService.loadServer(event.getGuild()); + return featureFlagManagementService.getFeatureFlagsOfServer(server) + .stream() + .filter(AFeatureFlag::isEnabled) + .map(aFeatureFlag -> aFeatureFlag.getFeature().getKey().toLowerCase()) + .filter(featureName -> featureName.toLowerCase().startsWith(input)) + .toList(); + } + return new ArrayList<>(); + } + @Override public CommandConfiguration getConfiguration() { Parameter featureName = Parameter @@ -106,6 +131,7 @@ public class DisableFeature extends AbstractConditionableCommand { .name(FEATURE_NAME_PARAMETER) .templated(true) .type(String.class) + .supportsAutoComplete(true) .build(); List parameters = Arrays.asList(featureName); diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/DisableMode.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/DisableMode.java index 443f642fc..6c414adc7 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/DisableMode.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/DisableMode.java @@ -1,5 +1,6 @@ package dev.sheldan.abstracto.core.commands.config.features; +import dev.sheldan.abstracto.core.command.service.management.FeatureManagementService; import dev.sheldan.abstracto.core.interaction.slash.CoreSlashCommandNames; import dev.sheldan.abstracto.core.command.condition.AbstractConditionableCommand; import dev.sheldan.abstracto.core.command.config.CommandConfiguration; @@ -13,11 +14,19 @@ import dev.sheldan.abstracto.core.config.FeatureDefinition; import dev.sheldan.abstracto.core.config.FeatureMode; import dev.sheldan.abstracto.core.interaction.InteractionService; import dev.sheldan.abstracto.core.interaction.slash.SlashCommandPrivilegeLevels; +import dev.sheldan.abstracto.core.interaction.slash.parameter.SlashCommandAutoCompleteService; +import dev.sheldan.abstracto.core.models.database.AFeature; +import dev.sheldan.abstracto.core.models.database.AFeatureFlag; +import dev.sheldan.abstracto.core.models.database.AFeatureMode; import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.service.FeatureConfigService; import dev.sheldan.abstracto.core.service.FeatureModeService; import dev.sheldan.abstracto.core.interaction.slash.parameter.SlashCommandParameterService; +import dev.sheldan.abstracto.core.service.management.FeatureFlagManagementService; +import dev.sheldan.abstracto.core.service.management.FeatureModeManagementService; import dev.sheldan.abstracto.core.service.management.ServerManagementService; +import java.util.ArrayList; +import net.dv8tion.jda.api.events.interaction.command.CommandAutoCompleteInteractionEvent; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -44,6 +53,18 @@ public class DisableMode extends AbstractConditionableCommand { @Autowired private InteractionService interactionService; + @Autowired + private SlashCommandAutoCompleteService slashCommandAutoCompleteService; + + @Autowired + private FeatureFlagManagementService featureFlagManagementService; + + @Autowired + private FeatureModeManagementService featureModeManagementService; + + @Autowired + private FeatureManagementService featureManagementService; + private static final String DISABLE_MODE_RESPONSE_KEY = "disableMode_response"; private static final String FEATURE_PARAMETER = "feature"; private static final String MODE_PARAMETER = "mode"; @@ -61,12 +82,41 @@ public class DisableMode extends AbstractConditionableCommand { .thenApply(interactionHook -> CommandResult.fromSuccess()); } + @Override + public List performAutoComplete(CommandAutoCompleteInteractionEvent event) { + String input = event.getFocusedOption().getValue().toLowerCase(); + AServer server = serverManagementService.loadServer(event.getGuild()); + if(slashCommandAutoCompleteService.matchesParameter(event.getFocusedOption(), FEATURE_PARAMETER)) { + return featureFlagManagementService.getFeatureFlagsOfServer(server) + .stream() + .filter(AFeatureFlag::isEnabled) + .map(aFeatureFlag -> aFeatureFlag.getFeature().getKey().toLowerCase()) + .filter(featureName -> featureName.toLowerCase().startsWith(input)) + .toList(); + } else if(slashCommandAutoCompleteService.matchesParameter(event.getFocusedOption(), MODE_PARAMETER)) { + String featureName = slashCommandParameterService.getCommandOption(FEATURE_PARAMETER, event, String.class); + if(featureName.isBlank()) { + return new ArrayList<>(); + } + FeatureDefinition featureDefinition = featureConfigService.getFeatureEnum(featureName); + AFeature feature = featureManagementService.getFeature(featureDefinition.getKey()); + List modes = featureModeManagementService.getFeatureModesOfFeatureInServer(server, feature); + return modes + .stream() + .map(mode -> mode.getFeatureMode().toLowerCase()) + .filter(string -> string.startsWith(input)) + .toList(); + } + return new ArrayList<>(); + } + @Override public CommandConfiguration getConfiguration() { Parameter featureName = Parameter .builder() .name(FEATURE_PARAMETER) .type(String.class) + .supportsAutoComplete(true) .templated(true) .build(); @@ -74,6 +124,7 @@ public class DisableMode extends AbstractConditionableCommand { .builder() .name(MODE_PARAMETER) .type(String.class) + .supportsAutoComplete(true) .templated(true) .build(); List parameters = Arrays.asList(featureName, mode); diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/EnableFeature.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/EnableFeature.java index ac3b83594..a195eca4a 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/EnableFeature.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/EnableFeature.java @@ -14,6 +14,7 @@ import dev.sheldan.abstracto.core.config.FeatureConfig; import dev.sheldan.abstracto.core.config.FeatureDefinition; import dev.sheldan.abstracto.core.interaction.InteractionService; import dev.sheldan.abstracto.core.interaction.slash.SlashCommandPrivilegeLevels; +import dev.sheldan.abstracto.core.interaction.slash.parameter.SlashCommandAutoCompleteService; import dev.sheldan.abstracto.core.models.FeatureValidationResult; import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.models.template.commands.FeatureSwitchModel; @@ -24,6 +25,7 @@ import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.core.templating.model.MessageToSend; import dev.sheldan.abstracto.core.templating.service.TemplateService; import lombok.extern.slf4j.Slf4j; +import net.dv8tion.jda.api.events.interaction.command.CommandAutoCompleteInteractionEvent; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -56,6 +58,9 @@ public class EnableFeature extends AbstractConditionableCommand { @Autowired private InteractionService interactionService; + @Autowired + private SlashCommandAutoCompleteService slashCommandAutoCompleteService; + private static final String ENABLE_FEATURE_DEPENDENCIES_RESPONSE_TEMPLATE_KEY = "enableFeature_feature_dependencies_response"; private static final String ENABLE_FEATURE_RESPONSE_TEMPLATE_KEY = "enableFeature_response"; private static final String FEATURE_NAME_PARAMETER = "featureName"; @@ -114,12 +119,26 @@ public class EnableFeature extends AbstractConditionableCommand { return result; } + @Override + public List performAutoComplete(CommandAutoCompleteInteractionEvent event) { + if(slashCommandAutoCompleteService.matchesParameter(event.getFocusedOption(), FEATURE_NAME_PARAMETER)) { + String input = event.getFocusedOption().getValue().toLowerCase(); + return featureConfigService.getAllFeatures() + .stream() + .map(String::toLowerCase) + .filter(lowerCase -> lowerCase.startsWith(input)) + .toList(); + } + return new ArrayList<>(); + } + @Override public CommandConfiguration getConfiguration() { Parameter featureName = Parameter .builder() .name(FEATURE_NAME_PARAMETER) .type(String.class) + .supportsAutoComplete(true) .templated(true) .build(); List parameters = Arrays.asList(featureName); diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/EnableMode.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/EnableMode.java index 0aa57f92f..a3e919e0e 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/EnableMode.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/EnableMode.java @@ -1,5 +1,6 @@ package dev.sheldan.abstracto.core.commands.config.features; +import dev.sheldan.abstracto.core.command.service.management.FeatureManagementService; import dev.sheldan.abstracto.core.interaction.slash.CoreSlashCommandNames; import dev.sheldan.abstracto.core.command.condition.AbstractConditionableCommand; import dev.sheldan.abstracto.core.command.config.CommandConfiguration; @@ -13,11 +14,19 @@ import dev.sheldan.abstracto.core.config.FeatureDefinition; import dev.sheldan.abstracto.core.config.FeatureMode; import dev.sheldan.abstracto.core.interaction.InteractionService; import dev.sheldan.abstracto.core.interaction.slash.SlashCommandPrivilegeLevels; +import dev.sheldan.abstracto.core.interaction.slash.parameter.SlashCommandAutoCompleteService; +import dev.sheldan.abstracto.core.models.database.AFeature; +import dev.sheldan.abstracto.core.models.database.AFeatureFlag; +import dev.sheldan.abstracto.core.models.database.AFeatureMode; import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.service.FeatureConfigService; import dev.sheldan.abstracto.core.service.FeatureModeService; import dev.sheldan.abstracto.core.interaction.slash.parameter.SlashCommandParameterService; +import dev.sheldan.abstracto.core.service.management.FeatureFlagManagementService; +import dev.sheldan.abstracto.core.service.management.FeatureModeManagementService; import dev.sheldan.abstracto.core.service.management.ServerManagementService; +import java.util.ArrayList; +import net.dv8tion.jda.api.events.interaction.command.CommandAutoCompleteInteractionEvent; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -44,6 +53,18 @@ public class EnableMode extends AbstractConditionableCommand { @Autowired private ServerManagementService serverManagementService; + @Autowired + private SlashCommandAutoCompleteService slashCommandAutoCompleteService; + + @Autowired + private FeatureFlagManagementService featureFlagManagementService; + + @Autowired + private FeatureModeManagementService featureModeManagementService; + + @Autowired + private FeatureManagementService featureManagementService; + private static final String ENABLE_MODE_RESPONSE_KEY = "enableMode_response"; private static final String FEATURE_PARAMETER = "feature"; private static final String MODE_PARAMETER = "mode"; @@ -61,16 +82,49 @@ public class EnableMode extends AbstractConditionableCommand { .thenApply(interactionHook -> CommandResult.fromSuccess()); } + @Override + public List performAutoComplete(CommandAutoCompleteInteractionEvent event) { + AServer server = serverManagementService.loadServer(event.getGuild()); + String input = event.getFocusedOption().getValue().toLowerCase(); + if(slashCommandAutoCompleteService.matchesParameter(event.getFocusedOption(), FEATURE_PARAMETER)) { + return featureFlagManagementService.getFeatureFlagsOfServer(server) + .stream() + .filter(AFeatureFlag::isEnabled) + .map(aFeatureFlag -> aFeatureFlag.getFeature().getKey().toLowerCase()) + .filter(featureName -> featureName.toLowerCase().startsWith(input)) + .toList(); + } else if(slashCommandAutoCompleteService.matchesParameter(event.getFocusedOption(), MODE_PARAMETER)) { + String featureName = slashCommandParameterService.getCommandOption(FEATURE_PARAMETER, event, String.class); + if(featureName.isBlank()) { + return new ArrayList<>(); + } + FeatureDefinition featureDefinition = featureConfigService.getFeatureEnum(featureName); + AFeature feature = featureManagementService.getFeature(featureDefinition.getKey()); + List modes = featureModeManagementService.getFeatureModesOfFeatureInServer(server, feature); + return modes + .stream() + .map(mode -> mode.getFeatureMode().toLowerCase()) + .filter(string -> string.startsWith(input)) + .toList(); + } + return new ArrayList<>(); + } + @Override public CommandConfiguration getConfiguration() { Parameter featureName = Parameter .builder() .name(FEATURE_PARAMETER) .type(String.class) - .templated(true).build(); + .supportsAutoComplete(true) + .templated(true) + .build(); + Parameter mode = Parameter - .builder().name(MODE_PARAMETER) + .builder() + .name(MODE_PARAMETER) .type(String.class) + .supportsAutoComplete(true) .templated(true) .build(); diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/FeatureModes.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/FeatureModes.java index 14ba36be8..fed31d784 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/FeatureModes.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/FeatureModes.java @@ -13,14 +13,19 @@ import dev.sheldan.abstracto.core.commands.config.ConfigModuleDefinition; import dev.sheldan.abstracto.core.config.FeatureDefinition; import dev.sheldan.abstracto.core.interaction.InteractionService; import dev.sheldan.abstracto.core.interaction.slash.SlashCommandPrivilegeLevels; +import dev.sheldan.abstracto.core.interaction.slash.parameter.SlashCommandAutoCompleteService; import dev.sheldan.abstracto.core.models.database.AFeature; +import dev.sheldan.abstracto.core.models.database.AFeatureFlag; import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.models.template.commands.FeatureModeDisplay; import dev.sheldan.abstracto.core.models.template.commands.FeatureModesModel; import dev.sheldan.abstracto.core.service.FeatureConfigService; import dev.sheldan.abstracto.core.service.FeatureModeService; import dev.sheldan.abstracto.core.interaction.slash.parameter.SlashCommandParameterService; +import dev.sheldan.abstracto.core.service.management.FeatureFlagManagementService; import dev.sheldan.abstracto.core.service.management.ServerManagementService; +import java.util.ArrayList; +import net.dv8tion.jda.api.events.interaction.command.CommandAutoCompleteInteractionEvent; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -53,6 +58,12 @@ public class FeatureModes extends AbstractConditionableCommand { @Autowired private SlashCommandParameterService slashCommandParameterService; + @Autowired + private SlashCommandAutoCompleteService slashCommandAutoCompleteService; + + @Autowired + private FeatureFlagManagementService featureFlagManagementService; + @Override public CompletableFuture executeSlash(SlashCommandInteractionEvent event) { List featureModes; @@ -73,12 +84,28 @@ public class FeatureModes extends AbstractConditionableCommand { .thenApply(interactionHook -> CommandResult.fromSuccess()); } + @Override + public List performAutoComplete(CommandAutoCompleteInteractionEvent event) { + if(slashCommandAutoCompleteService.matchesParameter(event.getFocusedOption(), FEATURE_PARAMETER)) { + String input = event.getFocusedOption().getValue().toLowerCase(); + AServer server = serverManagementService.loadServer(event.getGuild()); + return featureFlagManagementService.getFeatureFlagsOfServer(server) + .stream() + .filter(AFeatureFlag::isEnabled) + .map(aFeatureFlag -> aFeatureFlag.getFeature().getKey().toLowerCase()) + .filter(featureName -> featureName.toLowerCase().startsWith(input)) + .toList(); + } + return new ArrayList<>(); + } + @Override public CommandConfiguration getConfiguration() { Parameter featureName = Parameter .builder() .name(FEATURE_PARAMETER) .type(String.class) + .supportsAutoComplete(true) .optional(true) .templated(true) .build();