Skip to content

Commit c7c470e

Browse files
Fully implemented new QOTW-logic
1 parent 8044d71 commit c7c470e

File tree

5 files changed

+76
-29
lines changed

5 files changed

+76
-29
lines changed

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ dependencies {
3131

3232
// DIH4JDA (Command Framework) & JDA
3333
implementation("xyz.dynxsty:dih4jda:1.6.1")
34-
implementation("net.dv8tion:JDA:5.0.0-beta.1") {
34+
implementation("net.dv8tion:JDA:5.0.0-beta.2") {
3535
exclude(module = "opus-java")
3636
}
3737

src/main/java/net/javadiscord/javabot/systems/qotw/QOTWCloseSubmissionsJob.java

Lines changed: 51 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,51 @@
11
package net.javadiscord.javabot.systems.qotw;
22

33
import lombok.RequiredArgsConstructor;
4+
import net.dv8tion.jda.api.EmbedBuilder;
45
import net.dv8tion.jda.api.JDA;
56
import net.dv8tion.jda.api.Permission;
67
import net.dv8tion.jda.api.entities.Guild;
78
import net.dv8tion.jda.api.entities.Message;
9+
import net.dv8tion.jda.api.entities.MessageEmbed;
810
import net.dv8tion.jda.api.entities.MessageHistory;
11+
import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel;
912
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
1013
import net.dv8tion.jda.api.interactions.components.ActionRow;
1114
import net.dv8tion.jda.api.interactions.components.buttons.Button;
15+
import net.dv8tion.jda.api.utils.messages.MessageCreateBuilder;
16+
import net.dv8tion.jda.api.utils.messages.MessageCreateData;
1217
import net.javadiscord.javabot.data.config.BotConfig;
1318
import net.javadiscord.javabot.data.config.GuildConfig;
1419
import net.javadiscord.javabot.data.config.guild.QOTWConfig;
1520
import net.javadiscord.javabot.systems.notification.NotificationService;
21+
import net.javadiscord.javabot.systems.qotw.dao.QuestionQueueRepository;
22+
import net.javadiscord.javabot.systems.qotw.model.QOTWQuestion;
1623
import org.jetbrains.annotations.NotNull;
1724
import org.springframework.scheduling.annotation.Scheduled;
1825
import org.springframework.stereotype.Service;
26+
import org.springframework.util.StringUtils;
1927

28+
import javax.swing.text.html.Option;
2029
import java.sql.SQLException;
30+
import java.time.OffsetDateTime;
2131
import java.util.Collections;
2232
import java.util.List;
33+
import java.util.Optional;
34+
import java.util.concurrent.ExecutorService;
35+
import java.util.stream.Collectors;
2336

2437
/**
2538
* Job which disables the Submission button.
2639
*/
2740
@Service
2841
@RequiredArgsConstructor
2942
public class QOTWCloseSubmissionsJob {
43+
private static final String SUBMISSION_PENDING = "\uD83D\uDD52";
44+
3045
private final JDA jda;
3146
private final NotificationService notificationService;
47+
private final QuestionQueueRepository questionQueueRepository;
48+
private final ExecutorService asyncPool;
3249
private final BotConfig botConfig;
3350

3451
/**
@@ -47,18 +64,45 @@ public void execute() throws SQLException {
4764
.queue();
4865
if (config.getModerationConfig().getLogChannel() == null) continue;
4966
if (qotwConfig.getSubmissionChannel() == null || qotwConfig.getQuestionChannel() == null) continue;
50-
getLatestQOTWMessage(qotwConfig.getQuestionChannel(), qotwConfig, jda)
51-
.editMessageComponents(ActionRow.of(Button.secondary("qotw-submission:closed", "Submissions closed").asDisabled())).queue();
67+
Message questionMessage = getLatestQOTWMessage(qotwConfig.getQuestionChannel(), qotwConfig, jda);
68+
questionMessage.editMessageComponents(ActionRow.of(Button.secondary("qotw-submission:closed", "Submissions closed").asDisabled())).queue();
5269
notificationService.withGuild(guild)
53-
.sendToMessageLog(log ->
54-
log.sendMessageFormat("%s%nIt's review time! There are %s threads to review!",
55-
qotwConfig.getQOTWReviewRole().getAsMention(), countThreads(qotwConfig))
70+
.sendToModerationLog(log ->
71+
log.sendMessageFormat("%s%nIt's review time! There are %s threads to review:\n%s",
72+
qotwConfig.getQOTWReviewRole().getAsMention(),
73+
qotwConfig.getSubmissionChannel().getThreadChannels().size(),
74+
qotwConfig.getSubmissionChannel().getThreadChannels().stream()
75+
.map(ThreadChannel::getAsMention)
76+
.collect(Collectors.joining("\n")))
5677
);
78+
qotwConfig.getSubmissionChannel().getThreadChannels().forEach(t ->
79+
t.getManager().setName(SUBMISSION_PENDING + t.getName()).queue());
80+
if (qotwConfig.getSubmissionsForumChannel() == null) continue;
81+
asyncPool.execute(() -> {
82+
MessageEmbed embed = questionMessage.getEmbeds().get(0);
83+
Optional<QOTWQuestion> questionOptional = questionQueueRepository.findByQuestionNumber(getQuestionNumberFromEmbed(embed));
84+
if (questionOptional.isPresent()) {
85+
QOTWQuestion question = questionOptional.get();
86+
try (MessageCreateData data = new MessageCreateBuilder()
87+
.setEmbeds(buildQuestionEmbed(question)).build()) {
88+
qotwConfig.getSubmissionsForumChannel()
89+
.createForumPost(String.format("#%s — %s", question.getQuestionNumber(), question.getText()), data)
90+
.queue(f -> f.getThreadChannel().getManager().setPinned(true).queue());
91+
}
92+
}
93+
});
5794
}
5895
}
5996

60-
private long countThreads(@NotNull QOTWConfig qotwConfig) {
61-
return qotwConfig.getSubmissionChannel().getThreadChannels().size();
97+
private @NotNull MessageEmbed buildQuestionEmbed(@NotNull QOTWQuestion question) {
98+
return new EmbedBuilder()
99+
.setTitle("Question of the Week #" + question.getQuestionNumber())
100+
.setDescription(question.getText())
101+
.build();
102+
}
103+
104+
private int getQuestionNumberFromEmbed(@NotNull MessageEmbed embed) {
105+
return embed.getTitle() == null ? 0 : Integer.parseInt(embed.getTitle().replaceAll("\\D+", ""));
62106
}
63107

64108
private Message getLatestQOTWMessage(@NotNull MessageChannel channel, QOTWConfig config, JDA jda) {

src/main/java/net/javadiscord/javabot/systems/qotw/model/QOTWSubmission.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public boolean hasAuthor() {
1717

1818
public void retrieveAuthor(Consumer<User> onSuccess) {
1919
thread.retrieveThreadMembers().queue(s -> s.forEach(m -> {
20-
if (!hasAuthor() && !m.getUser().isBot()) {
20+
if (author == null && !m.getUser().isBot()) {
2121
author = m.getUser();
2222
onSuccess.accept(author);
2323
}

src/main/java/net/javadiscord/javabot/systems/qotw/submissions/SubmissionManager.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import net.javadiscord.javabot.systems.qotw.model.QOTWSubmission;
1919
import net.javadiscord.javabot.util.ExceptionLogger;
2020
import net.javadiscord.javabot.util.Responses;
21+
import net.javadiscord.javabot.util.WebhookUtil;
2122
import org.jetbrains.annotations.NotNull;
2223
import org.springframework.dao.DataAccessException;
2324
import org.springframework.transaction.annotation.Transactional;
@@ -39,7 +40,6 @@ public class SubmissionManager {
3940
public static final String THREAD_NAME = "%s — %s";
4041
private static final String SUBMISSION_ACCEPTED = "\u2705";
4142
private static final String SUBMISSION_DECLINED = "\u274C";
42-
private static final String SUBMISSION_PENDING = "\uD83D\uDD52";
4343
private static final Map<Long, QOTWSubmission> submissionCache;
4444

4545
static {
@@ -162,7 +162,17 @@ public void acceptSubmission(InteractionHook hook, @NotNull ThreadChannel thread
162162
Responses.success(hook, "Submission Accepted",
163163
"Successfully accepted submission by " + author.getAsMention()).queue();
164164
notificationService.withQOTW(thread.getGuild()).sendSubmissionActionNotification(author, getOrRetrieveSubmission(thread), bestAnswer ? SubmissionStatus.ACCEPT_BEST : SubmissionStatus.ACCEPT);
165-
// TODO: add forum handling
165+
Optional<ThreadChannel> newestPostOptional = config.getSubmissionsForumChannel().getThreadChannels()
166+
.stream().max(Comparator.comparing(ThreadChannel::getTimeCreated));
167+
if (newestPostOptional.isPresent()) {
168+
ThreadChannel newestPost = newestPostOptional.get();
169+
for (Message message : getSubmissionContent(thread)) {
170+
WebhookUtil.ensureWebhookExists(newestPost.getParentChannel().asStandardGuildMessageChannel(), wh -> {
171+
WebhookUtil.mirrorMessageToWebhook(wh, message, message.getContentRaw(), newestPost.getIdLong());
172+
});
173+
}
174+
}
175+
thread.getManager().setLocked(true).setArchived(true).queue();
166176
}
167177

168178
/**
@@ -178,6 +188,7 @@ public void declineSubmission(InteractionHook hook, @NotNull ThreadChannel threa
178188
notificationService.withQOTW(thread.getGuild(), author).sendSubmissionDeclinedEmbed("EMPTY_REASON");
179189
Responses.success(hook, "Submission Declined", "Successfully declined submission by " + author.getAsMention()).queue();
180190
notificationService.withQOTW(thread.getGuild()).sendSubmissionActionNotification(author, getOrRetrieveSubmission(thread), SubmissionStatus.DECLINE);
191+
thread.getManager().setLocked(true).setArchived(true).queue();
181192
}
182193

183194
private @NotNull List<Message> getSubmissionContent(@NotNull ThreadChannel thread) {

src/main/java/net/javadiscord/javabot/systems/qotw/submissions/subcommands/QOTWReviewSubcommand.java

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import net.javadiscord.javabot.systems.notification.NotificationService;
1515
import net.javadiscord.javabot.systems.qotw.QOTWPointsService;
1616
import net.javadiscord.javabot.systems.qotw.dao.QuestionQueueRepository;
17+
import net.javadiscord.javabot.systems.qotw.model.QOTWSubmission;
1718
import net.javadiscord.javabot.systems.qotw.submissions.SubmissionManager;
1819
import net.javadiscord.javabot.util.Responses;
1920
import org.jetbrains.annotations.NotNull;
@@ -76,23 +77,14 @@ public void execute(@NotNull SlashCommandInteractionEvent event) {
7677
return;
7778
}
7879
event.deferReply().queue();
79-
submissionThread.retrieveThreadMembers().queue(
80-
members -> {
81-
Optional<ThreadMember> authorOptional = members.stream()
82-
.filter(m -> !m.getUser().isBot())
83-
.findFirst();
84-
if (authorOptional.isEmpty()) {
85-
Responses.info(event.getHook(), "Could not find submission author of thread %s", submissionThread.getAsMention()).queue();
86-
return;
87-
}
88-
User author = authorOptional.get().getUser();
89-
SubmissionManager manager = new SubmissionManager(qotwConfig, pointsService, questionQueueRepository, notificationService, asyncPool);
90-
if (state.contains("ACCEPT")) {
91-
manager.acceptSubmission(event.getHook(), submissionThread, author, state.equals("ACCEPT_BEST"));
92-
} else {
93-
manager.declineSubmission(event.getHook(), submissionThread, author);
94-
}
95-
}
96-
);
80+
QOTWSubmission submission = new QOTWSubmission(submissionThread);
81+
submission.retrieveAuthor(author -> {
82+
SubmissionManager manager = new SubmissionManager(qotwConfig, pointsService, questionQueueRepository, notificationService, asyncPool);
83+
if (state.contains("ACCEPT")) {
84+
manager.acceptSubmission(event.getHook(), submissionThread, author, state.equals("ACCEPT_BEST"));
85+
} else {
86+
manager.declineSubmission(event.getHook(), submissionThread, author);
87+
}
88+
});
9789
}
9890
}

0 commit comments

Comments
 (0)