added command to manage channel groups

added ability to disable command in channel groups
refactored embed handling to support multiple embeds to be send at once (handling to decide to split into multiple embeds is still needed)
This commit is contained in:
Sheldan
2020-04-06 00:51:07 +02:00
parent 4b3765ee0f
commit 20cb43d071
60 changed files with 840 additions and 155 deletions

View File

@@ -1,5 +1,6 @@
package dev.sheldan.abstracto.core.command;
import dev.sheldan.abstracto.core.service.ChannelService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -7,13 +8,20 @@ import java.util.Arrays;
import java.util.List;
@Component
public abstract class AbstractFeatureFlaggedCommand implements ConditionalCommand {
public abstract class AbstractConditionableCommand implements ConditionalCommand {
@Autowired
private FeatureEnabledCondition featureEnabledCondition;
@Autowired
private CommandDisabledCondition commandDisabledCondition;
@Autowired
protected ChannelService channelService;
@Override
public List<CommandCondition> getConditions() {
return Arrays.asList(featureEnabledCondition);
return Arrays.asList(featureEnabledCondition, commandDisabledCondition);
}
}

View File

@@ -4,5 +4,5 @@ package dev.sheldan.abstracto.core.command;
import dev.sheldan.abstracto.core.command.execution.CommandContext;
public interface CommandCondition {
boolean shouldExecute(CommandContext commandContext, Command command);
ConditionResult shouldExecute(CommandContext commandContext, Command command);
}

View File

@@ -0,0 +1,25 @@
package dev.sheldan.abstracto.core.command;
import dev.sheldan.abstracto.core.command.execution.CommandContext;
import dev.sheldan.abstracto.core.command.models.ACommand;
import dev.sheldan.abstracto.core.command.service.ChannelGroupCommandService;
import dev.sheldan.abstracto.core.command.service.management.CommandManagementService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class CommandDisabledCondition implements CommandCondition {
@Autowired
private ChannelGroupCommandService channelGroupCommandService;
@Autowired
private CommandManagementService commandManagementService;
@Override
public ConditionResult shouldExecute(CommandContext context, Command command) {
ACommand acommand = commandManagementService.findCommandByName(command.getConfiguration().getName());
Boolean booleanResult = channelGroupCommandService.isCommandEnabled(acommand, context.getUserInitiatedContext().getChannel());
return ConditionResult.builder().result(booleanResult).reason("Command is disabled.").build();
}
}

View File

@@ -0,0 +1,13 @@
package dev.sheldan.abstracto.core.command;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Builder
public class ConditionResult {
private boolean result;
private String reason;
}

View File

@@ -12,11 +12,14 @@ public class FeatureEnabledCondition implements CommandCondition {
private FeatureFlagManagementService featureFlagManagementService;
@Override
public boolean shouldExecute(CommandContext context, Command command) {
public ConditionResult shouldExecute(CommandContext context, Command command) {
String featureName = command.getFeature();
boolean featureFlagValue = false;
String reason = "";
if(featureName != null) {
return featureFlagManagementService.getFeatureFlagValue(featureName, context.getGuild().getIdLong());
featureFlagValue = featureFlagManagementService.getFeatureFlagValue(featureName, context.getGuild().getIdLong());
reason = "Feature has been disabled.";
}
return false;
return ConditionResult.builder().reason(reason).result(featureFlagValue).build();
}
}

View File

@@ -1,32 +0,0 @@
package dev.sheldan.abstracto.core.command.models;
import dev.sheldan.abstracto.core.models.database.AChannelGroup;
import lombok.*;
import javax.persistence.*;
@Entity
@Table(name = "channel_group_command")
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Getter
public class AChannelGroupCommand {
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "command_id", nullable = false)
@Getter
@Setter
@Column
private ACommand command;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "group_id", nullable = false)
@Getter
@Setter
@Column
private AChannelGroup group;
private Boolean enabled;
}

View File

@@ -0,0 +1,8 @@
package dev.sheldan.abstracto.core.command.service;
import dev.sheldan.abstracto.core.command.models.ACommand;
import dev.sheldan.abstracto.core.models.database.AChannel;
public interface ChannelGroupCommandService {
Boolean isCommandEnabled(ACommand command, AChannel channel);
}

View File

@@ -0,0 +1,14 @@
package dev.sheldan.abstracto.core.command.service.management;
import dev.sheldan.abstracto.core.command.models.ACommand;
import dev.sheldan.abstracto.core.models.database.AChannelGroup;
import dev.sheldan.abstracto.core.models.database.AChannelGroupCommand;
import java.util.List;
public interface ChannelGroupCommandManagementService {
void setCommandInGroupTo(ACommand command, AChannelGroup group, Boolean enabled);
AChannelGroupCommand createCommandInGroupTo(ACommand command, AChannelGroup group);
AChannelGroupCommand getChannelGroupCommand(ACommand command, AChannelGroup group);
List<AChannelGroupCommand> getAllGroupCommandsForCommand(ACommand command);
}

View File

@@ -5,10 +5,12 @@ import lombok.Getter;
import lombok.Setter;
import net.dv8tion.jda.api.entities.MessageEmbed;
import java.util.List;
@Getter
@Setter
@Builder
public class MessageToSend {
private MessageEmbed embed;
private List<MessageEmbed> embeds;
private String message;
}

View File

@@ -0,0 +1,15 @@
package dev.sheldan.abstracto.core.models.command;
import dev.sheldan.abstracto.core.models.database.AChannel;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import net.dv8tion.jda.api.entities.TextChannel;
@Getter
@Setter
@Builder
public class ChannelGroupChannelModel {
private AChannel channel;
private TextChannel discordChannel;
}

View File

@@ -0,0 +1,15 @@
package dev.sheldan.abstracto.core.models.command;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Getter
@Setter
@Builder
public class ChannelGroupModel {
private String name;
private List<ChannelGroupChannelModel> channels;
}

View File

@@ -0,0 +1,15 @@
package dev.sheldan.abstracto.core.models.command;
import dev.sheldan.abstracto.core.models.context.UserInitiatedServerContext;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.SuperBuilder;
import java.util.List;
@Getter
@Setter
@SuperBuilder
public class ListChannelGroupsModel extends UserInitiatedServerContext {
private List<ChannelGroupModel> groups;
}

View File

@@ -22,6 +22,12 @@ public class AChannelGroup {
@Setter
private String groupName;
@ManyToOne(fetch = FetchType.LAZY)
@Getter
@Setter
@JoinColumn(name = "group_server")
private AServer server;
@ManyToMany
@JoinTable(
name = "channel_in_group",

View File

@@ -13,20 +13,21 @@ import javax.persistence.*;
@Getter
public class AChannelGroupCommand {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long commandInGroupId;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "command_id", nullable = false)
@Getter
@Setter
@Column
private ACommand command;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "group_id", nullable = false)
@Getter
@Setter
@Column
private AChannelGroup group;
@Setter
private Boolean enabled;
}

View File

@@ -33,6 +33,14 @@ public class AServer implements SnowFlake {
@JoinColumn(name = "server_id")
private List<AChannel> channels = new ArrayList<>();
@OneToMany(
fetch = FetchType.LAZY,
cascade = CascadeType.ALL,
orphanRemoval = true)
@Builder.Default
@JoinColumn(name = "group_server")
private List<AChannelGroup> channelGroups = new ArrayList<>();
@OneToMany(
fetch = FetchType.LAZY,
mappedBy = "serverReference",

View File

@@ -5,11 +5,15 @@ import dev.sheldan.abstracto.core.models.database.AChannelGroup;
import net.dv8tion.jda.api.entities.TextChannel;
public interface ChannelGroupService {
AChannelGroup createChannelGroup(String name);
AChannelGroup createChannelGroup(String name, Long serverId);
void deleteChannelGroup(String name, Long serverId);
void addChannelToChannelGroup(String channelGroupName, TextChannel textChannel);
void addChannelToChannelGroup(String channelGroupName, Long channelId);
void addChannelToChannelGroup(String channelGroupName, AChannel channel);
void removeChannelFromChannelGroup(String channelGroupName, TextChannel textChannel);
void removeChannelFromChannelGroup(String channelGroupName, Long channelId);
void removeChannelFromChannelGroup(String channelGroupName, AChannel channel);
void disableCommandInChannelGroup(String commandName, String channelGroupName, Long serverId);
void enableCommandInChannelGroup(String commandName, String channelGroupName, Long serverId);
boolean doesGroupExist(String groupName, Long serverId);
}

View File

@@ -1,7 +1,17 @@
package dev.sheldan.abstracto.core.service;
import dev.sheldan.abstracto.core.models.MessageToSend;
import dev.sheldan.abstracto.core.models.database.AChannel;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.TextChannel;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
public interface ChannelService {
void sendTextInAChannel(String text, AChannel channel);
List<CompletableFuture<Message>> sendMessageToEndInAChannel(MessageToSend messageToSend, AChannel channel);
List<CompletableFuture<Message>> sendMessageToEndInTextChannel(MessageToSend messageToSend, TextChannel textChannel);
Optional<TextChannel> getTextChannelInGuild(Long serverId, Long channelId);
}

View File

@@ -13,12 +13,12 @@ public interface PostTargetService {
CompletableFuture<Message> sendEmbedInPostTarget(MessageEmbed embed, PostTarget target);
CompletableFuture<Message> sendTextInPostTarget(String text, String postTargetName, Long serverId);
CompletableFuture<Message> sendEmbedInPostTarget(MessageEmbed embed, String postTargetName, Long serverId);
CompletableFuture<Message> sendEmbedInPostTarget(MessageToSend message, String postTargetName, Long serverId);
CompletableFuture<Message> sendEmbedInPostTarget(MessageToSend message, PostTarget target);
CompletableFuture<Message> editEmbedInPostTarget(Long messageId, MessageToSend message, PostTarget target);
CompletableFuture<Message> editEmbedInPostTarget(Long messageId, MessageToSend message, String postTargetName, Long serverId);
void editOrCreatedInPostTarget(Long messageId, MessageToSend messageToSend, PostTarget target, CompletableFuture<Message> future);
void editOrCreatedInPostTarget(Long messageId, MessageToSend messageToSend, String postTarget, Long serverId, CompletableFuture<Message> future);
List<CompletableFuture<Message>> sendEmbedInPostTarget(MessageToSend message, String postTargetName, Long serverId);
List<CompletableFuture<Message>> sendEmbedInPostTarget(MessageToSend message, PostTarget target);
List<CompletableFuture<Message>> editEmbedInPostTarget(Long messageId, MessageToSend message, PostTarget target);
List<CompletableFuture<Message>> editEmbedInPostTarget(Long messageId, MessageToSend message, String postTargetName, Long serverId);
void editOrCreatedInPostTarget(Long messageId, MessageToSend messageToSend, PostTarget target, List<CompletableFuture<Message>> future);
void editOrCreatedInPostTarget(Long messageId, MessageToSend messageToSend, String postTarget, Long serverId, List<CompletableFuture<Message>> future);
void throwIfPostTargetIsNotDefined(String name, Long serverId);
boolean validPostTarget(String name);
List<String> getAvailablePostTargets();

View File

@@ -2,10 +2,16 @@ package dev.sheldan.abstracto.core.service.management;
import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.database.AChannelGroup;
import dev.sheldan.abstracto.core.models.database.AServer;
import java.util.List;
public interface ChannelGroupManagementService {
AChannelGroup createChannelGroup(String name);
AChannelGroup createChannelGroup(String name, AServer server);
void deleteChannelGroup(String name, AServer server);
AChannelGroup addChannelToChannelGroup(AChannelGroup channelGroup, AChannel channel);
void removeChannelFromChannelGroup(AChannelGroup channelGroup, AChannel channel);
AChannelGroup findByName(String name);
AChannelGroup findByNameAndServer(String name, AServer server);
List<AChannelGroup> findAllInServer(AServer server);
List<AChannelGroup> findAllInServer(Long serverId);
}