From 6375dbf4631a2db4242f43fa7ee8ca9648da0cf5 Mon Sep 17 00:00:00 2001 From: Sheldan <5037282+Sheldan@users.noreply.github.com> Date: Tue, 30 Mar 2021 20:29:13 +0200 Subject: [PATCH] [AB-218] adding ability to split the normal message as well according to custom configuration adding ability to define the max amount of messages resulting from a template on a server and template base fixing not always considering the server when rendering templates in various places --- .../AssignableRolePlaceServiceBean.java | 2 +- .../service/MessageEmbedServiceBean.java | 2 +- .../service/MessageEmbedServiceBeanTest.java | 4 +- .../moderation/service/WarnServiceBean.java | 2 +- .../listener/MessageEditedListenerTest.java | 3 +- .../service/BanServiceBeanTest.java | 2 +- .../ModMailMessageEditedListener.java | 2 +- .../service/ModMailThreadServiceBean.java | 12 +- .../ModMailMessageEditedListenerTest.java | 8 +- .../remind/service/RemindServiceBean.java | 2 +- .../remind/service/RemindServiceBeanTest.java | 3 +- .../service/StarboardServiceBean.java | 4 +- .../service/StarboardServiceBeanTest.java | 4 +- .../emote/command/ExportEmoteStats.java | 2 +- .../emote/command/ExportEmoteStatsTest.java | 6 +- .../service/SuggestionServiceBean.java | 4 +- .../service/SuggestionServiceBeanTest.java | 5 +- .../urban/command/UrbanDefine.java | 2 +- .../youtube/command/YoutubeVideoSearch.java | 6 +- .../abstracto/core/commands/help/Help.java | 2 +- .../core/service/ChannelServiceBean.java | 45 ++++---- .../core/service/PostTargetServiceBean.java | 7 +- .../templating/model/EmbedConfiguration.java | 2 + .../service/TemplateServiceBean.java | 52 ++++++++- .../src/main/resources/abstracto.properties | 3 + .../service/TemplateServiceBeanTest.java | 105 ++++++++++++++---- .../config/features/CoreFeatureConfig.java | 3 +- .../core/templating/model/MessageToSend.java | 2 +- 28 files changed, 213 insertions(+), 83 deletions(-) diff --git a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/service/AssignableRolePlaceServiceBean.java b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/service/AssignableRolePlaceServiceBean.java index c579208c1..cfb763035 100644 --- a/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/service/AssignableRolePlaceServiceBean.java +++ b/abstracto-application/abstracto-modules/assignable-roles/assignable-roles-impl/src/main/java/dev/sheldan/abstracto/assignableroles/service/AssignableRolePlaceServiceBean.java @@ -784,7 +784,7 @@ public class AssignableRolePlaceServiceBean implements AssignableRolePlaceServic */ private MessageToSend renderAssignablePlacePosts(AssignableRolePlace place) { AssignablePostMessage model = prepareAssignablePostMessageModel(place); - return templateService.renderEmbedTemplate(ASSIGNABLE_ROLES_POST_TEMPLATE_KEY, model); + return templateService.renderEmbedTemplate(ASSIGNABLE_ROLES_POST_TEMPLATE_KEY, model, place.getServer().getId()); } /** diff --git a/abstracto-application/abstracto-modules/link-embed/link-embed-impl/src/main/java/dev/sheldan/abstracto/linkembed/service/MessageEmbedServiceBean.java b/abstracto-application/abstracto-modules/link-embed/link-embed-impl/src/main/java/dev/sheldan/abstracto/linkembed/service/MessageEmbedServiceBean.java index b594d1682..e2fe74576 100644 --- a/abstracto-application/abstracto-modules/link-embed/link-embed-impl/src/main/java/dev/sheldan/abstracto/linkembed/service/MessageEmbedServiceBean.java +++ b/abstracto-application/abstracto-modules/link-embed/link-embed-impl/src/main/java/dev/sheldan/abstracto/linkembed/service/MessageEmbedServiceBean.java @@ -115,7 +115,7 @@ public class MessageEmbedServiceBean implements MessageEmbedService { @Transactional public CompletableFuture sendEmbeddingMessage(CachedMessage cachedMessage, TextChannel target, Long userEmbeddingUserInServerId, MessageEmbeddedModel messageEmbeddedModel) { - MessageToSend embed = templateService.renderEmbedTemplate(MESSAGE_EMBED_TEMPLATE, messageEmbeddedModel); + MessageToSend embed = templateService.renderEmbedTemplate(MESSAGE_EMBED_TEMPLATE, messageEmbeddedModel, target.getGuild().getIdLong()); AUserInAServer cause = userInServerManagementService.loadOrCreateUser(userEmbeddingUserInServerId); List> completableFutures = channelService.sendMessageToSendToChannel(embed, target); log.trace("Embedding message {} from channel {} from server {}, because of user {}", cachedMessage.getMessageId(), diff --git a/abstracto-application/abstracto-modules/link-embed/link-embed-impl/src/test/java/dev/sheldan/abstracto/linkembed/service/MessageEmbedServiceBeanTest.java b/abstracto-application/abstracto-modules/link-embed/link-embed-impl/src/test/java/dev/sheldan/abstracto/linkembed/service/MessageEmbedServiceBeanTest.java index 0d97ae4f2..119d7d89d 100644 --- a/abstracto-application/abstracto-modules/link-embed/link-embed-impl/src/test/java/dev/sheldan/abstracto/linkembed/service/MessageEmbedServiceBeanTest.java +++ b/abstracto-application/abstracto-modules/link-embed/link-embed-impl/src/test/java/dev/sheldan/abstracto/linkembed/service/MessageEmbedServiceBeanTest.java @@ -234,7 +234,9 @@ public class MessageEmbedServiceBeanTest { public void testSendEmbeddingMessage() { MessageEmbeddedModel embeddedModel = Mockito.mock(MessageEmbeddedModel.class); MessageToSend messageToSend = Mockito.mock(MessageToSend.class); - when(templateService.renderEmbedTemplate(MessageEmbedServiceBean.MESSAGE_EMBED_TEMPLATE, embeddedModel)).thenReturn(messageToSend); + when(textChannel.getGuild()).thenReturn(guild); + when(guild.getIdLong()).thenReturn(SERVER_ID); + when(templateService.renderEmbedTemplate(MessageEmbedServiceBean.MESSAGE_EMBED_TEMPLATE, embeddedModel, SERVER_ID)).thenReturn(messageToSend); AUser user = Mockito.mock(AUser.class); when(embeddingUser.getUserReference()).thenReturn(user); when(userInServerManagementService.loadOrCreateUser(EMBEDDING_USER_IN_SERVER_ID)).thenReturn(embeddingUser); diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/WarnServiceBean.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/WarnServiceBean.java index 05ba53cfa..21fc3efc0 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/WarnServiceBean.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/WarnServiceBean.java @@ -242,7 +242,7 @@ public class WarnServiceBean implements WarnService { .guild(guildService.getGuildById(server.getId())) .warnings(warnDecayWarnings) .build(); - MessageToSend messageToSend = templateService.renderEmbedTemplate(WARN_DECAY_LOG_TEMPLATE_KEY, warnDecayLogModel); + MessageToSend messageToSend = templateService.renderEmbedTemplate(WARN_DECAY_LOG_TEMPLATE_KEY, warnDecayLogModel, serverId); List> messageFutures = postTargetService.sendEmbedInPostTarget(messageToSend, WarnDecayPostTarget.DECAY_LOG, server.getId()); return FutureUtils.toSingleFutureGeneric(messageFutures); } diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/MessageEditedListenerTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/MessageEditedListenerTest.java index 44c5c6c97..2ecd770c9 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/MessageEditedListenerTest.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/listener/MessageEditedListenerTest.java @@ -56,7 +56,6 @@ public class MessageEditedListenerTest { private static final Long SERVER_ID = 4L; private static final Long CHANNEL_ID = 5L; - private static final Long AUTHOR_ID = 6L; @Test public void testExecuteListenerWithSameContent() { @@ -66,7 +65,7 @@ public class MessageEditedListenerTest { when(model.getAfter()).thenReturn(messageAfter); when(model.getBefore()).thenReturn(messageBefore); testUnit.execute(model); - verify(templateService, times(0)).renderEmbedTemplate(eq(MessageEditedListener.MESSAGE_EDITED_TEMPLATE), any()); + verify(templateService, times(0)).renderEmbedTemplate(eq(MessageEditedListener.MESSAGE_EDITED_TEMPLATE), any(), eq(SERVER_ID)); } @Test diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/BanServiceBeanTest.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/BanServiceBeanTest.java index 3e158cabd..028dce74b 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/BanServiceBeanTest.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/test/java/dev/sheldan/abstracto/moderation/service/BanServiceBeanTest.java @@ -62,7 +62,7 @@ public class BanServiceBeanTest { testUnit.banMember(memberToBan, REASON, context); verify(mockedGuild, times(1)).ban(USER_ID.toString(), 0, REASON); verify(postTargetService, times(0)).sendEmbedInPostTarget(mockedMessage, ModerationPostTarget.BAN_LOG, SERVER_ID); - verify(templateService, times(0)).renderEmbedTemplate(BanServiceBean.BAN_LOG_TEMPLATE, context); + verify(templateService, times(0)).renderEmbedTemplate(BanServiceBean.BAN_LOG_TEMPLATE, context, SERVER_ID); } @Test diff --git a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/listener/ModMailMessageEditedListener.java b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/listener/ModMailMessageEditedListener.java index 3a14d9466..58caf2532 100644 --- a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/listener/ModMailMessageEditedListener.java +++ b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/listener/ModMailMessageEditedListener.java @@ -115,7 +115,7 @@ public class ModMailMessageEditedListener implements AsyncMessageTextUpdatedList modMailModeratorReplyModelBuilder.moderator(editingUser); } ModMailModeratorReplyModel modMailUserReplyModel = modMailModeratorReplyModelBuilder.build(); - MessageToSend messageToSend = templateService.renderEmbedTemplate(ModMailThreadServiceBean.MODMAIL_STAFF_MESSAGE_TEMPLATE_KEY, modMailUserReplyModel); + MessageToSend messageToSend = templateService.renderEmbedTemplate(ModMailThreadServiceBean.MODMAIL_STAFF_MESSAGE_TEMPLATE_KEY, modMailUserReplyModel, editingUser.getGuild().getIdLong()); Long threadId = modMailMessage.getThreadReference().getId(); long serverId = editingUser.getGuild().getIdLong(); if(modMailMessage.getCreatedMessageInChannel() != null) { diff --git a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/service/ModMailThreadServiceBean.java b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/service/ModMailThreadServiceBean.java index c912b36b7..10537fb34 100644 --- a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/service/ModMailThreadServiceBean.java +++ b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/service/ModMailThreadServiceBean.java @@ -254,7 +254,7 @@ public class ModMailThreadServiceBean implements ModMailThreadService { .roles(rolesToPing) .channel(channel) .build(); - MessageToSend messageToSend = templateService.renderEmbedTemplate("modmail_notification_message", modMailNotificationModel); + MessageToSend messageToSend = templateService.renderEmbedTemplate("modmail_notification_message", modMailNotificationModel, channel.getGuild().getIdLong()); List> modmailping = postTargetService.sendEmbedInPostTarget(messageToSend, ModMailPostTargets.MOD_MAIL_PING, serverId); return CompletableFuture.allOf(modmailping.toArray(new CompletableFuture[0])); } @@ -434,7 +434,7 @@ public class ModMailThreadServiceBean implements ModMailThreadService { .member(member) .subscribers(subscribers) .build(); - MessageToSend messageToSend = templateService.renderEmbedTemplate("modmail_user_message", modMailUserReplyModel); + MessageToSend messageToSend = templateService.renderEmbedTemplate("modmail_user_message", modMailUserReplyModel, textChannel.getGuild().getIdLong()); List> completableFutures = channelService.sendMessageToSendToChannel(messageToSend, textChannel); return CompletableFuture.allOf(completableFutures.toArray(new CompletableFuture[0])) .thenCompose(aVoid -> { @@ -477,7 +477,7 @@ public class ModMailThreadServiceBean implements ModMailThreadService { public CompletableFuture relayMessageToDm(Long modmailThreadId, String text, Message replyCommandMessage, boolean anonymous, MessageChannel feedBack, List undoActions, Member targetMember) { log.info("Relaying message {} to user {} in modmail thread {} on server {}.", replyCommandMessage.getId(), targetMember.getId(), modmailThreadId, targetMember.getGuild().getId()); AUserInAServer moderator = userInServerManagementService.loadOrCreateUser(replyCommandMessage.getMember()); - metricService. incrementCounter(MDOMAIL_THREAD_MESSAGE_SENT); + metricService.incrementCounter(MDOMAIL_THREAD_MESSAGE_SENT); ModMailThread modMailThread = modMailThreadManagementService.getById(modmailThreadId); FullUserInServer fullThreadUser = FullUserInServer .builder() @@ -500,7 +500,7 @@ public class ModMailThreadServiceBean implements ModMailThreadService { modMailModeratorReplyModelBuilder.moderator(moderatorMember); } ModMailModeratorReplyModel modMailUserReplyModel = modMailModeratorReplyModelBuilder.build(); - MessageToSend messageToSend = templateService.renderEmbedTemplate(MODMAIL_STAFF_MESSAGE_TEMPLATE_KEY, modMailUserReplyModel); + MessageToSend messageToSend = templateService.renderEmbedTemplate(MODMAIL_STAFF_MESSAGE_TEMPLATE_KEY, modMailUserReplyModel, modMailThread.getServer().getId()); CompletableFuture future = messageService.sendMessageToSendToUser(targetMember.getUser(), messageToSend); CompletableFuture sameThreadMessageFuture; if(featureModeService.featureModeActive(ModMailFeatureDefinition.MOD_MAIL, modMailThread.getServer(), ModMailMode.SEPARATE_MESSAGE)) { @@ -720,7 +720,7 @@ public class ModMailThreadServiceBean implements ModMailThreadService { .note(note) .build(); log.trace("Sending close header and individual mod mail messages to mod mail log target for thread {}.", modMailThreadId); - MessageToSend messageToSend = templateService.renderEmbedTemplate("modmail_close_header", headerModel); + MessageToSend messageToSend = templateService.renderEmbedTemplate("modmail_close_header", headerModel, modMailThread.getServer().getId()); List> closeHeaderFutures = postTargetService.sendEmbedInPostTarget(messageToSend, ModMailPostTargets.MOD_MAIL_LOG, modMailThread.getServer().getId()); // TODO in case the rendering fails, the already sent messages are not deleted completableFutures.addAll(closeHeaderFutures); @@ -761,7 +761,7 @@ public class ModMailThreadServiceBean implements ModMailThreadService { // TODO order messages loadedMessages.forEach(message -> { log.trace("Sending message {} of modmail thread {} to modmail log post target.", modMailThread.getId(), message.getMessage().getId()); - MessageToSend messageToSend = templateService.renderEmbedTemplate("modmail_close_logged_message", message); + MessageToSend messageToSend = templateService.renderEmbedTemplate("modmail_close_logged_message", message, modMailThread.getServer().getId()); List> logFuture = postTargetService.sendEmbedInPostTarget(messageToSend, ModMailPostTargets.MOD_MAIL_LOG, modMailThread.getServer().getId()); messageFutures.addAll(logFuture); }); diff --git a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/test/java/dev/sheldan/abstracto/modmail/listener/ModMailMessageEditedListenerTest.java b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/test/java/dev/sheldan/abstracto/modmail/listener/ModMailMessageEditedListenerTest.java index 99cfc034a..01a408a17 100644 --- a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/test/java/dev/sheldan/abstracto/modmail/listener/ModMailMessageEditedListenerTest.java +++ b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/test/java/dev/sheldan/abstracto/modmail/listener/ModMailMessageEditedListenerTest.java @@ -207,7 +207,7 @@ public class ModMailMessageEditedListenerTest { when(authorMember.getGuild()).thenReturn(guild); when(guild.getIdLong()).thenReturn(SERVER_ID); when(parsedParameters.getParameters()).thenReturn(Arrays.asList(NEW_PARAM)); - when(templateService.renderEmbedTemplate(eq(ModMailThreadServiceBean.MODMAIL_STAFF_MESSAGE_TEMPLATE_KEY), replyModelArgumentCaptor.capture())).thenReturn(messageToSend); + when(templateService.renderEmbedTemplate(eq(ModMailThreadServiceBean.MODMAIL_STAFF_MESSAGE_TEMPLATE_KEY), replyModelArgumentCaptor.capture(), eq(SERVER_ID))).thenReturn(messageToSend); testUnit.updateMessageInThread(loadedMessage, parsedParameters, targetMember, authorMember); verify(channelService, times(0)).editMessageInAChannel(eq(messageToSend), any(AChannel.class), anyLong()); verify(messageService, times(1)).editMessageInDMChannel(targetUser, messageToSend, CREATED_MESSAGE_ID); @@ -231,7 +231,7 @@ public class ModMailMessageEditedListenerTest { when(channel.getId()).thenReturn(CHANNEL_ID); when(guild.getIdLong()).thenReturn(SERVER_ID); when(parsedParameters.getParameters()).thenReturn(Arrays.asList(NEW_PARAM)); - when(templateService.renderEmbedTemplate(eq(ModMailThreadServiceBean.MODMAIL_STAFF_MESSAGE_TEMPLATE_KEY), replyModelArgumentCaptor.capture())).thenReturn(messageToSend); + when(templateService.renderEmbedTemplate(eq(ModMailThreadServiceBean.MODMAIL_STAFF_MESSAGE_TEMPLATE_KEY), replyModelArgumentCaptor.capture(), eq(SERVER_ID))).thenReturn(messageToSend); testUnit.updateMessageInThread(loadedMessage, parsedParameters, targetMember, authorMember); verify(channelService, times(1)).editMessageInAChannel(eq(messageToSend), eq(channel), eq(CREATED_MESSAGE_ID)); verify(messageService, times(1)).editMessageInDMChannel(targetUser, messageToSend, CREATED_MESSAGE_ID); @@ -251,7 +251,7 @@ public class ModMailMessageEditedListenerTest { when(authorMember.getGuild()).thenReturn(guild); when(guild.getIdLong()).thenReturn(SERVER_ID); when(parsedParameters.getParameters()).thenReturn(Arrays.asList(NEW_PARAM)); - when(templateService.renderEmbedTemplate(eq(ModMailThreadServiceBean.MODMAIL_STAFF_MESSAGE_TEMPLATE_KEY), replyModelArgumentCaptor.capture())).thenReturn(messageToSend); + when(templateService.renderEmbedTemplate(eq(ModMailThreadServiceBean.MODMAIL_STAFF_MESSAGE_TEMPLATE_KEY), replyModelArgumentCaptor.capture(), eq(SERVER_ID))).thenReturn(messageToSend); testUnit.updateMessageInThread(loadedMessage, parsedParameters, targetMember, authorMember); verify(channelService, times(0)).editMessageInAChannel(eq(messageToSend), any(AChannel.class), anyLong()); verify(messageService, times(1)).editMessageInDMChannel(targetUser, messageToSend, CREATED_MESSAGE_ID); @@ -274,7 +274,7 @@ public class ModMailMessageEditedListenerTest { when(thread.getChannel()).thenReturn(channel); when(channel.getId()).thenReturn(CHANNEL_ID); when(parsedParameters.getParameters()).thenReturn(Arrays.asList(NEW_PARAM)); - when(templateService.renderEmbedTemplate(eq(ModMailThreadServiceBean.MODMAIL_STAFF_MESSAGE_TEMPLATE_KEY), replyModelArgumentCaptor.capture())).thenReturn(messageToSend); + when(templateService.renderEmbedTemplate(eq(ModMailThreadServiceBean.MODMAIL_STAFF_MESSAGE_TEMPLATE_KEY), replyModelArgumentCaptor.capture(), eq(SERVER_ID))).thenReturn(messageToSend); testUnit.updateMessageInThread(loadedMessage, parsedParameters, targetMember, authorMember); verify(channelService, times(1)).editMessageInAChannel(eq(messageToSend), eq(channel), eq(CREATED_MESSAGE_ID)); verify(messageService, times(1)).editMessageInDMChannel(targetUser, messageToSend, CREATED_MESSAGE_ID); diff --git a/abstracto-application/abstracto-modules/remind/remind-impl/src/main/java/dev/sheldan/abstracto/remind/service/RemindServiceBean.java b/abstracto-application/abstracto-modules/remind/remind-impl/src/main/java/dev/sheldan/abstracto/remind/service/RemindServiceBean.java index 99fd3a591..17efbb7fe 100644 --- a/abstracto-application/abstracto-modules/remind/remind-impl/src/main/java/dev/sheldan/abstracto/remind/service/RemindServiceBean.java +++ b/abstracto-application/abstracto-modules/remind/remind-impl/src/main/java/dev/sheldan/abstracto/remind/service/RemindServiceBean.java @@ -145,7 +145,7 @@ public class RemindServiceBean implements ReminderService { .member(member) .duration(Duration.between(reminder.getReminderDate(), reminder.getTargetDate())) .build(); - MessageToSend messageToSend = templateService.renderEmbedTemplate(REMINDER_TEMPLATE_TEXT, build); + MessageToSend messageToSend = templateService.renderEmbedTemplate(REMINDER_TEMPLATE_TEXT, build, channelToAnswerIn.getGuild().getIdLong()); return FutureUtils.toSingleFutureGeneric(channelService.sendMessageToSendToChannel(messageToSend, channelToAnswerIn)); } diff --git a/abstracto-application/abstracto-modules/remind/remind-impl/src/test/java/dev/sheldan/abstracto/remind/service/RemindServiceBeanTest.java b/abstracto-application/abstracto-modules/remind/remind-impl/src/test/java/dev/sheldan/abstracto/remind/service/RemindServiceBeanTest.java index 7576d6e64..4908def57 100644 --- a/abstracto-application/abstracto-modules/remind/remind-impl/src/test/java/dev/sheldan/abstracto/remind/service/RemindServiceBeanTest.java +++ b/abstracto-application/abstracto-modules/remind/remind-impl/src/test/java/dev/sheldan/abstracto/remind/service/RemindServiceBeanTest.java @@ -246,7 +246,8 @@ public class RemindServiceBeanTest { when(remindedReminder.getReminderDate()).thenReturn(Instant.now()); when(reminderManagementService.loadReminder(REMINDER_ID)).thenReturn(remindedReminder); MessageToSend messageToSend = Mockito.mock(MessageToSend.class); - when(templateService.renderEmbedTemplate(eq(RemindServiceBean.REMINDER_TEMPLATE_TEXT), any())).thenReturn(messageToSend); + when(channel.getGuild()).thenReturn(guild); + when(templateService.renderEmbedTemplate(eq(RemindServiceBean.REMINDER_TEMPLATE_TEXT), any(), eq(SERVER_ID))).thenReturn(messageToSend); when(channelService.sendMessageToSendToChannel(messageToSend, channel)).thenReturn(Arrays.asList(CompletableFuture.completedFuture(null))); CompletableFuture future = testUnit.sendReminderText(REMINDER_ID, channel, remindedMember); future.join(); diff --git a/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/java/dev/sheldan/abstracto/starboard/service/StarboardServiceBean.java b/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/java/dev/sheldan/abstracto/starboard/service/StarboardServiceBean.java index 985066275..3f7478efc 100644 --- a/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/java/dev/sheldan/abstracto/starboard/service/StarboardServiceBean.java +++ b/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/java/dev/sheldan/abstracto/starboard/service/StarboardServiceBean.java @@ -113,7 +113,7 @@ public class StarboardServiceBean implements StarboardService { @Transactional public CompletionStage sendStarboardPostAndStore(CachedMessage message, Long starredUserId, List userExceptAuthorIds, StarboardPostModel starboardPostModel, Long userReactingId) { - MessageToSend messageToSend = templateService.renderEmbedTemplate(STARBOARD_POST_TEMPLATE, starboardPostModel); + MessageToSend messageToSend = templateService.renderEmbedTemplate(STARBOARD_POST_TEMPLATE, starboardPostModel, message.getServerId()); PostTarget starboard = postTargetManagement.getPostTarget(StarboardPostTarget.STARBOARD.getKey(), message.getServerId()); List> completableFutures = postTargetService.sendEmbedInPostTarget(messageToSend, StarboardPostTarget.STARBOARD, message.getServerId()); Long starboardChannelId = starboard.getChannelReference().getId(); @@ -169,7 +169,7 @@ public class StarboardServiceBean implements StarboardService { int starCount = userExceptAuthor.size(); log.info("Updating starboard post {} in server {} with reactors {}.", post.getId(), post.getSourceChannel().getServer().getId(), starCount); return buildStarboardPostModel(message, starCount).thenCompose(starboardPostModel -> { - MessageToSend messageToSend = templateService.renderEmbedTemplate(STARBOARD_POST_TEMPLATE, starboardPostModel); + MessageToSend messageToSend = templateService.renderEmbedTemplate(STARBOARD_POST_TEMPLATE, starboardPostModel, message.getServerId()); List> futures = postTargetService.editOrCreatedInPostTarget(post.getStarboardMessageId(), messageToSend, StarboardPostTarget.STARBOARD, message.getServerId()); Long starboardPostId = post.getId(); return CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).thenAccept(aVoid -> { diff --git a/abstracto-application/abstracto-modules/starboard/starboard-impl/src/test/java/dev/sheldan/abstracto/starboard/service/StarboardServiceBeanTest.java b/abstracto-application/abstracto-modules/starboard/starboard-impl/src/test/java/dev/sheldan/abstracto/starboard/service/StarboardServiceBeanTest.java index 71af9d9b9..cf701e341 100644 --- a/abstracto-application/abstracto-modules/starboard/starboard-impl/src/test/java/dev/sheldan/abstracto/starboard/service/StarboardServiceBeanTest.java +++ b/abstracto-application/abstracto-modules/starboard/starboard-impl/src/test/java/dev/sheldan/abstracto/starboard/service/StarboardServiceBeanTest.java @@ -179,7 +179,7 @@ public class StarboardServiceBeanTest { CachedMessage message = Mockito.mock(CachedMessage.class); when(message.getServerId()).thenReturn(SERVER_ID); StarboardPostModel model = Mockito.mock(StarboardPostModel.class); - when(templateService.renderEmbedTemplate(StarboardServiceBean.STARBOARD_POST_TEMPLATE, model)).thenReturn(messageToSend); + when(templateService.renderEmbedTemplate(StarboardServiceBean.STARBOARD_POST_TEMPLATE, model, SERVER_ID)).thenReturn(messageToSend); PostTarget postTarget = Mockito.mock(PostTarget.class); when(postTarget.getChannelReference()).thenReturn(starboardChannel); when(starboardChannel.getId()).thenReturn(STARBOARD_CHANNEL_ID); @@ -235,7 +235,7 @@ public class StarboardServiceBeanTest { when(post.getSourceChannel()).thenReturn(sourceChannel); when(post.getId()).thenReturn(starboardPostId); MessageToSend postMessage = Mockito.mock(MessageToSend.class); - when(templateService.renderEmbedTemplate(eq(StarboardServiceBean.STARBOARD_POST_TEMPLATE), starboardPostModelArgumentCaptor.capture())).thenReturn(postMessage); + when(templateService.renderEmbedTemplate(eq(StarboardServiceBean.STARBOARD_POST_TEMPLATE), starboardPostModelArgumentCaptor.capture(), eq(SERVER_ID))).thenReturn(postMessage); when(postTargetService.editOrCreatedInPostTarget(oldPostId, postMessage, StarboardPostTarget.STARBOARD, SERVER_ID)).thenReturn(Arrays.asList(CompletableFuture.completedFuture(sendPost))); when(sendPost.getIdLong()).thenReturn(newPostId); SystemConfigProperty config = Mockito.mock(SystemConfigProperty.class); diff --git a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emote/command/ExportEmoteStats.java b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emote/command/ExportEmoteStats.java index 2be68d169..e80fb3138 100644 --- a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emote/command/ExportEmoteStats.java +++ b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/main/java/dev/sheldan/abstracto/statistic/emote/command/ExportEmoteStats.java @@ -101,7 +101,7 @@ public class ExportEmoteStats extends AbstractConditionableCommand { if(tempFile.length() > maxFileSize) { throw new UploadFileTooLargeException(tempFile.length(), maxFileSize); } - MessageToSend messageToSend = templateService.renderEmbedTemplate(DOWNLOAD_EMOTE_STATS_RESPONSE_TEMPLATE_KEY, model); + MessageToSend messageToSend = templateService.renderEmbedTemplate(DOWNLOAD_EMOTE_STATS_RESPONSE_TEMPLATE_KEY, model, actualServer.getId()); messageToSend.setFileToSend(tempFile); return FutureUtils.toSingleFutureGeneric(channelService.sendMessageToSendToChannel(messageToSend, commandContext.getChannel())) .thenApply(unused -> CommandResult.fromIgnored()); diff --git a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emote/command/ExportEmoteStatsTest.java b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emote/command/ExportEmoteStatsTest.java index f1bfc42f6..1e0b99d77 100644 --- a/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emote/command/ExportEmoteStatsTest.java +++ b/abstracto-application/abstracto-modules/statistic/statistic-impl/src/test/java/dev/sheldan/abstracto/statistic/emote/command/ExportEmoteStatsTest.java @@ -77,7 +77,7 @@ public class ExportEmoteStatsTest { when(fileService.createTempFile(FILE_NAME)).thenReturn(file); when(file.length()).thenReturn(3L); MessageToSend messageToSend = Mockito.mock(MessageToSend.class); - when(templateService.renderEmbedTemplate(eq(DOWNLOAD_EMOTE_STATS_RESPONSE_TEMPLATE_KEY), any())).thenReturn(messageToSend); + when(templateService.renderEmbedTemplate(eq(DOWNLOAD_EMOTE_STATS_RESPONSE_TEMPLATE_KEY), any(), eq(SERVER_ID))).thenReturn(messageToSend); when(channelService.sendMessageToSendToChannel(messageToSend, commandContext.getChannel())).thenReturn(CommandTestUtilities.messageFutureList()); CompletableFuture asyncResult = testUnit.executeAsync(commandContext); CommandTestUtilities.checkSuccessfulCompletionAsync(asyncResult); @@ -92,6 +92,7 @@ public class ExportEmoteStatsTest { CommandContext commandContext = CommandTestUtilities.getWithParameters(Arrays.asList(Duration.ofHours(3))); when(commandContext.getGuild().getIdLong()).thenReturn(SERVER_ID); AServer server = Mockito.mock(AServer.class); + when(server.getId()).thenReturn(SERVER_ID); when(serverManagementService.loadServer(SERVER_ID)).thenReturn(server); when(commandContext.getGuild().getMaxFileSize()).thenReturn(4L); List usedEmotes = Arrays.asList(usedEmote); @@ -102,7 +103,7 @@ public class ExportEmoteStatsTest { when(fileService.createTempFile(FILE_NAME)).thenReturn(file); when(file.length()).thenReturn(3L); MessageToSend messageToSend = Mockito.mock(MessageToSend.class); - when(templateService.renderEmbedTemplate(eq(DOWNLOAD_EMOTE_STATS_RESPONSE_TEMPLATE_KEY), any())).thenReturn(messageToSend); + when(templateService.renderEmbedTemplate(eq(DOWNLOAD_EMOTE_STATS_RESPONSE_TEMPLATE_KEY), any(), eq(SERVER_ID))).thenReturn(messageToSend); when(channelService.sendMessageToSendToChannel(messageToSend, commandContext.getChannel())).thenReturn(CommandTestUtilities.messageFutureList()); CompletableFuture asyncResult = testUnit.executeAsync(commandContext); CommandTestUtilities.checkSuccessfulCompletionAsync(asyncResult); @@ -166,6 +167,7 @@ public class ExportEmoteStatsTest { private void mockServerAndFileRendering(CommandContext commandContext) { when(commandContext.getGuild().getIdLong()).thenReturn(SERVER_ID); AServer server = Mockito.mock(AServer.class); + when(server.getId()).thenReturn(SERVER_ID); when(serverManagementService.loadServer(SERVER_ID)).thenReturn(server); List usedEmotes = Arrays.asList(usedEmote); when(usedEmoteManagementService.loadEmoteUsagesForServerSince(server, Instant.EPOCH)).thenReturn(usedEmotes); diff --git a/abstracto-application/abstracto-modules/suggestion/suggestion-impl/src/main/java/dev/sheldan/abstracto/suggestion/service/SuggestionServiceBean.java b/abstracto-application/abstracto-modules/suggestion/suggestion-impl/src/main/java/dev/sheldan/abstracto/suggestion/service/SuggestionServiceBean.java index 6036e31c4..047e7e14c 100644 --- a/abstracto-application/abstracto-modules/suggestion/suggestion-impl/src/main/java/dev/sheldan/abstracto/suggestion/service/SuggestionServiceBean.java +++ b/abstracto-application/abstracto-modules/suggestion/suggestion-impl/src/main/java/dev/sheldan/abstracto/suggestion/service/SuggestionServiceBean.java @@ -77,7 +77,7 @@ public class SuggestionServiceBean implements SuggestionService { suggestionLog.setState(SuggestionState.NEW); suggestionLog.setSuggesterUser(suggester); suggestionLog.setText(text); - MessageToSend messageToSend = templateService.renderEmbedTemplate(SUGGESTION_LOG_TEMPLATE, suggestionLog); + MessageToSend messageToSend = templateService.renderEmbedTemplate(SUGGESTION_LOG_TEMPLATE, suggestionLog, member.getGuild().getIdLong()); long guildId = member.getGuild().getIdLong(); log.info("Creating suggestion with id {} in server {} from member {}.", newSuggestionId, member.getGuild().getId(), member.getId()); List> completableFutures = postTargetService.sendEmbedInPostTarget(messageToSend, SuggestionPostTarget.SUGGESTION, guildId); @@ -144,7 +144,7 @@ public class SuggestionServiceBean implements SuggestionService { MessageEmbed suggestionEmbed = embedOptional.get(); suggestionLog.setReason(text); suggestionLog.setText(suggestionEmbed.getDescription()); - MessageToSend messageToSend = templateService.renderEmbedTemplate(SUGGESTION_LOG_TEMPLATE, suggestionLog); + MessageToSend messageToSend = templateService.renderEmbedTemplate(SUGGESTION_LOG_TEMPLATE, suggestionLog, suggestionLog.getGuild().getIdLong()); List> completableFutures = postTargetService.sendEmbedInPostTarget(messageToSend, SuggestionPostTarget.SUGGESTION, suggestionLog.getGuild().getIdLong()); return CompletableFuture.allOf(completableFutures.toArray(new CompletableFuture[0])); } else { diff --git a/abstracto-application/abstracto-modules/suggestion/suggestion-impl/src/test/java/dev/sheldan/abstracto/suggestion/service/SuggestionServiceBeanTest.java b/abstracto-application/abstracto-modules/suggestion/suggestion-impl/src/test/java/dev/sheldan/abstracto/suggestion/service/SuggestionServiceBeanTest.java index ccaa8ff15..0f3f7e02c 100644 --- a/abstracto-application/abstracto-modules/suggestion/suggestion-impl/src/test/java/dev/sheldan/abstracto/suggestion/service/SuggestionServiceBeanTest.java +++ b/abstracto-application/abstracto-modules/suggestion/suggestion-impl/src/test/java/dev/sheldan/abstracto/suggestion/service/SuggestionServiceBeanTest.java @@ -106,10 +106,9 @@ public class SuggestionServiceBeanTest { SuggestionLog log = Mockito.mock(SuggestionLog.class); when(suggestionCreator.getGuild()).thenReturn(guild); when(guild.getIdLong()).thenReturn(SERVER_ID); - when(guild.getIdLong()).thenReturn(SERVER_ID); when(serverManagementService.loadServer(suggestionCreator.getGuild())).thenReturn(server); MessageToSend messageToSend = Mockito.mock(MessageToSend.class); - when(templateService.renderEmbedTemplate(eq(SuggestionServiceBean.SUGGESTION_LOG_TEMPLATE), any(SuggestionLog.class))).thenReturn(messageToSend); + when(templateService.renderEmbedTemplate(eq(SuggestionServiceBean.SUGGESTION_LOG_TEMPLATE), any(SuggestionLog.class), eq(SERVER_ID))).thenReturn(messageToSend); Message suggestionMessage = Mockito.mock(Message.class); when(counterService.getNextCounterValue(server, SuggestionServiceBean.SUGGESTION_COUNTER_KEY)).thenReturn(SUGGESTION_ID); AUserInAServer aUserInAServer = Mockito.mock(AUserInAServer.class); @@ -193,7 +192,7 @@ public class SuggestionServiceBeanTest { when(guild.getIdLong()).thenReturn(SERVER_ID); when(suggestionMessage.getEmbeds()).thenReturn(Arrays.asList(embed)); MessageToSend updatedMessage = Mockito.mock(MessageToSend.class); - when(templateService.renderEmbedTemplate(eq(SuggestionServiceBean.SUGGESTION_LOG_TEMPLATE), any(SuggestionLog.class))).thenReturn(updatedMessage); + when(templateService.renderEmbedTemplate(eq(SuggestionServiceBean.SUGGESTION_LOG_TEMPLATE), any(SuggestionLog.class), eq(SERVER_ID))).thenReturn(updatedMessage); testUnit.updateSuggestionMessageText(CLOSING_TEXT, log, suggestionMessage); verify(postTargetService, times(1)).sendEmbedInPostTarget(updatedMessage, SuggestionPostTarget.SUGGESTION, SERVER_ID); } diff --git a/abstracto-application/abstracto-modules/webservices/webservices-impl/src/main/java/dev/sheldan/abstracto/webservices/urban/command/UrbanDefine.java b/abstracto-application/abstracto-modules/webservices/webservices-impl/src/main/java/dev/sheldan/abstracto/webservices/urban/command/UrbanDefine.java index 61bd08027..3d0bdef33 100644 --- a/abstracto-application/abstracto-modules/webservices/webservices-impl/src/main/java/dev/sheldan/abstracto/webservices/urban/command/UrbanDefine.java +++ b/abstracto-application/abstracto-modules/webservices/webservices-impl/src/main/java/dev/sheldan/abstracto/webservices/urban/command/UrbanDefine.java @@ -48,7 +48,7 @@ public class UrbanDefine extends AbstractConditionableCommand { UrbanDefinition definition = urbanService.getUrbanDefinition(parameter); UrbanResponseModel model = (UrbanResponseModel) ContextConverter.slimFromCommandContext(commandContext, UrbanResponseModel.class); model.setDefinition(definition); - MessageToSend message = templateService.renderEmbedTemplate(URBAN_DEFINE_RESPONSE_MODEL_TEMPLATE_KEY, model); + MessageToSend message = templateService.renderEmbedTemplate(URBAN_DEFINE_RESPONSE_MODEL_TEMPLATE_KEY, model, commandContext.getGuild().getIdLong()); return FutureUtils.toSingleFutureGeneric(channelService.sendMessageToSendToChannel(message, commandContext.getChannel())) .thenApply(unused -> CommandResult.fromSuccess()); } catch (IOException e) { diff --git a/abstracto-application/abstracto-modules/webservices/webservices-impl/src/main/java/dev/sheldan/abstracto/webservices/youtube/command/YoutubeVideoSearch.java b/abstracto-application/abstracto-modules/webservices/webservices-impl/src/main/java/dev/sheldan/abstracto/webservices/youtube/command/YoutubeVideoSearch.java index fdac1b707..95a11a13f 100644 --- a/abstracto-application/abstracto-modules/webservices/webservices-impl/src/main/java/dev/sheldan/abstracto/webservices/youtube/command/YoutubeVideoSearch.java +++ b/abstracto-application/abstracto-modules/webservices/webservices-impl/src/main/java/dev/sheldan/abstracto/webservices/youtube/command/YoutubeVideoSearch.java @@ -30,6 +30,8 @@ import java.util.concurrent.CompletableFuture; @Component public class YoutubeVideoSearch extends AbstractConditionableCommand { + public static final String YOUTUBE_SEARCH_COMMAND_RESPONSE_TEMPLATE_KEY = "youtube_search_command_response"; + public static final String YOUTUBE_SEARCH_COMMAND_RESPONSE_LINK_TEMPLATE_KEY = "youtube_search_command_response_link"; @Autowired private YoutubeSearchService youtubeSearchService; @@ -50,12 +52,12 @@ public class YoutubeVideoSearch extends AbstractConditionableCommand { model.setVideo(foundVideo); CompletableFuture infoEmbedFuture; if(featureModeService.featureModeActive(WebserviceFeatureDefinition.YOUTUBE, commandContext.getGuild().getIdLong(), YoutubeWebServiceFeatureMode.VIDEO_DETAILS)) { - MessageToSend message = templateService.renderEmbedTemplate("youtube_search_command_response", model); + MessageToSend message = templateService.renderEmbedTemplate(YOUTUBE_SEARCH_COMMAND_RESPONSE_TEMPLATE_KEY, model, commandContext.getGuild().getIdLong()); infoEmbedFuture = FutureUtils.toSingleFutureGeneric(channelService.sendMessageToSendToChannel(message, commandContext.getChannel())); } else { infoEmbedFuture = CompletableFuture.completedFuture(null); } - MessageToSend linkEmbed = templateService.renderEmbedTemplate("youtube_search_command_response_link", model); + MessageToSend linkEmbed = templateService.renderEmbedTemplate(YOUTUBE_SEARCH_COMMAND_RESPONSE_LINK_TEMPLATE_KEY, model, commandContext.getGuild().getIdLong()); CompletableFuture linkEmbedFuture = FutureUtils.toSingleFutureGeneric(channelService.sendMessageToSendToChannel(linkEmbed, commandContext.getChannel())); return CompletableFuture.allOf(infoEmbedFuture, linkEmbedFuture) .thenApply(unused -> CommandResult.fromSuccess()); diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/help/Help.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/help/Help.java index 5124f8ce3..4710e9cdb 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/help/Help.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/help/Help.java @@ -163,7 +163,7 @@ public class Help implements Command { List subModules = moduleService.getSubModules(moduleDefinition); HelpModuleOverviewModel model = (HelpModuleOverviewModel) ContextConverter.fromCommandContext(commandContext, HelpModuleOverviewModel.class); model.setModules(subModules); - MessageToSend messageToSend = templateService.renderEmbedTemplate("help_module_overview_response", model); + MessageToSend messageToSend = templateService.renderEmbedTemplate("help_module_overview_response", model, commandContext.getGuild().getIdLong()); return FutureUtils.toSingleFutureGeneric(channelService.sendMessageToSendToChannel(messageToSend, commandContext.getChannel())) .thenApply(aVoid -> CommandResult.fromIgnored()); } diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/ChannelServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/ChannelServiceBean.java index b8aadfac2..b61864b74 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/ChannelServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/ChannelServiceBean.java @@ -200,33 +200,38 @@ public class ChannelServiceBean implements ChannelService { @Override public List> sendMessageToSendToChannel(MessageToSend messageToSend, MessageChannel textChannel) { - String messageText = messageToSend.getMessage(); List> futures = new ArrayList<>(); - MessageAction firstMessageAction = null; List allMessageActions = new ArrayList<>(); - if(!StringUtils.isBlank(messageText)) { + int iterations = Math.min(messageToSend.getMessages().size(), messageToSend.getEmbeds().size()); + for (int i = 0; i < iterations; i++) { metricService.incrementCounter(MESSAGE_SEND_METRIC); - firstMessageAction = textChannel.sendMessage(messageText); + String text = messageToSend.getMessages().get(i); + MessageEmbed embed = messageToSend.getEmbeds().get(i); + MessageAction messageAction = textChannel.sendMessage(text).embed(embed); + allMessageActions.add(messageAction); } - if(!messageToSend.getEmbeds().isEmpty()) { - if(firstMessageAction != null) { - metricService.incrementCounter(MESSAGE_SEND_METRIC); - firstMessageAction.embed(messageToSend.getEmbeds().get(0)); - } else { - firstMessageAction = textChannel.sendMessage(messageToSend.getEmbeds().get(0)); - } - messageToSend.getEmbeds().stream().skip(1).forEach(embed -> allMessageActions.add(sendEmbedToChannelInComplete(embed, textChannel))); + // one of these loops will get additional iterations, if the number is different, not both + for (int i = iterations; i < messageToSend.getMessages().size(); i++) { + metricService.incrementCounter(MESSAGE_SEND_METRIC); + String text = messageToSend.getMessages().get(i); + MessageAction messageAction = textChannel.sendMessage(text); + allMessageActions.add(messageAction); + } + for (int i = iterations; i < messageToSend.getEmbeds().size(); i++) { + metricService.incrementCounter(MESSAGE_SEND_METRIC); + MessageEmbed embed = messageToSend.getEmbeds().get(i); + MessageAction messageAction = textChannel.sendMessage(embed); + allMessageActions.add(messageAction); } if(messageToSend.hasFileToSend()) { - if(firstMessageAction != null) { + if(!allMessageActions.isEmpty()) { // in case there has not been a message, we need to increment it - metricService.incrementCounter(MESSAGE_SEND_METRIC); - firstMessageAction.addFile(messageToSend.getFileToSend()); + allMessageActions.set(0, allMessageActions.get(0).addFile(messageToSend.getFileToSend())); } else { - firstMessageAction = textChannel.sendFile(messageToSend.getFileToSend()); + metricService.incrementCounter(MESSAGE_SEND_METRIC); + allMessageActions.add(textChannel.sendFile(messageToSend.getFileToSend())); } } - allMessageActions.add(0, firstMessageAction); List allowedMentions = getAllowedMentionsFor(textChannel); allMessageActions.forEach(messageAction -> futures.add(messageAction.allowedMentions(allowedMentions).submit()) @@ -253,9 +258,9 @@ public class ChannelServiceBean implements ChannelService { @Override public CompletableFuture editMessageInAChannelFuture(MessageToSend messageToSend, MessageChannel channel, Long messageId) { MessageAction messageAction; - if(!StringUtils.isBlank(messageToSend.getMessage())) { + if(!StringUtils.isBlank(messageToSend.getMessages().get(0))) { log.trace("Editing message {} with new text content.", messageId); - messageAction = channel.editMessageById(messageId, messageToSend.getMessage()); + messageAction = channel.editMessageById(messageId, messageToSend.getMessages().get(0)); if(messageToSend.getEmbeds() != null && !messageToSend.getEmbeds().isEmpty()) { log.trace("Also editing the embed for message {}.", messageId); messageAction = messageAction.embed(messageToSend.getEmbeds().get(0)); @@ -459,7 +464,7 @@ public class ChannelServiceBean implements ChannelService { if(tempFile.length() > maxFileSize) { throw new UploadFileTooLargeException(tempFile.length(), maxFileSize); } - MessageToSend messageToSend = templateService.renderEmbedTemplate(messageTemplate, model); + MessageToSend messageToSend = templateService.renderEmbedTemplate(messageTemplate, model, channel.getGuild().getIdLong()); messageToSend.setFileToSend(tempFile); return sendMessageToSendToChannel(messageToSend, channel); } catch (IOException e) { diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/PostTargetServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/PostTargetServiceBean.java index 5b7109c70..ccc9034b1 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/PostTargetServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/PostTargetServiceBean.java @@ -130,7 +130,8 @@ public class PostTargetServiceBean implements PostTargetService { @Override public List> editEmbedInPostTarget(Long messageId, MessageToSend message, PostTarget target) { TextChannel textChannelForPostTarget = getTextChannelForPostTarget(target); - String messageText = message.getMessage(); + // always takes the first one, only applicable for this scenario + String messageText = message.getMessages().get(0); if(StringUtils.isBlank(messageText)) { log.trace("Editing embeds of message {} in post target {}.", messageId, target.getName()); return Arrays.asList(channelService.editEmbedMessageInAChannel(message.getEmbeds().get(0), textChannelForPostTarget, messageId)); @@ -146,7 +147,7 @@ public class PostTargetServiceBean implements PostTargetService { TextChannel textChannelForPostTarget = getTextChannelForPostTarget(target); CompletableFuture messageEditFuture = new CompletableFuture<>(); futures.add(messageEditFuture); - if(StringUtils.isBlank(messageToSend.getMessage().trim())) { + if(StringUtils.isBlank(messageToSend.getMessages().get(0).trim())) { channelService.retrieveMessageInChannel(textChannelForPostTarget, messageId).thenAccept(message -> { log.trace("Editing existing message {} when upserting message embeds in channel {} in server {}.", messageId, textChannelForPostTarget.getIdLong(), textChannelForPostTarget.getGuild().getId()); @@ -167,7 +168,7 @@ public class PostTargetServiceBean implements PostTargetService { channelService.retrieveMessageInChannel(textChannelForPostTarget, messageId).thenAccept(message -> { log.trace("Editing existing message {} when upserting message in channel {} in server {}.", messageId, textChannelForPostTarget.getIdLong(), textChannelForPostTarget.getGuild().getId()); - messageService.editMessage(message, messageToSend.getMessage(), messageToSend.getEmbeds().get(0)) + messageService.editMessage(message, messageToSend.getMessages().get(0), messageToSend.getEmbeds().get(0)) .queue(messageEditFuture::complete, messageEditFuture::completeExceptionally); }).exceptionally(throwable -> { log.trace("Creating new message when trying to upsert a message {} in channel {} in server {}.", diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/templating/model/EmbedConfiguration.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/templating/model/EmbedConfiguration.java index 41014c16e..29706479b 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/templating/model/EmbedConfiguration.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/templating/model/EmbedConfiguration.java @@ -55,6 +55,8 @@ public class EmbedConfiguration { * The message which is posted along the {@link net.dv8tion.jda.api.entities.MessageEmbed} as a normal message. */ private String additionalMessage; + private Long additionalMessageLengthLimit; + private Long messageLimit; private boolean preventEmptyEmbed = false; } diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/templating/service/TemplateServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/templating/service/TemplateServiceBean.java index b560a3387..ef27b3c75 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/templating/service/TemplateServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/templating/service/TemplateServiceBean.java @@ -1,7 +1,9 @@ package dev.sheldan.abstracto.core.templating.service; import com.google.gson.Gson; +import dev.sheldan.abstracto.core.command.config.features.CoreFeatureConfig; import dev.sheldan.abstracto.core.config.ServerContext; +import dev.sheldan.abstracto.core.service.ConfigService; import dev.sheldan.abstracto.core.templating.Templatable; import dev.sheldan.abstracto.core.templating.exception.TemplatingException; import dev.sheldan.abstracto.core.templating.model.*; @@ -13,6 +15,7 @@ import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.MessageEmbed; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -41,6 +44,9 @@ public class TemplateServiceBean implements TemplateService { @Autowired private ServerContext serverContext; + @Autowired + private ConfigService configService; + /** * Formats the passed passed count with the embed used for formatting pages. * @@ -114,9 +120,51 @@ public class TemplateServiceBean implements TemplateService { embeds = embedBuilders.stream().map(EmbedBuilder::build).collect(Collectors.toList()); } + List messages = new ArrayList<>(); + String additionalMessage = embedConfiguration.getAdditionalMessage(); + if(additionalMessage != null) { + Long segmentLimit = embedConfiguration.getAdditionalMessageLengthLimit() != null ? embedConfiguration.getAdditionalMessageLengthLimit() : Long.valueOf(Message.MAX_CONTENT_LENGTH); + if(additionalMessage.length() > segmentLimit) { + int segmentStart = 0; + int segmentEnd = segmentLimit.intValue(); + while(segmentStart < additionalMessage.length()) { + int segmentLength = additionalMessage.length() - segmentStart; + if(segmentLength > segmentLimit) { + int lastSpace = additionalMessage.substring(segmentStart, segmentEnd).lastIndexOf(" "); + if(lastSpace != -1) { + segmentEnd = segmentStart + lastSpace; + } + } else { + segmentEnd = additionalMessage.length(); + } + String messageText = additionalMessage.substring(segmentStart, segmentEnd); + messages.add(messageText); + segmentStart = segmentEnd; + segmentEnd += segmentLimit; + } + } else { + messages.add(additionalMessage); + } + } + Long messageLimit = 100L; + if(serverContext.getServerId() != null) { + messageLimit = Math.min(messageLimit, configService.getLongValue(CoreFeatureConfig.MAX_MESSAGES_KEY, serverContext.getServerId())); + } + if(embedConfiguration.getMessageLimit() != null) { + messageLimit = Math.min(messageLimit, embedConfiguration.getMessageLimit()); + } + if(embeds.size() > messageLimit) { + log.info("Limiting size of embeds. Max allowed: {}, currently: {}.", messageLimit, embeds.size()); + embeds.subList(messageLimit.intValue(), embeds.size()).clear(); + } + if(messages.size() > messageLimit) { + log.info("Limiting size of messages. Max allowed: {}, currently: {}.", messageLimit, messages.size()); + messages.subList(messageLimit.intValue(), messages.size()).clear(); + } + return MessageToSend.builder() .embeds(embeds) - .message(embedConfiguration.getAdditionalMessage()) + .messages(messages) .build(); } @@ -171,7 +219,7 @@ public class TemplateServiceBean implements TemplateService { @Override public MessageToSend renderTemplateToMessageToSend(String key, Object model) { - return MessageToSend.builder().message(renderTemplate(key, model)).build(); + return MessageToSend.builder().messages(Arrays.asList(renderTemplate(key, model))).build(); } @Override diff --git a/abstracto-application/core/core-impl/src/main/resources/abstracto.properties b/abstracto-application/core/core-impl/src/main/resources/abstracto.properties index b10615aee..d0c55cb35 100644 --- a/abstracto-application/core/core-impl/src/main/resources/abstracto.properties +++ b/abstracto-application/core/core-impl/src/main/resources/abstracto.properties @@ -13,5 +13,8 @@ abstracto.systemConfigs.prefix.stringValue=! abstracto.systemConfigs.noCommandFoundReporting.name=noCommandFoundReporting abstracto.systemConfigs.noCommandFoundReporting.stringValue=true +abstracto.systemConfigs.maxMessages.name=maxMessages +abstracto.systemConfigs.maxMessages.longValue=3 + abstracto.featureFlags.core.featureName=core abstracto.featureFlags.core.enabled=true \ No newline at end of file diff --git a/abstracto-application/core/core-impl/src/test/java/dev/sheldan/abstracto/core/templating/service/TemplateServiceBeanTest.java b/abstracto-application/core/core-impl/src/test/java/dev/sheldan/abstracto/core/templating/service/TemplateServiceBeanTest.java index 7821c5e47..85dad5d19 100644 --- a/abstracto-application/core/core-impl/src/test/java/dev/sheldan/abstracto/core/templating/service/TemplateServiceBeanTest.java +++ b/abstracto-application/core/core-impl/src/test/java/dev/sheldan/abstracto/core/templating/service/TemplateServiceBeanTest.java @@ -1,7 +1,9 @@ package dev.sheldan.abstracto.core.templating.service; import com.google.gson.Gson; +import dev.sheldan.abstracto.core.command.config.features.CoreFeatureConfig; import dev.sheldan.abstracto.core.config.ServerContext; +import dev.sheldan.abstracto.core.service.ConfigService; import dev.sheldan.abstracto.core.templating.Templatable; import dev.sheldan.abstracto.core.templating.exception.TemplatingException; import dev.sheldan.abstracto.core.templating.model.*; @@ -54,6 +56,9 @@ public class TemplateServiceBeanTest { @Mock private Configuration configuration; + @Mock + private ConfigService configService; + @Mock private Gson gson; @@ -66,15 +71,20 @@ public class TemplateServiceBeanTest { @Test public void testSimpleTemplate() throws IOException, TemplateException { - when(serverContext.getServerId()).thenReturn(SERVER_ID); + setupServerAware(); when(configuration.getTemplate(TEMPLATE_KEY, null, SERVER_ID, null, true, false)).thenReturn(getSimpleTemplate()); String rendered = templateServiceBean.renderSimpleTemplate(TEMPLATE_KEY); Assert.assertEquals(SIMPLE_TEMPLATE_SOURCE, rendered); } + private void setupServerAware() { + when(serverContext.getServerId()).thenReturn(SERVER_ID); + when(configService.getLongValue(CoreFeatureConfig.MAX_MESSAGES_KEY, SERVER_ID)).thenReturn(5L); + } + @Test public void renderTemplatable() throws IOException, TemplateException { - when(serverContext.getServerId()).thenReturn(SERVER_ID); + setupServerAware(); when(configuration.getTemplate(TEMPLATE_KEY, null, SERVER_ID, null, true, false)).thenReturn(getSimpleTemplate()); Templatable templatable = getTemplatableWithSimpleTemplate(); String rendered = templateServiceBean.renderTemplatable(templatable); @@ -82,8 +92,62 @@ public class TemplateServiceBeanTest { } @Test - public void testTemplateWithMapParameter() throws IOException, TemplateException { + public void testRenderTooLongAdditionalMessage() throws IOException, TemplateException { when(serverContext.getServerId()).thenReturn(SERVER_ID); + String additionalMessage = RandomStringUtils.randomAlphabetic(3500); + when(configService.getLongValue(CoreFeatureConfig.MAX_MESSAGES_KEY, SERVER_ID)).thenReturn(5L); + String templateContent = String.format("{ \"additionalMessage\": \"%s\"}", additionalMessage); + EmbedConfiguration config = Mockito.mock(EmbedConfiguration.class); + when(config.getAdditionalMessageLengthLimit()).thenReturn(2000L); + when(config.getAdditionalMessage()).thenReturn(additionalMessage); + when(configuration.getTemplate(getEmbedTemplateKey(), null, SERVER_ID, null, true, false)).thenReturn(new Template(getEmbedTemplateKey(), templateContent, getNonMockedConfiguration())); + when(gson.fromJson(templateContent, EmbedConfiguration.class)).thenReturn(config); + MessageToSend messageToSend = templateServiceBean.renderEmbedTemplate(TEMPLATE_KEY, new Object()); + Assert.assertEquals(2, messageToSend.getMessages().size()); + Assert.assertEquals(additionalMessage.substring(0, 2000), messageToSend.getMessages().get(0)); + Assert.assertEquals(additionalMessage.substring(2000, 3500), messageToSend.getMessages().get(1)); + } + + @Test + public void testRenderEmbedWithMessageLimit() throws IOException, TemplateException { + when(serverContext.getServerId()).thenReturn(SERVER_ID); + String additionalMessage = RandomStringUtils.randomAlphabetic(3500); + when(configService.getLongValue(CoreFeatureConfig.MAX_MESSAGES_KEY, SERVER_ID)).thenReturn(5L); + String templateContent = String.format("{ \"additionalMessage\": \"%s\", \"messageLimit\": 1}", additionalMessage); + EmbedConfiguration config = Mockito.mock(EmbedConfiguration.class); + when(config.getAdditionalMessageLengthLimit()).thenReturn(2000L); + when(config.getAdditionalMessage()).thenReturn(additionalMessage); + when(config.getMessageLimit()).thenReturn(1L); + when(configuration.getTemplate(getEmbedTemplateKey(), null, SERVER_ID, null, true, false)).thenReturn(new Template(getEmbedTemplateKey(), templateContent, getNonMockedConfiguration())); + when(gson.fromJson(templateContent, EmbedConfiguration.class)).thenReturn(config); + MessageToSend messageToSend = templateServiceBean.renderEmbedTemplate(TEMPLATE_KEY, new Object()); + Assert.assertEquals(1, messageToSend.getMessages().size()); + Assert.assertEquals(additionalMessage.substring(0, 2000), messageToSend.getMessages().get(0)); + } + + @Test + public void testRenderTooLongMultipleAdditionalMessages() throws IOException, TemplateException { + when(serverContext.getServerId()).thenReturn(SERVER_ID); + String additionalMessage = RandomStringUtils.randomAlphabetic(3500); + when(configService.getLongValue(CoreFeatureConfig.MAX_MESSAGES_KEY, SERVER_ID)).thenReturn(5L); + String templateContent = String.format("{ \"additionalMessage\": \"%s\"}", additionalMessage); + EmbedConfiguration config = Mockito.mock(EmbedConfiguration.class); + when(config.getAdditionalMessageLengthLimit()).thenReturn(500L); + when(config.getAdditionalMessage()).thenReturn(additionalMessage); + when(configuration.getTemplate(getEmbedTemplateKey(), null, SERVER_ID, null, true, false)).thenReturn(new Template(getEmbedTemplateKey(), templateContent, getNonMockedConfiguration())); + when(gson.fromJson(templateContent, EmbedConfiguration.class)).thenReturn(config); + MessageToSend messageToSend = templateServiceBean.renderEmbedTemplate(TEMPLATE_KEY, new Object()); + Assert.assertEquals(5, messageToSend.getMessages().size()); + Assert.assertEquals(additionalMessage.substring(0, 500), messageToSend.getMessages().get(0)); + Assert.assertEquals(additionalMessage.substring(500, 1000), messageToSend.getMessages().get(1)); + Assert.assertEquals(additionalMessage.substring(1000, 1500), messageToSend.getMessages().get(2)); + Assert.assertEquals(additionalMessage.substring(1500, 2000), messageToSend.getMessages().get(3)); + Assert.assertEquals(additionalMessage.substring(2000, 2500), messageToSend.getMessages().get(4)); + } + + @Test + public void testTemplateWithMapParameter() throws IOException, TemplateException { + setupServerAware(); when(configuration.getTemplate(TEMPLATE_KEY, null, SERVER_ID, null, true, false)).thenReturn(getSimpleTemplate()); String rendered = templateServiceBean.renderTemplateWithMap(TEMPLATE_KEY, new HashMap<>()); Assert.assertEquals(SIMPLE_TEMPLATE_SOURCE, rendered); @@ -91,7 +155,7 @@ public class TemplateServiceBeanTest { @Test public void testEmbedWithDescription() throws IOException, TemplateException { - when(serverContext.getServerId()).thenReturn(SERVER_ID); + setupServerAware(); String descriptionText = "test"; String fullEmbedTemplateKey = getEmbedTemplateKey(); when(configuration.getTemplate(fullEmbedTemplateKey, null, SERVER_ID, null, true, false)).thenReturn(getEmbedTemplateWithDescription(descriptionText)); @@ -102,11 +166,11 @@ public class TemplateServiceBeanTest { @Test public void testEmbedWithAllUsableAttributes() throws IOException, TemplateException { - when(serverContext.getServerId()).thenReturn(SERVER_ID); + setupServerAware(); when(configuration.getTemplate(getEmbedTemplateKey(), null, SERVER_ID, null, true, false)).thenReturn(getEmbedTemplateWithFallFieldsUsedOnce()); when(gson.fromJson(getFullEmbedConfigString(), EmbedConfiguration.class)).thenReturn(getFullEmbedConfiguration()); MessageToSend messageToSend = templateServiceBean.renderEmbedTemplate(TEMPLATE_KEY, new HashMap<>()); - Assert.assertEquals("additionalMessage", messageToSend.getMessage()); + Assert.assertEquals("additionalMessage", messageToSend.getMessages().get(0)); MessageEmbed onlyEmbed = messageToSend.getEmbeds().get(0); Assert.assertEquals(EXAMPLE_URL, onlyEmbed.getAuthor().getIconUrl()); Assert.assertEquals("name", onlyEmbed.getAuthor().getName()); @@ -129,7 +193,7 @@ public class TemplateServiceBeanTest { @Test public void testEmbedWithTooLongDescriptionNoSpace() throws IOException, TemplateException { - when(serverContext.getServerId()).thenReturn(SERVER_ID); + setupServerAware(); int tooMuchCharacterCount = 1024; String descriptionText = RandomStringUtils.randomAlphabetic(MessageEmbed.TEXT_MAX_LENGTH + tooMuchCharacterCount); when(configuration.getTemplate(getEmbedTemplateKey(), null, SERVER_ID, null, true, false)).thenReturn(getEmbedTemplateWithDescription(descriptionText)); @@ -146,7 +210,7 @@ public class TemplateServiceBeanTest { @Test public void testEmbedWithTooManyFields() throws IOException, TemplateException { - when(serverContext.getServerId()).thenReturn(SERVER_ID); + setupServerAware(); int totalFieldCount = 30; when(configuration.getTemplate(getEmbedTemplateKey(), null, SERVER_ID, null, true, false)).thenReturn(getEmbedTemplateWithFieldCount(totalFieldCount)); when(configuration.getTemplate(EMBED_PAGE_COUNT_TEMPLATE, null, SERVER_ID, null, true, false)).thenReturn(getPageCountTemplate(1)); @@ -162,6 +226,7 @@ public class TemplateServiceBeanTest { public void testEmbedWithTooLongFieldNoSpace() throws IOException, TemplateException { when(serverContext.getServerId()).thenReturn(SERVER_ID); String fieldValue = RandomStringUtils.randomAlphabetic(1500); + when(configService.getLongValue(CoreFeatureConfig.MAX_MESSAGES_KEY, SERVER_ID)).thenReturn(5L); when(configuration.getTemplate(getEmbedTemplateKey(), null, SERVER_ID, null, true, false)).thenReturn(getEmbedTemplateWithTooLongField(fieldValue)); when(gson.fromJson(getSingleFieldWithValue(fieldValue), EmbedConfiguration.class)).thenReturn(getEmbedWithSingleFieldOfValue(fieldValue)); MessageToSend messageToSend = templateServiceBean.renderEmbedTemplate(TEMPLATE_KEY, new HashMap<>()); @@ -173,7 +238,7 @@ public class TemplateServiceBeanTest { @Test public void testEmbedWithTooLongFieldWithSpace() throws IOException, TemplateException { - when(serverContext.getServerId()).thenReturn(SERVER_ID); + setupServerAware(); int partsLength = 750; String firstPart = RandomStringUtils.randomAlphabetic(partsLength); String secondPart = RandomStringUtils.randomAlphabetic(partsLength); @@ -189,7 +254,7 @@ public class TemplateServiceBeanTest { @Test public void testDescriptionWithOneSpace() throws IOException, TemplateException { - when(serverContext.getServerId()).thenReturn(SERVER_ID); + setupServerAware(); int partLengths = 1024; String firstPart = RandomStringUtils.randomAlphabetic(partLengths); String secondPart = RandomStringUtils.randomAlphabetic(partLengths); @@ -209,7 +274,7 @@ public class TemplateServiceBeanTest { @Test public void testDescriptionWithTwoSpacesAndLongChunks() throws IOException, TemplateException { - when(serverContext.getServerId()).thenReturn(SERVER_ID); + setupServerAware(); int partLengths = 1024; String firstPart = RandomStringUtils.randomAlphabetic(partLengths); String secondPart = RandomStringUtils.randomAlphabetic(partLengths); @@ -233,7 +298,7 @@ public class TemplateServiceBeanTest { @Test public void testDescriptionWithMultipleSpacesSplitIntoTwo() throws IOException, TemplateException { - when(serverContext.getServerId()).thenReturn(SERVER_ID); + setupServerAware(); int partLengths = 750; String firstPart = RandomStringUtils.randomAlphabetic(partLengths); String secondPart = RandomStringUtils.randomAlphabetic(partLengths); @@ -254,7 +319,7 @@ public class TemplateServiceBeanTest { @Test public void testFieldLengthTooLongForEmbed() throws IOException, TemplateException { - when(serverContext.getServerId()).thenReturn(SERVER_ID); + setupServerAware(); int partLengths = 1000; String fieldValue = RandomStringUtils.randomAlphabetic(partLengths); String firstField = fieldValue + "a"; @@ -286,25 +351,21 @@ public class TemplateServiceBeanTest { @Test(expected = TemplatingException.class) public void tryToRenderMissingTemplate() throws IOException { - when(serverContext.getServerId()).thenReturn(SERVER_ID); + setupServerAware(); when(configuration.getTemplate(TEMPLATE_KEY, null, SERVER_ID, null, true, false)).thenThrow(new TemplateNotFoundException(TEMPLATE_KEY, new Object(), "")); templateServiceBean.renderSimpleTemplate(TEMPLATE_KEY); } @Test(expected = TemplatingException.class) public void tryToRenderMissingEmbedTemplate() throws IOException { - when(serverContext.getServerId()).thenReturn(SERVER_ID); + setupServerAware(); when(configuration.getTemplate(getEmbedTemplateKey(), null, SERVER_ID, null, true, false)).thenThrow(new TemplateNotFoundException(TEMPLATE_KEY, new Object(), "")); templateServiceBean.renderEmbedTemplate(TEMPLATE_KEY, new Object()); } - private String getEmbedTemplateKey() { - return TEMPLATE_KEY + "_embed"; - } - @Test(expected = TemplatingException.class) public void tryToRenderMissingTemplateWithMap() throws IOException { - when(serverContext.getServerId()).thenReturn(SERVER_ID); + setupServerAware(); when(configuration.getTemplate(TEMPLATE_KEY, null, SERVER_ID, null, true, false)).thenThrow(new TemplateNotFoundException(TEMPLATE_KEY, new Object(), "")); templateServiceBean.renderTemplateWithMap(TEMPLATE_KEY, new HashMap<>()); } @@ -319,6 +380,10 @@ public class TemplateServiceBeanTest { return EmbedConfiguration.builder().fields(fields).build(); } + private String getEmbedTemplateKey() { + return TEMPLATE_KEY + "_embed"; + } + private EmbedConfiguration getEmbedWithFields(List fieldValues) { List fields = new ArrayList<>(); fieldValues.forEach(s -> { diff --git a/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/command/config/features/CoreFeatureConfig.java b/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/command/config/features/CoreFeatureConfig.java index 84a11f207..dc70b3bdb 100644 --- a/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/command/config/features/CoreFeatureConfig.java +++ b/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/command/config/features/CoreFeatureConfig.java @@ -13,6 +13,7 @@ public class CoreFeatureConfig implements FeatureConfig { public static final String NO_COMMAND_REPORTING_CONFIG_KEY = "noCommandFoundReporting"; public static final String SUCCESS_REACTION_KEY = "successReaction"; public static final String WARN_REACTION_KEY = "warnReaction"; + public static final String MAX_MESSAGES_KEY = "maxMessages"; @Override public FeatureDefinition getFeature() { @@ -26,6 +27,6 @@ public class CoreFeatureConfig implements FeatureConfig { @Override public List getRequiredSystemConfigKeys() { - return Arrays.asList(NO_COMMAND_REPORTING_CONFIG_KEY); + return Arrays.asList(NO_COMMAND_REPORTING_CONFIG_KEY, MAX_MESSAGES_KEY); } } diff --git a/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/templating/model/MessageToSend.java b/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/templating/model/MessageToSend.java index 674cdadb6..6a610caee 100644 --- a/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/templating/model/MessageToSend.java +++ b/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/templating/model/MessageToSend.java @@ -24,7 +24,7 @@ public class MessageToSend { /** * The string content to be used in the first message. */ - private String message; + private List messages; /** * The file handle to send attached to the message. */