[AB-104] adding server wide member individual command cooldown and commands to set/reset this cooldown configuration on a command level

removing custom cooldown handling from payday and slots commands
This commit is contained in:
Sheldan
2023-09-06 01:23:55 +02:00
parent 156725afa6
commit 73a73dc4f2
28 changed files with 345 additions and 141 deletions

View File

@@ -241,7 +241,13 @@ public class CommandCoolDownServiceBean implements CommandCoolDownService {
durationInSeconds = Math.max(durationInSeconds, channelGroup.getMemberCoolDown());
}
}
return Duration.ofSeconds(durationInSeconds);
if(durationInSeconds > 0) {
return Duration.ofSeconds(durationInSeconds);
}
}
ACommandInAServer commandInServer = commandInServerManagementService.getCommandForServer(aCommand, serverIdChannelId.getServerId());
if(commandInServer.getMemberCooldown() != null) {
return commandInServer.getMemberCooldown();
}
if(commandConfiguration.getCoolDownConfig() != null) {
return commandConfiguration.getCoolDownConfig().getMemberCoolDown();
@@ -261,7 +267,7 @@ public class CommandCoolDownServiceBean implements CommandCoolDownService {
}
try {
Duration coolDown = getServerCoolDownForCommand(command, serverId);
if(coolDown.equals(Duration.ZERO)) {
if(Duration.ZERO.equals(coolDown) || coolDown == null) {
return;
}
log.info("Updating cooldowns for command {} in server {}.", command.getConfiguration().getName(), serverId);
@@ -288,7 +294,7 @@ public class CommandCoolDownServiceBean implements CommandCoolDownService {
}
try {
Duration coolDown = getChannelGroupCoolDownForCommand(command, serverIdChannelId);
if(coolDown.equals(Duration.ZERO)) {
if(Duration.ZERO.equals(coolDown) || coolDown == null) {
return;
}
log.info("Updating cooldowns for command {} in server {} in channel {}.",
@@ -358,7 +364,7 @@ public class CommandCoolDownServiceBean implements CommandCoolDownService {
}
try {
Duration coolDown = getMemberCoolDownForCommand(command, serverChannelUserId.toServerChannelId());
if(coolDown.equals(Duration.ZERO)) {
if(Duration.ZERO.equals(coolDown) || coolDown == null) {
return;
}
log.info("Updating cooldowns for command {} in server {} in channel {} for user {}.",

View File

@@ -16,8 +16,6 @@ import dev.sheldan.abstracto.core.command.execution.UnParsedCommandParameter;
import dev.sheldan.abstracto.core.command.model.database.ACommand;
import dev.sheldan.abstracto.core.command.model.database.ACommandInAServer;
import dev.sheldan.abstracto.core.command.model.database.AModule;
import dev.sheldan.abstracto.core.command.service.CommandRegistry;
import dev.sheldan.abstracto.core.command.service.CommandService;
import dev.sheldan.abstracto.core.command.service.management.CommandInServerManagementService;
import dev.sheldan.abstracto.core.command.service.management.CommandManagementService;
import dev.sheldan.abstracto.core.command.service.management.FeatureManagementService;
@@ -33,6 +31,7 @@ import dev.sheldan.abstracto.core.utils.CompletableFutureList;
import lombok.Builder;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
@@ -40,6 +39,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.File;
import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
@@ -209,6 +209,12 @@ public class CommandServiceBean implements CommandService {
.build();
}
@Override
public void setServerCooldownTo(String commandName, Guild guild, Duration duration) {
ACommand aCommand = commandManagementService.findCommandByName(commandName);
commandInServerManagementService.getCommandForServer(aCommand, guild.getIdLong()).setMemberCooldown(duration);
}
private CompletableFuture<ConditionResult> checkConditions(SlashCommandInteractionEvent slashCommandInteractionEvent, Command command, List<CommandCondition> conditions) {
if(conditions != null && !conditions.isEmpty()) {
List<CompletableFuture<ConditionResult>> futures = new ArrayList<>();

View File

@@ -9,6 +9,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.Duration;
import java.util.List;
@Component
@@ -47,6 +48,11 @@ public class CommandInServerManagementServiceBean implements CommandInServerMana
return repository.findByServerReferenceAndCommandReference(server, command).orElseThrow(CommandNotFoundException::new);
}
@Override
public void setCooldownForCommandInServer(ACommand command, AServer server, Duration duration) {
getCommandForServer(command, server).setMemberCooldown(duration);
}
@Override
public ACommandInAServer getCommandForServer(ACommand command, Long serverId) {
return repository.findByServerReference_IdAndCommandReference(serverId, command);

View File

@@ -0,0 +1,86 @@
package dev.sheldan.abstracto.core.commands.config.cooldown;
import dev.sheldan.abstracto.core.command.condition.AbstractConditionableCommand;
import dev.sheldan.abstracto.core.command.config.CommandConfiguration;
import dev.sheldan.abstracto.core.command.config.HelpInfo;
import dev.sheldan.abstracto.core.command.config.Parameter;
import dev.sheldan.abstracto.core.command.config.features.CoreFeatureDefinition;
import dev.sheldan.abstracto.core.command.execution.CommandResult;
import dev.sheldan.abstracto.core.command.service.CommandService;
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.CoreSlashCommandNames;
import dev.sheldan.abstracto.core.interaction.slash.SlashCommandConfig;
import dev.sheldan.abstracto.core.interaction.slash.parameter.SlashCommandParameterService;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;
@Component
public class RemoveCommandMemberCooldown extends AbstractConditionableCommand {
private static final String REMOVE_COMMAND_MEMBER_COOLDOWN_COMMAND = "removeCommandMemberCooldown";
private static final String COMMAND_NAME_PARAMETER = "commandName";
private static final String REMOVE_COMMAND_MEMBER_COOLDOWN_RESPONSE_TEMPLATE_KEY = "removeCommandMemberCooldown_response";
@Autowired
private SlashCommandParameterService slashCommandParameterService;
@Autowired
private CommandService commandService;
@Autowired
private InteractionService interactionService;
@Override
public CompletableFuture<CommandResult> executeSlash(SlashCommandInteractionEvent event) {
String commandName = slashCommandParameterService.getCommandOption(COMMAND_NAME_PARAMETER, event, String.class);
commandService.setServerCooldownTo(commandName, event.getGuild(), null);
return interactionService.replyEmbed(REMOVE_COMMAND_MEMBER_COOLDOWN_RESPONSE_TEMPLATE_KEY, event)
.thenApply(interactionHook -> CommandResult.fromSuccess());
}
@Override
public CommandConfiguration getConfiguration() {
Parameter commandName = Parameter
.builder()
.name(COMMAND_NAME_PARAMETER)
.type(String.class)
.templated(true)
.build();
List<Parameter> parameters = Arrays.asList(commandName);
HelpInfo helpInfo = HelpInfo
.builder()
.templated(true)
.build();
SlashCommandConfig slashCommandConfig = SlashCommandConfig
.builder()
.enabled(true)
.rootCommandName(CoreSlashCommandNames.COOLDOWN)
.groupName("commandMember")
.commandName("remove")
.build();
return CommandConfiguration.builder()
.name(REMOVE_COMMAND_MEMBER_COOLDOWN_COMMAND)
.module(ConfigModuleDefinition.CONFIG)
.parameters(parameters)
.slashCommandConfig(slashCommandConfig)
.templated(true)
.supportsEmbedException(true)
.help(helpInfo)
.causesReaction(true)
.build();
}
@Override
public FeatureDefinition getFeature() {
return CoreFeatureDefinition.CORE_FEATURE;
}
}

View File

@@ -0,0 +1,97 @@
package dev.sheldan.abstracto.core.commands.config.cooldown;
import dev.sheldan.abstracto.core.command.condition.AbstractConditionableCommand;
import dev.sheldan.abstracto.core.command.config.CommandConfiguration;
import dev.sheldan.abstracto.core.command.config.HelpInfo;
import dev.sheldan.abstracto.core.command.config.Parameter;
import dev.sheldan.abstracto.core.command.config.features.CoreFeatureDefinition;
import dev.sheldan.abstracto.core.command.execution.CommandResult;
import dev.sheldan.abstracto.core.command.service.CommandService;
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.CoreSlashCommandNames;
import dev.sheldan.abstracto.core.interaction.slash.SlashCommandConfig;
import dev.sheldan.abstracto.core.interaction.slash.parameter.SlashCommandParameterService;
import dev.sheldan.abstracto.core.utils.ParseUtils;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.Duration;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;
@Component
public class SetCommandMemberCooldown extends AbstractConditionableCommand {
private static final String SET_COMMAND_MEMBER_COOLDOWN = "setCommandMemberCooldown";
private static final String COMMAND_NAME_PARAMETER = "commandName";
private static final String COOLDOWN_DURATION_PARAMETER = "duration";
private static final String SET_COOLDOWN_MEMBER_RESPONSE_TEMPLATE_KEY = "setCommandMemberCooldown_response";
@Autowired
private CommandService commandService;
@Autowired
private SlashCommandParameterService slashCommandParameterService;
@Autowired
private InteractionService interactionService;
@Override
public CompletableFuture<CommandResult> executeSlash(SlashCommandInteractionEvent event) {
String commandName = slashCommandParameterService.getCommandOption(COMMAND_NAME_PARAMETER, event, String.class);
String cooldownDurationString = slashCommandParameterService.getCommandOption(COOLDOWN_DURATION_PARAMETER, event, Duration.class, String.class);
Duration duration = ParseUtils.parseDuration(cooldownDurationString);
commandService.setServerCooldownTo(commandName, event.getGuild(), duration);
return interactionService.replyEmbed(SET_COOLDOWN_MEMBER_RESPONSE_TEMPLATE_KEY, event)
.thenApply(interactionHook -> CommandResult.fromSuccess());
}
@Override
public CommandConfiguration getConfiguration() {
Parameter commandName = Parameter
.builder()
.name(COMMAND_NAME_PARAMETER)
.type(String.class)
.templated(true)
.build();
Parameter cooldownDuration = Parameter
.builder()
.name(COOLDOWN_DURATION_PARAMETER)
.type(Duration.class)
.templated(true)
.build();
List<Parameter> parameters = Arrays.asList(commandName, cooldownDuration);
HelpInfo helpInfo = HelpInfo
.builder()
.templated(true)
.build();
SlashCommandConfig slashCommandConfig = SlashCommandConfig
.builder()
.enabled(true)
.rootCommandName(CoreSlashCommandNames.COOLDOWN)
.groupName("commandMember")
.commandName("set")
.build();
return CommandConfiguration.builder()
.name(SET_COMMAND_MEMBER_COOLDOWN)
.module(ConfigModuleDefinition.CONFIG)
.parameters(parameters)
.slashCommandConfig(slashCommandConfig)
.templated(true)
.supportsEmbedException(true)
.help(helpInfo)
.causesReaction(true)
.build();
}
@Override
public FeatureDefinition getFeature() {
return CoreFeatureDefinition.CORE_FEATURE;
}
}

View File

@@ -0,0 +1,11 @@
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog dbchangelog.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext dbchangelog.xsd
http://www.liquibase.org/xml/ns/pro dbchangelog.xsd">
<include file="tables/tables.xml" relativeToChangelogFile="true"/>
<include file="seedData/data.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>

View File

@@ -0,0 +1,23 @@
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog dbchangelog.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext dbchangelog.xsd
http://www.liquibase.org/xml/ns/pro dbchangelog.xsd" >
<property name="coreFeature" value="(SELECT id FROM feature WHERE key = 'core')"/>
<property name="configModule" value="(SELECT id FROM module WHERE name = 'config')"/>
<changeSet author="Sheldan" id="cooldown-command" >
<insert tableName="command">
<column name="name" value="setCommandMemberCooldown"/>
<column name="module_id" valueComputed="${configModule}"/>
<column name="feature_id" valueComputed="${coreFeature}"/>
</insert>
<insert tableName="command">
<column name="name" value="removeCommandMemberCooldown"/>
<column name="module_id" valueComputed="${configModule}"/>
<column name="feature_id" valueComputed="${coreFeature}"/>
</insert>
</changeSet>
</databaseChangeLog>

View File

@@ -0,0 +1,10 @@
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog dbchangelog.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext dbchangelog.xsd
http://www.liquibase.org/xml/ns/pro dbchangelog.xsd" >
<include file="command.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>

View File

@@ -0,0 +1,16 @@
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog dbchangelog.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext dbchangelog.xsd
http://www.liquibase.org/xml/ns/pro dbchangelog.xsd" >
<changeSet author="Sheldan" id="command_in_server-add-server-member-cooldown">
<addColumn tableName="command_in_server" >
<column name="member_cooldown" type="BIGINT">
<constraints nullable="true" />
</column>
</addColumn>
</changeSet>
</databaseChangeLog>

View File

@@ -0,0 +1,10 @@
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog dbchangelog.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext dbchangelog.xsd
http://www.liquibase.org/xml/ns/pro dbchangelog.xsd" >
<include file="command_in_server.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>

View File

@@ -24,4 +24,5 @@
<include file="1.3.10/collection.xml" relativeToChangelogFile="true"/>
<include file="1.3.13/collection.xml" relativeToChangelogFile="true"/>
<include file="1.4.0/collection.xml" relativeToChangelogFile="true"/>
<include file="1.5.8/collection.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>