added overview to existing post targets if no parameter is provided for the post target command

This commit is contained in:
Sheldan
2020-06-05 17:33:41 +02:00
parent 601c4b7121
commit d14e917329
18 changed files with 135 additions and 8 deletions

View File

@@ -7,7 +7,12 @@ import dev.sheldan.abstracto.core.command.config.Parameter;
import dev.sheldan.abstracto.core.command.execution.*;
import dev.sheldan.abstracto.core.config.FeatureEnum;
import dev.sheldan.abstracto.core.command.config.features.CoreFeatures;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.PostTarget;
import dev.sheldan.abstracto.core.models.template.commands.PostTargetDisplayModel;
import dev.sheldan.abstracto.core.models.template.commands.PostTargetErrorModel;
import dev.sheldan.abstracto.core.models.template.commands.PostTargetModelEntry;
import dev.sheldan.abstracto.core.service.ChannelService;
import dev.sheldan.abstracto.core.service.PostTargetService;
import dev.sheldan.abstracto.core.service.management.PostTargetManagement;
import dev.sheldan.abstracto.templating.service.TemplateService;
@@ -18,14 +23,16 @@ import net.dv8tion.jda.api.entities.TextChannel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
@Service
@Slf4j
public class PostTarget extends AbstractConditionableCommand {
public class PostTargetCommand extends AbstractConditionableCommand {
public static final String POST_TARGET_NO_TARGET_TEMPLATE = "posttarget_no_target";
public static final String POST_TARGET_SHOW_TARGETS = "posttarget_show_targets";
public static final String POST_TARGET_INVALID_TARGET_TEMPLATE = "posttarget_invalid_target";
@Autowired
@@ -37,13 +44,32 @@ public class PostTarget extends AbstractConditionableCommand {
@Autowired
private TemplateService templateService;
@Autowired
private ChannelService channelService;
@Override
public CommandResult execute(CommandContext commandContext) {
if(commandContext.getParameters().getParameters().isEmpty()) {
PostTargetErrorModel postTargetErrorModel = (PostTargetErrorModel) ContextConverter.fromCommandContext(commandContext, PostTargetErrorModel.class);
postTargetErrorModel.setValidPostTargets(postTargetService.getAvailablePostTargets());
String errorMessage = templateService.renderTemplate(POST_TARGET_NO_TARGET_TEMPLATE, postTargetErrorModel);
return CommandResult.fromError(errorMessage);
PostTargetDisplayModel posttargetDisplayModel = (PostTargetDisplayModel) ContextConverter.fromCommandContext(commandContext, PostTargetDisplayModel.class);
AServer server = commandContext.getUserInitiatedContext().getServer();
List<PostTarget> postTargets = postTargetService.getPostTargets(server);
posttargetDisplayModel.setPostTargets(new ArrayList<>());
List<PostTargetModelEntry> postTargetEntries = posttargetDisplayModel.getPostTargets();
postTargets.forEach(target -> {
Optional<TextChannel> channelFromAChannel = channelService.getChannelFromAChannel(target.getChannelReference());
PostTargetModelEntry targetEntry = PostTargetModelEntry.builder().channel(channelFromAChannel.orElse(null)).postTarget(target).build();
postTargetEntries.add(targetEntry);
});
List<String> postTargetConfigs = postTargetService.getPostTargetsOfEnabledFeatures(server);
postTargetConfigs.forEach(postTargetName -> {
if(postTargetEntries.stream().noneMatch(postTargetModelEntry -> postTargetModelEntry.getPostTarget().getName().equalsIgnoreCase(postTargetName))) {
PostTarget fakeEntry = PostTarget.builder().name(postTargetName).build();
PostTargetModelEntry postTargetEntry = PostTargetModelEntry.builder().postTarget(fakeEntry).build();
postTargetEntries.add(postTargetEntry);
}
});
channelService.sendEmbedTemplateInChannel(POST_TARGET_SHOW_TARGETS, posttargetDisplayModel, commandContext.getChannel());
return CommandResult.fromSuccess();
}
String targetName = (String) commandContext.getParameters().getParameters().get(0);
if(!postTargetService.validPostTarget(targetName)) {

View File

@@ -7,6 +7,7 @@ import org.springframework.data.jpa.repository.QueryHints;
import org.springframework.stereotype.Repository;
import javax.persistence.QueryHint;
import java.util.List;
@Repository
public interface PostTargetRepository extends JpaRepository<PostTarget, Long> {
@@ -16,4 +17,6 @@ public interface PostTargetRepository extends JpaRepository<PostTarget, Long> {
boolean existsByNameAndServerReference(String name, AServer server);
List<PostTarget> findByServerReference(AServer server);
}

View File

@@ -200,4 +200,9 @@ public class ChannelServiceBean implements ChannelService {
}
throw new GuildException(server.getId());
}
@Override
public Optional<TextChannel> getChannelFromAChannel(AChannel channel) {
return botService.getTextChannelFromServer(channel.getServer().getId(), channel.getId());
}
}

View File

@@ -1,11 +1,13 @@
package dev.sheldan.abstracto.core.service;
import dev.sheldan.abstracto.core.config.DynamicKeyLoader;
import dev.sheldan.abstracto.core.config.FeatureConfig;
import dev.sheldan.abstracto.core.config.PostTargetEnum;
import dev.sheldan.abstracto.core.exception.ChannelNotFoundException;
import dev.sheldan.abstracto.core.exception.GuildException;
import dev.sheldan.abstracto.core.exception.PostTargetNotFoundException;
import dev.sheldan.abstracto.core.exception.PostTargetNotValidException;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.service.management.PostTargetManagement;
import dev.sheldan.abstracto.core.models.database.PostTarget;
import dev.sheldan.abstracto.templating.model.MessageToSend;
@@ -18,6 +20,7 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;
@@ -39,6 +42,12 @@ public class PostTargetServiceBean implements PostTargetService {
@Autowired
private ChannelService channelService;
@Autowired
private FeatureFlagService featureFlagService;
@Autowired
private FeatureConfigService featureConfigService;
@Override
public CompletableFuture<Message> sendTextInPostTarget(String text, PostTarget target) {
return channelService.sendTextToAChannel(text, target.getChannelReference());
@@ -189,8 +198,25 @@ public class PostTargetServiceBean implements PostTargetService {
return possiblePostTargets.contains(name);
}
@Override
public List<PostTarget> getPostTargets(AServer server) {
return postTargetManagement.getPostTargetsInServer(server);
}
@Override
public List<String> getAvailablePostTargets() {
return dynamicKeyLoader.getPostTargetsAsList();
}
@Override
public List<String> getPostTargetsOfEnabledFeatures(AServer server) {
List<String> postTargets = new ArrayList<>();
List<FeatureConfig> allFeatureConfigs = featureConfigService.getAllFeatureConfigs();
allFeatureConfigs.forEach(featureConfig -> {
if(featureFlagService.isFeatureEnabled(featureConfig, server)) {
featureConfig.getRequiredPostTargets().forEach(postTargetEnum -> postTargets.add(postTargetEnum.getKey()));
}
});
return postTargets;
}
}

View File

@@ -12,6 +12,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
@Service
@@ -97,4 +98,9 @@ public class PostTargetManagementBean implements PostTargetManagement {
return target;
}
@Override
public List<PostTarget> getPostTargetsInServer(AServer server) {
return postTargetRepository.findByServerReference(server);
}
}

View File

@@ -1 +0,0 @@
<#include "posttarget_available_post_targets">: ${validPostTargets?join(", ")}.

View File

@@ -0,0 +1,19 @@
{
"title": {
"title": "<#include "posttarget_embed_title">""
},
"color" : {
"r": 200,
"g": 0,
"b": 255
},
"description": "
<#list postTargets as postTarget>
<#assign postTargetName>${postTarget.postTarget.name}</#assign>
<#assign channelMention><#if postTarget.channel?has_content>${postTarget.channel.asMention}<#else><#include "posttarget_no_channel"></#if></#assign>
<#include "posttarget_post_target_text">
<#else>
<#include "posttarget_no_post_targets_found">
</#list>
"
}

View File

@@ -0,0 +1,15 @@
package dev.sheldan.abstracto.core.models.template.commands;
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 PostTargetDisplayModel extends UserInitiatedServerContext {
private List<PostTargetModelEntry> postTargets;
}

View File

@@ -0,0 +1,15 @@
package dev.sheldan.abstracto.core.models.template.commands;
import dev.sheldan.abstracto.core.models.database.PostTarget;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import net.dv8tion.jda.api.entities.TextChannel;
@Getter
@Setter
@Builder
public class PostTargetModelEntry {
private PostTarget postTarget;
private TextChannel channel;
}

View File

@@ -31,4 +31,5 @@ public interface ChannelService {
List<CompletableFuture<Message>> sendEmbedTemplateInChannel(String templateKey, Object model, MessageChannel channel);
CompletableFuture<TextChannel> createTextChannel(String name, AServer server, Long categoryId);
Optional<TextChannel> getChannelFromAChannel(AChannel channel);
}

View File

@@ -1,6 +1,7 @@
package dev.sheldan.abstracto.core.service;
import dev.sheldan.abstracto.core.config.PostTargetEnum;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.PostTarget;
import dev.sheldan.abstracto.templating.model.MessageToSend;
import net.dv8tion.jda.api.entities.Message;
@@ -24,5 +25,7 @@ public interface PostTargetService {
void editOrCreatedInPostTarget(Long messageId, MessageToSend messageToSend, PostTargetEnum postTarget, Long serverId, List<CompletableFuture<Message>> future);
void throwIfPostTargetIsNotDefined(PostTargetEnum name, Long serverId);
boolean validPostTarget(String name);
List<PostTarget> getPostTargets(AServer server);
List<String> getAvailablePostTargets();
List<String> getPostTargetsOfEnabledFeatures(AServer server);
}

View File

@@ -4,6 +4,8 @@ import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.PostTarget;
import java.util.List;
public interface PostTargetManagement {
PostTarget createPostTarget(String name, AServer server, AChannel targetChanel);
PostTarget createOrUpdate(String name, AServer server, AChannel targetChannel);
@@ -14,4 +16,5 @@ public interface PostTargetManagement {
Boolean postTargetExists(String name, AServer server);
boolean postTargetExists(String name, Long serverId);
PostTarget updatePostTarget(PostTarget target, AServer server, AChannel newTargetChannel);
List<PostTarget> getPostTargetsInServer(AServer server);
}

View File

@@ -37,6 +37,7 @@ Changing the prefix::
Changing a post target::
* Usage: `posttarget <key> <channel>`
* Description: Changes the given post target identified by `key` to the given channel. All messages using this post target will be send to this channel from now on.
If neither `key` nor `channel` is given, this will print the currently available post targets and the channels they point to, if set.
* Example: `posttarget banLog #general` to log the bans in the #general channel.
Listing the features::
* Usage: `features`

View File

@@ -1,2 +1,3 @@
Sets the target of the given posts to a channel. You have to mention the channel with #.
The available post targets will be printed when executed with no parameters.
When no parameter is given, the currently available post targets are printed. If the post targets are already defined to
point to an existing text channel, they will be mentioned.

View File

@@ -0,0 +1 @@
Post target ${postTargetName} points to ${channelMention}.