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

@@ -14,7 +14,7 @@ import java.util.ArrayList;
import java.util.List;
@Component
public class ShowEmote extends AbstractFeatureFlaggedCommand {
public class ShowEmote extends AbstractConditionableCommand {
private static final String SHOW_EMOTE_RESPONSE_TEMPLATE = "showEmote_response";

View File

@@ -1,12 +1,13 @@
package dev.sheldan.abstracto.utility.command;
import dev.sheldan.abstracto.core.command.AbstractFeatureFlaggedCommand;
import dev.sheldan.abstracto.core.command.AbstractConditionableCommand;
import dev.sheldan.abstracto.core.command.HelpInfo;
import dev.sheldan.abstracto.core.command.execution.CommandConfiguration;
import dev.sheldan.abstracto.core.command.execution.CommandContext;
import dev.sheldan.abstracto.core.command.execution.CommandResult;
import dev.sheldan.abstracto.core.command.execution.Parameter;
import dev.sheldan.abstracto.core.models.MessageToSend;
import dev.sheldan.abstracto.core.service.ChannelService;
import dev.sheldan.abstracto.templating.TemplateService;
import dev.sheldan.abstracto.utility.Utility;
import dev.sheldan.abstracto.utility.config.UtilityFeatures;
@@ -19,7 +20,7 @@ import java.util.ArrayList;
import java.util.List;
@Component
public class StarStats extends AbstractFeatureFlaggedCommand {
public class StarStats extends AbstractConditionableCommand {
public static final String STARSTATS_RESPONSE_TEMPLATE = "starStats_response";
@Autowired
@@ -28,11 +29,14 @@ public class StarStats extends AbstractFeatureFlaggedCommand {
@Autowired
private TemplateService templateService;
@Autowired
private ChannelService channelService;
@Override
public CommandResult execute(CommandContext commandContext) {
StarStatsModel result = starboardService.retrieveStarStats(commandContext.getGuild().getIdLong());
MessageToSend messageToSend = templateService.renderEmbedTemplate(STARSTATS_RESPONSE_TEMPLATE, result);
commandContext.getChannel().sendMessage(messageToSend.getEmbed()).queue();
channelService.sendMessageToEndInTextChannel(messageToSend, commandContext.getChannel());
return CommandResult.fromSuccess();
}

View File

@@ -16,7 +16,7 @@ import java.util.ArrayList;
import java.util.List;
@Component
public class Remind extends AbstractFeatureFlaggedCommand {
public class Remind extends AbstractConditionableCommand {
@Autowired
private ReminderService remindService;

View File

@@ -1,6 +1,6 @@
package dev.sheldan.abstracto.utility.command.suggest;
import dev.sheldan.abstracto.core.command.AbstractFeatureFlaggedCommand;
import dev.sheldan.abstracto.core.command.AbstractConditionableCommand;
import dev.sheldan.abstracto.core.command.HelpInfo;
import dev.sheldan.abstracto.core.command.execution.*;
import dev.sheldan.abstracto.utility.Utility;
@@ -14,7 +14,7 @@ import java.util.ArrayList;
import java.util.List;
@Component
public class Accept extends AbstractFeatureFlaggedCommand {
public class Accept extends AbstractConditionableCommand {
@Autowired
private SuggestionService suggestionService;

View File

@@ -1,6 +1,6 @@
package dev.sheldan.abstracto.utility.command.suggest;
import dev.sheldan.abstracto.core.command.AbstractFeatureFlaggedCommand;
import dev.sheldan.abstracto.core.command.AbstractConditionableCommand;
import dev.sheldan.abstracto.core.command.HelpInfo;
import dev.sheldan.abstracto.core.command.execution.*;
import dev.sheldan.abstracto.utility.Utility;
@@ -14,7 +14,7 @@ import java.util.ArrayList;
import java.util.List;
@Component
public class Reject extends AbstractFeatureFlaggedCommand {
public class Reject extends AbstractConditionableCommand {
@Autowired
private SuggestionService suggestionService;

View File

@@ -1,6 +1,6 @@
package dev.sheldan.abstracto.utility.command.suggest;
import dev.sheldan.abstracto.core.command.AbstractFeatureFlaggedCommand;
import dev.sheldan.abstracto.core.command.AbstractConditionableCommand;
import dev.sheldan.abstracto.core.command.HelpInfo;
import dev.sheldan.abstracto.core.command.execution.*;
import dev.sheldan.abstracto.utility.Utility;
@@ -14,7 +14,7 @@ import java.util.ArrayList;
import java.util.List;
@Component
public class Suggest extends AbstractFeatureFlaggedCommand {
public class Suggest extends AbstractConditionableCommand {
@Autowired
private SuggestionService suggestionService;

View File

@@ -1,6 +1,7 @@
package dev.sheldan.abstracto.utility.listener;
import dev.sheldan.abstracto.core.listener.MessageReceivedListener;
import dev.sheldan.abstracto.core.service.ChannelService;
import dev.sheldan.abstracto.core.service.management.ChannelManagementService;
import dev.sheldan.abstracto.core.service.management.ServerManagementService;
import dev.sheldan.abstracto.core.service.management.UserManagementService;
@@ -57,15 +58,14 @@ public class MessageEmbedListener implements MessageReceivedListener {
@Autowired
private TemplateService templateService;
@Autowired
private ChannelService channelService;
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void createEmbedAndPostEmbed(@Nonnull Message postedMessage, CachedMessage message) {
MessageEmbeddedModel messageEmbeddedModel = buildTemplateParameter(postedMessage, message);
MessageToSend embed = templateService.renderEmbedTemplate(MESSAGE_EMBED_TEMPLATE, messageEmbeddedModel);
if(StringUtils.isBlank(embed.getMessage())) {
postedMessage.getChannel().sendMessage(embed.getEmbed()).queue();
} else {
postedMessage.getChannel().sendMessage(embed.getMessage()).embed(embed.getEmbed()).queue();
}
channelService.sendMessageToEndInTextChannel(embed, postedMessage.getTextChannel());
}
private MessageEmbeddedModel buildTemplateParameter(Message message, CachedMessage embeddedMessage) {

View File

@@ -70,8 +70,7 @@ public class StarboardListener implements ReactedAddedListener, ReactedRemovedLi
if(aEmote.isPresent()) {
AEmote emote = aEmote.get();
MessageReaction.ReactionEmote reactionEmote = addedReaction.getReactionEmote();
Optional<Emote> emoteInGuild = null;
emoteInGuild = bot.getEmote(guildId, emote);
Optional<Emote> emoteInGuild = bot.getEmote(guildId, emote);
if(EmoteUtils.isReactionEmoteAEmote(reactionEmote, emote, emoteInGuild.orElse(null))) {
Optional<CachedReaction> reactionOptional = EmoteUtils.getReactionFromMessageByEmote(message, emote);
updateStarboardPost(message, reactionOptional.orElse(null), userAdding, true);

View File

@@ -1,5 +1,6 @@
package dev.sheldan.abstracto.utility.service;
import dev.sheldan.abstracto.core.service.ChannelService;
import dev.sheldan.abstracto.core.service.management.ChannelManagementService;
import dev.sheldan.abstracto.core.models.AServerAChannelAUser;
import dev.sheldan.abstracto.core.models.database.AChannel;
@@ -55,6 +56,9 @@ public class RemindServiceBean implements ReminderService {
@Autowired
private ReminderService self;
@Autowired
private ChannelService channelService;
@Override
public void createReminderInForUser(AUserInAServer user, String remindText, Duration remindIn, ReminderModel reminderModel) {
AChannel channel = channelManagementService.loadChannel(reminderModel.getChannel().getId());
@@ -69,12 +73,7 @@ public class RemindServiceBean implements ReminderService {
Reminder reminder = reminderManagementService.createReminder(aServerAChannelAUser, remindText, remindAt, reminderModel.getMessage().getIdLong());
reminderModel.setReminder(reminder);
MessageToSend message = templateService.renderEmbedTemplate(REMINDER_EMBED_KEY, reminderModel);
String messageText = message.getMessage();
if(StringUtils.isBlank(messageText)) {
reminderModel.getMessageChannel().sendMessage(message.getEmbed()).queue();
} else {
reminderModel.getMessageChannel().sendMessage(messageText).embed(message.getEmbed()).queue();
}
channelService.sendMessageToEndInAChannel(message, reminderModel.getChannel());
if(remindIn.getSeconds() < 60) {
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
@@ -107,7 +106,7 @@ public class RemindServiceBean implements ReminderService {
.member(memberInServer)
.build();
MessageToSend messageToSend = templateService.renderEmbedTemplate("remind_reminder", build);
channelToAnswerIn.get().sendMessage(messageToSend.getMessage()).embed(messageToSend.getEmbed()).queue();
channelService.sendMessageToEndInTextChannel(messageToSend, channelToAnswerIn.get());
} else {
log.warn("Channel {} in server {} to remind user did not exist anymore. Ignoring reminder {}", channel.getId(), server.getId(), reminderId);
}

View File

@@ -29,6 +29,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.stream.Collectors;
@@ -76,18 +77,24 @@ public class StarboardServiceBean implements StarboardService {
StarboardPostModel starboardPostModel = buildStarboardPostModel(message, userExceptAuthor.size());
MessageToSend messageToSend = templateService.renderEmbedTemplate(STARBOARD_POST_TEMPLATE, starboardPostModel);
PostTarget starboard = postTargetManagement.getPostTarget(STARBOARD_POSTTARGET, message.getServerId());
postTargetService.sendEmbedInPostTarget(messageToSend, STARBOARD_POSTTARGET, message.getServerId()).thenAccept(message1 -> {
AServerChannelMessage aServerChannelMessage = AServerChannelMessage
.builder()
.messageId(message1.getIdLong())
.channel(starboard.getChannelReference())
.server(userReacting.getServerReference())
.build();
StarboardPost starboardPost = starboardPostManagementService.createStarboardPost(message, starredUser, userReacting, aServerChannelMessage);
// TODO maybe in bulk, but numbers should be small enough
userExceptAuthor.forEach(user -> {
starboardPostReactorManagementService.addReactor(starboardPost, user);
});
List<CompletableFuture<Message>> completableFutures = postTargetService.sendEmbedInPostTarget(messageToSend, STARBOARD_POSTTARGET, message.getServerId());
CompletableFuture.allOf(completableFutures.toArray(new CompletableFuture[0])).thenAccept(aVoid -> {
try {
Message message1 = completableFutures.get(0).get();
AServerChannelMessage aServerChannelMessage = AServerChannelMessage
.builder()
.messageId(message1.getIdLong())
.channel(starboard.getChannelReference())
.server(userReacting.getServerReference())
.build();
StarboardPost starboardPost = starboardPostManagementService.createStarboardPost(message, starredUser, userReacting, aServerChannelMessage);
// TODO maybe in bulk, but numbers should be small enough
userExceptAuthor.forEach(user -> {
starboardPostReactorManagementService.addReactor(starboardPost, user);
});
} catch (InterruptedException | ExecutionException e) {
log.error("Failed to post messages.", e);
}
});
}
@@ -126,10 +133,14 @@ public class StarboardServiceBean implements StarboardService {
public void updateStarboardPost(StarboardPost post, CachedMessage message, List<AUser> userExceptAuthor) {
StarboardPostModel starboardPostModel = buildStarboardPostModel(message, userExceptAuthor.size());
MessageToSend messageToSend = templateService.renderEmbedTemplate("starboard_post", starboardPostModel);
CompletableFuture<Message> future = new CompletableFuture<>();
postTargetService.editOrCreatedInPostTarget(post.getStarboardMessageId(), messageToSend, "starboard", message.getServerId(), future);
future.thenAccept(newOrOldMessage -> {
starboardPostManagementService.setStarboardPostMessageId(post, newOrOldMessage.getIdLong());
List<CompletableFuture<Message>> futures = new ArrayList<>();
postTargetService.editOrCreatedInPostTarget(post.getStarboardMessageId(), messageToSend, "starboard", message.getServerId(), futures);
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).thenAccept(aVoid -> {
try {
starboardPostManagementService.setStarboardPostMessageId(post, futures.get(0).get().getIdLong());
} catch (InterruptedException | ExecutionException e) {
log.error("Failed to post starboard post.", e);
}
});
}

View File

@@ -21,7 +21,10 @@ import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
@Component
@Slf4j
@@ -65,10 +68,16 @@ public class SuggestionServiceBean implements SuggestionService {
JDA instance = botService.getInstance();
Guild guildById = instance.getGuildById(guildId);
if(guildById != null) {
postTargetService.sendEmbedInPostTarget(messageToSend, SUGGESTIONS_TARGET, guildId).thenAccept(message -> {
suggestionManagementService.setPostedMessage(suggestion, message);
messageService.addReactionToMessage(SUGGESTION_YES_EMOTE, guildId, message);
messageService.addReactionToMessage(SUGGESTION_NO_EMOTE, guildId, message);
List<CompletableFuture<Message>> completableFutures = postTargetService.sendEmbedInPostTarget(messageToSend, SUGGESTIONS_TARGET, guildId);
CompletableFuture.allOf(completableFutures.toArray(new CompletableFuture[0])).thenAccept(aVoid -> {
try {
Message message = completableFutures.get(0).get();
suggestionManagementService.setPostedMessage(suggestion, message);
messageService.addReactionToMessage(SUGGESTION_YES_EMOTE, guildId, message);
messageService.addReactionToMessage(SUGGESTION_NO_EMOTE, guildId, message);
} catch (InterruptedException | ExecutionException e) {
log.warn("Failed to post suggestion", e);
}
});
} else {
log.warn("Guild {} or member {} was not found when creating suggestion.", member.getGuild().getIdLong(), member.getIdLong());