Skip to content

Commit 892b673

Browse files
author
Dynxsty
authored
Merge pull request #191 from Java-Discord/dynxsty/h2-submissions
Moved QOTW Submissions to H2 Database
2 parents d7c32d9 + d2046be commit 892b673

11 files changed

Lines changed: 602 additions & 304 deletions

File tree

‎src/main/java/net/javadiscord/javabot/events/InteractionListener.java‎

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,48 @@
22

33
import lombok.extern.slf4j.Slf4j;
44
import net.dv8tion.jda.api.entities.Role;
5+
import net.dv8tion.jda.api.entities.ThreadChannel;
56
import net.dv8tion.jda.api.events.interaction.ButtonClickEvent;
67
import net.dv8tion.jda.api.events.interaction.SelectionMenuEvent;
78
import net.dv8tion.jda.api.hooks.ListenerAdapter;
89
import net.javadiscord.javabot.Bot;
10+
import net.javadiscord.javabot.command.Responses;
911
import net.javadiscord.javabot.systems.help.HelpChannelInteractionManager;
1012
import net.javadiscord.javabot.systems.moderation.ModerationService;
11-
import net.javadiscord.javabot.systems.qotw.SubmissionManager;
13+
import net.javadiscord.javabot.systems.qotw.submissions.SubmissionControlsManager;
14+
import net.javadiscord.javabot.systems.qotw.submissions.SubmissionManager;
15+
import net.javadiscord.javabot.systems.qotw.submissions.dao.QOTWSubmissionRepository;
16+
17+
import java.sql.SQLException;
1218

1319
/**
1420
* Listens for Interaction Events and handles them.
1521
*/
1622
@Slf4j
1723
public class InteractionListener extends ListenerAdapter {
24+
// TODO: add Context-Menu Commands (once they're available in JDA)
1825

1926
@Override
2027
public void onSelectionMenu(SelectionMenuEvent event) {
2128
if (event.getUser().isBot()) return;
2229
event.deferEdit().queue();
30+
String[] id = event.getComponentId().split(":");
2331
var config = Bot.config.get(event.getGuild());
24-
if (event.getComponentId().equals("submission-controls:decline")) {
25-
new SubmissionManager(config.getQotw()).handleSubmissionControlSelectInteraction(event.getComponentId(), event).queue();
32+
switch (id[0]) {
33+
case "submission-controls-select" -> {
34+
var thread = (ThreadChannel) event.getGuildChannel();
35+
try (var con = Bot.dataSource.getConnection()) {
36+
var repo = new QOTWSubmissionRepository(con);
37+
var submissionOptional = repo.getSubmissionByThreadId(thread.getIdLong());
38+
submissionOptional.ifPresent(qotwSubmission -> new SubmissionControlsManager(event.getGuild(), config.getQotw(), qotwSubmission).handleSelectMenus(id, event));
39+
} catch (SQLException e) {
40+
e.printStackTrace();
41+
}
42+
}
43+
default -> Responses.error(event.getHook(), "Unknown Interaction").queue();
2644
}
2745
}
2846

29-
// TODO: add Context-Menu Commands (once they're available in JDA)
30-
// TODO: Clean up button ids. "qotw-submission" & "qotw-submission-delete" is just a temporary solution.
3147
@Override
3248
public void onButtonClick(ButtonClickEvent event) {
3349
if (event.getUser().isBot()) return;
@@ -38,27 +54,35 @@ public void onButtonClick(ButtonClickEvent event) {
3854
case "qotw-submission" -> {
3955
var manager = new SubmissionManager(config.getQotw());
4056
if (!id[1].isEmpty() && id[1].equals("delete")) manager.handleThreadDeletion(event);
41-
else manager.handleSubmission(event, Long.parseLong(id[1])).queue();
57+
else manager.handleSubmission(event, Integer.parseInt(id[1])).queue();
58+
}
59+
case "submission-controls" -> {
60+
var thread = (ThreadChannel) event.getGuildChannel();
61+
try (var con = Bot.dataSource.getConnection()) {
62+
var repo = new QOTWSubmissionRepository(con);
63+
var submissionOptional = repo.getSubmissionByThreadId(thread.getIdLong());
64+
submissionOptional.ifPresent(qotwSubmission -> new SubmissionControlsManager(event.getGuild(), config.getQotw(), qotwSubmission).handleButtons(id, event));
65+
} catch (SQLException e) {
66+
e.printStackTrace();
67+
}
4268
}
43-
case "submission-controls" -> new SubmissionManager(config.getQotw()).handleSubmissionControlButtonInteractions(id, event).queue();
44-
// Deprecated: Remove this next week
45-
case "qotw-submission-delete" -> new SubmissionManager(config.getQotw()).handleThreadDeletion(event);
46-
case "reaction-role" -> this.handleReactionRoles(event);
69+
case "reaction-role" -> this.handleReactionRoles(id, event);
4770
case "help-channel" -> new HelpChannelInteractionManager().handleHelpChannel(event, id[1], id[2]);
4871
case "help-thank" -> new HelpChannelInteractionManager().handleHelpThank(event, id[1], id[2]);
49-
case "utils" -> this.handleUtils(event);
72+
case "utils" -> this.handleUtils(id, event);
73+
default -> Responses.error(event.getHook(), "Unknown Interaction").queue();
5074
}
5175
}
5276

5377
/**
5478
* Some utility methods for interactions.
5579
* + May be useful for Context Menu Interactions.
5680
*
81+
* @param id The button's id, split by ":".
5782
* @param event The {@link ButtonClickEvent} that is fired upon use.
5883
*/
59-
private void handleUtils(ButtonClickEvent event) {
84+
private void handleUtils(String[] id, ButtonClickEvent event) {
6085
var service = new ModerationService(event.getInteraction());
61-
String[] id = event.getComponentId().split(":");
6286
switch (id[1]) {
6387
case "delete" -> event.getHook().deleteOriginal().queue();
6488
case "kick" -> service.kick(
@@ -81,8 +105,7 @@ private void handleUtils(ButtonClickEvent event) {
81105
}
82106
}
83107

84-
private void handleReactionRoles(ButtonClickEvent event) {
85-
String[] id = event.getComponentId().split(":");
108+
private void handleReactionRoles(String[] id, ButtonClickEvent event) {
86109
String roleID = id[1];
87110
boolean permanent = Boolean.parseBoolean(id[2]);
88111

Lines changed: 12 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,26 @@
11
package net.javadiscord.javabot.systems.qotw;
22

33
import lombok.extern.slf4j.Slf4j;
4-
import net.dv8tion.jda.api.EmbedBuilder;
54
import net.dv8tion.jda.api.JDA;
65
import net.dv8tion.jda.api.entities.Message;
76
import net.dv8tion.jda.api.entities.MessageChannel;
8-
import net.dv8tion.jda.api.entities.MessageEmbed;
97
import net.dv8tion.jda.api.interactions.components.ActionRow;
108
import net.dv8tion.jda.api.interactions.components.Button;
11-
import net.dv8tion.jda.api.interactions.components.selections.SelectionMenu;
129
import net.javadiscord.javabot.Bot;
1310
import net.javadiscord.javabot.data.config.guild.QOTWConfig;
11+
import net.javadiscord.javabot.systems.qotw.submissions.SubmissionControlsManager;
12+
import net.javadiscord.javabot.systems.qotw.submissions.dao.QOTWSubmissionRepository;
1413
import net.javadiscord.javabot.tasks.jobs.DiscordApiJob;
1514
import org.quartz.JobExecutionContext;
1615
import org.quartz.JobExecutionException;
1716

18-
import java.time.Instant;
17+
import java.sql.SQLException;
1918

2019
/**
2120
* Job which disables the Submission button.
2221
*/
2322
@Slf4j
2423
public class QOTWCloseSubmissionsJob extends DiscordApiJob {
25-
private final String SUBMISSION_PENDING = "\uD83D\uDD52";
26-
2724
@Override
2825
protected void execute(JobExecutionContext context, JDA jda) throws JobExecutionException {
2926
for (var guild : jda.getGuilds()) {
@@ -34,41 +31,20 @@ protected void execute(JobExecutionContext context, JDA jda) throws JobExecution
3431
if (qotwConfig.getSubmissionChannel() == null || qotwConfig.getQuestionChannel() == null) continue;
3532
var message = getLatestQOTWMessage(qotwConfig.getQuestionChannel(), qotwConfig, jda);
3633
if (message == null) continue;
37-
message.editMessageComponents(
38-
ActionRow.of(Button.secondary("qotw-submission:closed", "Submissions closed").asDisabled()))
39-
.queue();
40-
var manager = new SubmissionManager(qotwConfig);
41-
// Remove Thread Owners and send Submission Controls
34+
message.editMessageComponents(ActionRow.of(Button.secondary("qotw-submission:closed", "Submissions closed").asDisabled())).queue();
4235
for (var thread : qotwConfig.getSubmissionChannel().getThreadChannels()) {
43-
var ownerId = manager.getSubmissionThreadOwner(thread).getId();
44-
thread.getThreadMembers()
45-
.stream()
46-
.filter(m -> !m.getMember().getRoles().contains(qotwConfig.getQOTWReviewRole()) && !m.getMember().getUser().isBot())
47-
.forEach(m -> thread.removeThreadMember(m.getUser()).queue());
48-
thread.getManager().setName(String.format("%s %s", SUBMISSION_PENDING, thread.getName())).queue();
49-
// Build Submission Controls Embed
50-
thread.sendMessage(qotwConfig.getQOTWReviewRole().getAsMention())
51-
.setEmbeds(buildSubmissionControlEmbed(qotwConfig))
52-
.setActionRows(ActionRow.of(
53-
Button.success("submission-controls:accept:" + ownerId, "Accept"),
54-
Button.secondary("submission-controls:delete","🗑️")
55-
), ActionRow.of(buildDeclineMenu())).queue();
56-
log.info("Sent Submission Controls to thread {}", thread.getName());
36+
try (var con = Bot.dataSource.getConnection()) {
37+
var repo = new QOTWSubmissionRepository(con);
38+
var optionalSubmission = repo.getSubmissionByThreadId(thread.getIdLong());
39+
if (optionalSubmission.isEmpty()) continue;
40+
new SubmissionControlsManager(thread.getGuild(), qotwConfig, optionalSubmission.get()).sendSubmissionControls();
41+
} catch (SQLException e) {
42+
throw new JobExecutionException(e);
43+
}
5744
}
5845
}
5946
}
6047

61-
private SelectionMenu buildDeclineMenu() {
62-
return SelectionMenu.create("submission-controls:decline")
63-
.setPlaceholder("Select a reason for declining this submission.")
64-
.setMinValues(1)
65-
.setMaxValues(3)
66-
.addOption("Wrong Answer", "Wrong Answer", "The content of the submission was not correct.")
67-
.addOption("Incomplete Answer", "Incomplete Answer", "The submission was missing some important things and was overall incomplete.")
68-
.addOption("Too short", "Too short", "The submission was way too short in comparison to other submissions.")
69-
.build();
70-
}
71-
7248
private Message getLatestQOTWMessage(MessageChannel channel, QOTWConfig config, JDA jda) {
7349
var history = channel.getHistory();
7450
Message message = null;
@@ -83,13 +59,4 @@ private Message getLatestQOTWMessage(MessageChannel channel, QOTWConfig config,
8359
}
8460
return message;
8561
}
86-
87-
private MessageEmbed buildSubmissionControlEmbed(QOTWConfig config) {
88-
return new EmbedBuilder()
89-
.setColor(Bot.config.get(config.getGuild()).getSlashCommand().getDefaultColor())
90-
.setTitle("Submission Controls")
91-
.setDescription("Please choose an action for this Submission.")
92-
.setTimestamp(Instant.now())
93-
.build();
94-
}
9562
}

‎src/main/java/net/javadiscord/javabot/systems/qotw/QOTWJob.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ private MessageEmbed buildEmbed(QOTWQuestion question) {
5858
return new EmbedBuilder()
5959
.setTitle("Question of the Week #" + question.getQuestionNumber())
6060
.setDescription(String.format("%s\n\nClick the button below to submit your answer.\nYour answers will be checked by <t:%d:F>",
61-
question.getText(), checkTime.toEpochSecond()))
61+
question.getText(), checkTime.toEpochSecond()))
6262
.build();
6363
}
6464
}

0 commit comments

Comments
 (0)