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 b4f3cabc2..3a04a2870 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 @@ -105,6 +105,9 @@ public class SuggestionServiceBean implements SuggestionService { @Autowired private SuggestionVoteManagementService suggestionVoteManagementService; + @Autowired + private ChannelService channelService; + @Value("${abstracto.feature.suggestion.removalMaxAge}") private Long removalMaxAgeSeconds; @@ -155,18 +158,18 @@ public class SuggestionServiceBean implements SuggestionService { List buttonConfigModels = Arrays.asList(model.getAgreeButtonModel(), model.getDisAgreeButtonModel(), model.getRemoveVoteButtonModel()); return FutureUtils.toSingleFutureGeneric(completableFutures) .thenCompose(aVoid -> self.addVotingPossibility(suggestionChannelId, suggestionMessageId, text, suggester, serverId, newSuggestionId, completableFutures, buttonConfigModels, useButtons)) - .thenCompose(aVoid -> self.createSuggestionThread(serverId, newSuggestionId, suggester, text, autoEvaluationEnabled, autoEvaluationTargetDate)); + .thenCompose(aVoid -> self.createSuggestionThread(serverId, newSuggestionId, suggester, text, autoEvaluationEnabled, autoEvaluationTargetDate, completableFutures)); } @Transactional public CompletableFuture createSuggestionThread(Long serverId, Long suggestionId, Member suggester, String suggestionText, - Boolean autoEvaluationEnabled, Instant autoEvaluationTargetDate) { + Boolean autoEvaluationEnabled, Instant autoEvaluationTargetDate, List> completableFutures) { if(featureModeService.featureModeActive(SuggestionFeatureDefinition.SUGGEST, serverId, SuggestionFeatureMode.SUGGESTION_THREAD)) { Optional suggestionTargetChannelOptional = postTargetService.getPostTargetChannel(SuggestionPostTarget.SUGGESTION, serverId); log.info("Trying to create thread for suggestion {} in server {}.", suggestionId, serverId); if (suggestionTargetChannelOptional.isPresent()) { GuildMessageChannel messageChannel = suggestionTargetChannelOptional.get(); - if(messageChannel instanceof IThreadContainer) { + if(messageChannel instanceof IThreadContainer threadContainer) { SuggestionThreadModel model = SuggestionThreadModel .builder() .suggestionId(suggestionId) @@ -176,10 +179,15 @@ public class SuggestionServiceBean implements SuggestionService { .text(suggestionText) .autoEvaluationTargetDate(autoEvaluationTargetDate) .build(); - IThreadContainer threadContainer = (IThreadContainer) messageChannel; String threadName = templateService.renderTemplate("suggestion_thread_name", model, serverId); - return threadContainer.createThreadChannel(threadName).submit() - .thenAccept(threadChannel -> log.info("Created thread for suggestion {} in server {}.", suggestionId, serverId)); + if(!completableFutures.isEmpty()) { + Long suggestionMessageId = completableFutures.get(0).join().getIdLong(); + return channelService.createThreadChannel(threadContainer, threadName, suggestionMessageId) + .thenAccept(threadChannel -> log.info("Created thread for suggestion {} in server {} using the suggestion message {} as starter.", suggestionId, serverId, suggestionMessageId)); + } else { + return channelService.createThreadChannel(threadContainer, threadName) + .thenAccept(threadChannel -> log.info("Created thread for suggestion {} in server {}.", suggestionId, serverId)); + } } else { log.info("Suggestion thread was not created - post target for suggestions does not allow to create threads"); } 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 22a3a1515..c84f32bb5 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 @@ -18,6 +18,7 @@ import lombok.extern.slf4j.Slf4j; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.entities.*; +import net.dv8tion.jda.api.entities.channel.attribute.IThreadContainer; import net.dv8tion.jda.api.entities.channel.concrete.Category; import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel; @@ -116,6 +117,16 @@ public class ChannelServiceBean implements ChannelService { sendTextToChannel(text, channel); } + @Override + public CompletableFuture createThreadChannel(IThreadContainer threadContainer, String name) { + return threadContainer.createThreadChannel(name).submit(); + } + + @Override + public CompletableFuture createThreadChannel(IThreadContainer threadContainer, String name, Long messageId) { + return threadContainer.createThreadChannel(name, messageId).submit(); + } + @Override public CompletableFuture sendTextToAChannel(String text, AChannel channel) { GuildMessageChannel guildMessageChannel = getGuildMessageChannelFromAChannel(channel); diff --git a/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/service/ChannelService.java b/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/service/ChannelService.java index b9e9b45d2..ce18f1628 100644 --- a/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/service/ChannelService.java +++ b/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/service/ChannelService.java @@ -5,6 +5,7 @@ import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.templating.model.MessageToSend; import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.entities.*; +import net.dv8tion.jda.api.entities.channel.attribute.IThreadContainer; import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel; import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel; @@ -20,6 +21,8 @@ import java.util.concurrent.CompletableFuture; public interface ChannelService { void sendTextToAChannelNotAsync(String text, AChannel channel); void sendTextToChannelNotAsync(String text, MessageChannel channel); + CompletableFuture createThreadChannel(IThreadContainer threadContainer, String name); + CompletableFuture createThreadChannel(IThreadContainer threadContainer, String name, Long messageId); CompletableFuture sendTextToAChannel(String text, AChannel channel); CompletableFuture sendMessageToAChannel(Message message, AChannel channel); CompletableFuture sendMessageToChannel(Message message, GuildMessageChannel channel);