Skip to content

Commit 1b423a9

Browse files
authored
Merge pull request #501 from danthe1st/qotw-race
fix QOTW sample answer race condition
2 parents d6fabac + f9add79 commit 1b423a9

File tree

1 file changed

+48
-34
lines changed

1 file changed

+48
-34
lines changed

src/main/java/net/discordjug/javabot/systems/qotw/jobs/QOTWCloseSubmissionsJob.java

Lines changed: 48 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import net.discordjug.javabot.systems.qotw.model.QOTWSubmission;
1313
import net.discordjug.javabot.systems.qotw.submissions.SubmissionManager;
1414
import net.discordjug.javabot.systems.qotw.submissions.SubmissionStatus;
15+
import net.discordjug.javabot.util.ExceptionLogger;
1516
import net.dv8tion.jda.api.EmbedBuilder;
1617
import net.dv8tion.jda.api.JDA;
1718
import net.dv8tion.jda.api.Permission;
@@ -45,6 +46,7 @@
4546
import java.util.Collections;
4647
import java.util.List;
4748
import java.util.Optional;
49+
import java.util.concurrent.CompletableFuture;
4850
import java.util.concurrent.ExecutorService;
4951

5052
/**
@@ -81,46 +83,58 @@ public void execute() throws SQLException {
8183
if (qotwConfig.getSubmissionChannel() == null || qotwConfig.getQuestionChannel() == null) continue;
8284
Message questionMessage = getLatestQOTWMessage(qotwConfig.getQuestionChannel(), qotwConfig, jda);
8385
questionMessage.editMessageComponents(ActionRow.of(Button.secondary("qotw-submission:closed", "Submissions closed").asDisabled())).queue();
84-
logChannel
85-
.sendMessageFormat("%s%nIt's review time! There are **%s** threads to review",
86-
qotwConfig.getQOTWReviewRole().getAsMention(),
87-
qotwConfig.getSubmissionChannel().getThreadChannels().size())
88-
.flatMap(msg -> msg.createThreadChannel("QOTW review"))
89-
.queue(thread -> {
90-
for (ThreadChannel submission : qotwConfig.getSubmissionChannel().getThreadChannels()) {
91-
submission.getManager().setName(SUBMISSION_PENDING + submission.getName()).queue();
92-
// remove the author
93-
final QOTWSubmission s = new QOTWSubmission(submission);
94-
s.retrieveAuthor(author -> {
95-
submission.removeThreadMember(author).queue();
96-
if (author.getIdLong() == qotwConfig.getQotwSampleAnswerUserId()) {
97-
SubmissionManager manager = new SubmissionManager(botConfig.get(guild).getQotwConfig(), pointsService, questionQueueRepository, notificationService, asyncPool);
98-
manager.copySampleAnswerSubmission(submission, author);
99-
} else {
100-
thread
101-
.sendMessage("%s by %s".formatted(submission.getAsMention(), author.getAsMention()))
102-
.addActionRow(buildSubmissionSelectMenu(jda, submission.getIdLong()))
103-
.queue();
104-
}
105-
});
106-
for (Member member : guild.getMembersWithRoles(qotwConfig.getQOTWReviewRole())) {
107-
thread.addThreadMember(member).queue();
86+
if (qotwConfig.getSubmissionsForumChannel() == null) {
87+
sendReviewInformation(guild, qotwConfig, logChannel);
88+
} else {
89+
CompletableFuture.runAsync(() -> {
90+
91+
MessageEmbed embed = questionMessage.getEmbeds().get(0);
92+
Optional<QOTWQuestion> questionOptional = questionQueueRepository.findByQuestionNumber(getQuestionNumberFromEmbed(embed));
93+
if (questionOptional.isPresent()) {
94+
QOTWQuestion question = questionOptional.get();
95+
try (MessageCreateData data = new MessageCreateBuilder()
96+
.setEmbeds(buildQuestionEmbed(question)).build()) {
97+
createPinnedAnswerForum(qotwConfig, question, data);
10898
}
10999
}
100+
}, asyncPool).whenComplete((success, ex) -> {
101+
if (ex != null) {
102+
ExceptionLogger.capture(ex, getClass().getName());
103+
}
104+
sendReviewInformation(guild, qotwConfig, logChannel);
110105
});
111-
if (qotwConfig.getSubmissionsForumChannel() == null) continue;
112-
asyncPool.execute(() -> {
113-
MessageEmbed embed = questionMessage.getEmbeds().get(0);
114-
Optional<QOTWQuestion> questionOptional = questionQueueRepository.findByQuestionNumber(getQuestionNumberFromEmbed(embed));
115-
if (questionOptional.isPresent()) {
116-
QOTWQuestion question = questionOptional.get();
117-
try (MessageCreateData data = new MessageCreateBuilder()
118-
.setEmbeds(buildQuestionEmbed(question)).build()) {
119-
createPinnedAnswerForum(qotwConfig, question, data);
106+
}
107+
}
108+
}
109+
110+
private void sendReviewInformation(Guild guild, QOTWConfig qotwConfig, TextChannel logChannel) {
111+
logChannel
112+
.sendMessageFormat("%s%nIt's review time! There are **%s** threads to review",
113+
qotwConfig.getQOTWReviewRole().getAsMention(),
114+
qotwConfig.getSubmissionChannel().getThreadChannels().size())
115+
.flatMap(msg -> msg.createThreadChannel("QOTW review"))
116+
.queue(thread -> {
117+
for (ThreadChannel submission : qotwConfig.getSubmissionChannel().getThreadChannels()) {
118+
submission.getManager().setName(SUBMISSION_PENDING + submission.getName()).queue();
119+
// remove the author
120+
final QOTWSubmission s = new QOTWSubmission(submission);
121+
s.retrieveAuthor(author -> {
122+
submission.removeThreadMember(author).queue();
123+
if (author.getIdLong() == qotwConfig.getQotwSampleAnswerUserId()) {
124+
SubmissionManager manager = new SubmissionManager(botConfig.get(guild).getQotwConfig(), pointsService, questionQueueRepository, notificationService, asyncPool);
125+
manager.copySampleAnswerSubmission(submission, author);
126+
} else {
127+
thread
128+
.sendMessage("%s by %s".formatted(submission.getAsMention(), author.getAsMention()))
129+
.addActionRow(buildSubmissionSelectMenu(jda, submission.getIdLong()))
130+
.queue();
131+
}
132+
});
133+
for (Member member : guild.getMembersWithRoles(qotwConfig.getQOTWReviewRole())) {
134+
thread.addThreadMember(member).queue();
120135
}
121136
}
122137
});
123-
}
124138
}
125139

126140
private void createPinnedAnswerForum(QOTWConfig qotwConfig, QOTWQuestion question, MessageCreateData data) {

0 commit comments

Comments
 (0)