Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.entities.channel.concrete.ForumChannel;
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
import net.dv8tion.jda.api.entities.channel.forums.ForumPost;
import net.dv8tion.jda.api.entities.channel.forums.ForumTag;
import net.dv8tion.jda.api.entities.channel.forums.ForumTagSnowflake;
import net.dv8tion.jda.api.entities.channel.unions.MessageChannelUnion;
Expand All @@ -21,6 +22,7 @@
import net.dv8tion.jda.api.interactions.components.text.TextInputStyle;
import net.dv8tion.jda.api.requests.ErrorResponse;
import net.dv8tion.jda.api.requests.RestAction;
import net.dv8tion.jda.api.requests.restaction.WebhookMessageCreateAction;
import net.dv8tion.jda.api.utils.messages.MessageCreateBuilder;
import net.dv8tion.jda.api.utils.messages.MessageCreateData;
import org.slf4j.Logger;
Expand All @@ -37,6 +39,7 @@
import java.util.Objects;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.regex.Pattern;
Expand Down Expand Up @@ -126,13 +129,12 @@ public void onMessageContext(MessageContextInteractionEvent event) {

@Override
public void onModalSubmitted(ModalInteractionEvent event, List<String> args) {
event.deferEdit().queue();
event.deferReply(true).queue();

String authorId = args.get(0);
String messageId = args.get(1);
String channelId = args.get(2);
ForumChannel helperForum = getHelperForum(event.getJDA());
TextChannel sourceChannel = event.getChannel().asTextChannel();

// Has been handled if original message was deleted by now.
// Deleted messages cause retrieveMessageById to fail.
Expand All @@ -142,7 +144,7 @@ public void onModalSubmitted(ModalInteractionEvent event, List<String> args) {
Consumer<Throwable> handledAction = failure -> {
if (failure instanceof ErrorResponseException errorResponseException
&& errorResponseException.getErrorResponse() == ErrorResponse.UNKNOWN_MESSAGE) {
alreadyHandled(sourceChannel, helperForum);
alreadyHandled(event, helperForum);
return;
}
logger.warn("Unknown error occurred on modal submission during question transfer.",
Expand All @@ -154,20 +156,25 @@ public void onModalSubmitted(ModalInteractionEvent event, List<String> args) {

private void transferFlow(ModalInteractionEvent event, String channelId, String authorId,
String messageId) {
Function<ForumPostData, WebhookMessageCreateAction<Message>> sendMessageToTransferrer =
post -> event.getHook()
.sendMessage("Transferred to %s"
.formatted(post.forumPost.getThreadChannel().getAsMention()));

event.getJDA()
.retrieveUserById(authorId)
.flatMap(fetchedUser -> createForumPost(event, fetchedUser))
.flatMap(createdforumPost -> dmUser(event.getChannel(), createdforumPost,
event.getGuild()))
.flatMap(createdForumPost -> dmUser(event.getChannel(), createdForumPost,
event.getGuild()).and(sendMessageToTransferrer.apply(createdForumPost)))
.flatMap(dmSent -> deleteOriginalMessage(event.getJDA(), channelId, messageId))
.queue();
}

private void alreadyHandled(TextChannel sourceChannel, ForumChannel helperForum) {
sourceChannel.sendMessage(
"It appears that someone else has already transferred this question. Kindly see %s for details."
.formatted(helperForum.getAsMention()))
private void alreadyHandled(ModalInteractionEvent event, ForumChannel helperForum) {
event.getHook()
.sendMessage(
"It appears that someone else has already transferred this question. Kindly see %s for details."
.formatted(helperForum.getAsMention()))
.queue();
}

Expand All @@ -192,8 +199,8 @@ private static boolean isTitleValid(CharSequence title) {
&& titleCompact.length() <= TITLE_MAX_LENGTH;
}

private RestAction<ForumPost> createForumPost(ModalInteractionEvent event, User originalUser) {

private RestAction<ForumPostData> createForumPost(ModalInteractionEvent event,
User originalUser) {
String originalMessage = event.getValue(MODAL_INPUT_ID).getAsString();

MessageEmbed embedForPost = makeEmbedForPost(originalUser, originalMessage);
Expand All @@ -217,11 +224,11 @@ private RestAction<ForumPost> createForumPost(ModalInteractionEvent event, User

return questionsForum.createForumPost(forumTitle, forumMessage)
.setTags(ForumTagSnowflake.fromId(tag.getId()))
.map(createdPost -> new ForumPost(originalUser, createdPost.getMessage()));
.map(createdPost -> new ForumPostData(createdPost, originalUser));
}

private RestAction<Message> dmUser(MessageChannelUnion sourceChannel, ForumPost forumPost,
Guild guild) {
private RestAction<Message> dmUser(MessageChannelUnion sourceChannel,
ForumPostData forumPostData, Guild guild) {

String messageTemplate =
"""
Expand All @@ -232,14 +239,14 @@ private RestAction<Message> dmUser(MessageChannelUnion sourceChannel, ForumPost

// Prevents discord from creating a distracting auto-preview for the link
String jumpUrlSuffix = " ";
String postUrl = forumPostData.forumPost().getMessage().getJumpUrl() + jumpUrlSuffix;

String messageForDm = messageTemplate.formatted("", " on " + guild.getName(),
forumPost.message.getJumpUrl() + jumpUrlSuffix);
String messageForDm = messageTemplate.formatted("", " on " + guild.getName(), postUrl);

String messageOnDmFailure = messageTemplate.formatted(" " + forumPost.author.getAsMention(),
"", forumPost.message.getJumpUrl() + jumpUrlSuffix);
String messageOnDmFailure =
messageTemplate.formatted(" " + forumPostData.author.getAsMention(), "", postUrl);

return forumPost.author.openPrivateChannel()
return forumPostData.author.openPrivateChannel()
.flatMap(channel -> channel.sendMessage(messageForDm))
.onErrorFlatMap(error -> sourceChannel.sendMessage(messageOnDmFailure));
}
Expand Down Expand Up @@ -275,7 +282,7 @@ private MessageEmbed makeEmbedForPost(User originalUser, String originalMessage)
.build();
}

private record ForumPost(User author, Message message) {
private record ForumPostData(ForumPost forumPost, User author) {
}

private boolean isBotMessageTransfer(User author) {
Expand Down