Skip to content

Commit c00e0a9

Browse files
Continued to work on refactoring the QOTW System
1 parent 102a287 commit c00e0a9

File tree

7 files changed

+99
-146
lines changed

7 files changed

+99
-146
lines changed

src/main/java/net/javadiscord/javabot/systems/commands/LeaderboardCommand.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public ReplyCallbackAction handleSlashCommandInteraction(SlashCommandInteraction
6565
* @param guild The current guild.
6666
* @return The QOTW-Rank as an integer.
6767
*/
68-
public int getQOTWRank(Member member, Guild guild) {
68+
public static int getQOTWRank(Member member, Guild guild) {
6969
try (var con = Bot.dataSource.getConnection()) {
7070
var repo = new QuestionPointsRepository(con);
7171
var accounts = repo.getAllAccountsSortedByPoints();

src/main/java/net/javadiscord/javabot/systems/qotw/subcommands/qotw_points/IncrementSubcommand.java

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package net.javadiscord.javabot.systems.qotw.subcommands.qotw_points;
22

33
import net.dv8tion.jda.api.EmbedBuilder;
4+
import net.dv8tion.jda.api.entities.Guild;
45
import net.dv8tion.jda.api.entities.Member;
56
import net.dv8tion.jda.api.entities.MessageEmbed;
7+
import net.dv8tion.jda.api.entities.User;
68
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
79
import net.dv8tion.jda.api.requests.restaction.interactions.ReplyCallbackAction;
810
import net.javadiscord.javabot.Bot;
@@ -18,6 +20,7 @@
1820
/**
1921
* Subcommand that allows staff-members to increment the QOTW-Account of any user.
2022
*/
23+
//TODO: refactor this whole thing
2124
public class IncrementSubcommand implements SlashCommand {
2225

2326
/**
@@ -27,8 +30,8 @@ public class IncrementSubcommand implements SlashCommand {
2730
* @param quiet If true, don't send a message in the channel.
2831
* @return The new amount of QOTW-Points.
2932
*/
30-
public static long correct(Member member, boolean quiet) {
31-
return correct(member, quiet, false);
33+
public static long correct(User user, Guild guild, boolean quiet) {
34+
return correct(user, guild, quiet, false);
3235
}
3336

3437
/**
@@ -39,18 +42,16 @@ public static long correct(Member member, boolean quiet) {
3942
* @param bestAnswer Whether it should send the Best Answer Embed instead.
4043
* @return The new amount of QOTW-Points.
4144
*/
42-
public static long correct(Member member, boolean quiet, boolean bestAnswer) {
45+
public static long correct(User user, Guild guild, boolean quiet, boolean bestAnswer) {
4346
try (var con = Bot.dataSource.getConnection()) {
4447
QuestionPointsRepository repo = new QuestionPointsRepository(con);
45-
long memberId = member.getIdLong();
46-
repo.increment(memberId);
47-
long points = repo.getAccountByUserId(memberId).getPoints();
48-
MessageEmbed dmEmbed = bestAnswer ? buildBestAnswerDmEmbed(member, points) : buildIncrementDmEmbed(member, points);
49-
MessageEmbed embed = buildIncrementEmbed(member, points);
50-
if (!quiet) GuildUtils.getLogChannel(member.getGuild()).sendMessageEmbeds(embed).queue();
51-
member.getUser().openPrivateChannel().queue(
48+
long points = repo.increment(user.getIdLong());
49+
MessageEmbed dmEmbed = bestAnswer ? buildBestAnswerDmEmbed(user, guild, points) : buildIncrementDmEmbed(user, guild, points);
50+
MessageEmbed embed = buildIncrementEmbed(user, guild, points);
51+
if (!quiet) GuildUtils.getLogChannel(guild).sendMessageEmbeds(embed).queue();
52+
user.openPrivateChannel().queue(
5253
c -> c.sendMessageEmbeds(dmEmbed).queue(),
53-
e -> GuildUtils.getLogChannel(member.getGuild()).sendMessage("Could not send direct message to member " + member.getAsMention()).queue());
54+
e -> GuildUtils.getLogChannel(guild).sendMessage("Could not send direct message to member " + user.getAsMention()).queue());
5455
return points;
5556
} catch (SQLException e) {
5657
e.printStackTrace();
@@ -64,31 +65,31 @@ public ReplyCallbackAction handleSlashCommandInteraction(SlashCommandInteraction
6465
if (memberOption == null) {
6566
return Responses.error(event, "Missing required arguments.");
6667
}
67-
Member member = memberOption.getAsMember();
68-
long points = correct(member, false);
69-
MessageEmbed embed = buildIncrementEmbed(member, points);
68+
User user = memberOption.getAsUser();
69+
long points = correct(user, false);
70+
MessageEmbed embed = buildIncrementEmbed(user, points);
7071
return event.replyEmbeds(embed);
7172
}
7273

73-
private static MessageEmbed buildIncrementDmEmbed(Member member, long points) {
74+
private static MessageEmbed buildIncrementDmEmbed(User user, Guild guild, long points) {
7475
return new EmbedBuilder()
75-
.setAuthor(member.getUser().getAsTag(), null, member.getUser().getEffectiveAvatarUrl())
76+
.setAuthor(user.getAsTag(), null, user.getEffectiveAvatarUrl())
7677
.setTitle("QOTW Notification")
77-
.setColor(Bot.config.get(member.getGuild()).getSlashCommand().getSuccessColor())
78+
.setColor(Bot.config.get(guild).getSlashCommand().getSuccessColor())
7879
.setDescription(String.format(
7980
"""
8081
Your submission was accepted! %s
8182
You've been granted **`1 QOTW-Point`**! (total: %s)""",
82-
Bot.config.get(member.getGuild()).getEmote().getSuccessEmote().getAsMention(), points))
83+
Bot.config.get(guild).getEmote().getSuccessEmote().getAsMention(), points))
8384
.setTimestamp(Instant.now())
8485
.build();
8586
}
8687

87-
private static MessageEmbed buildBestAnswerDmEmbed(Member member, long points) {
88+
private static MessageEmbed buildBestAnswerDmEmbed(User user, Guild guild, long points) {
8889
return new EmbedBuilder()
89-
.setAuthor(member.getUser().getAsTag(), null, member.getUser().getEffectiveAvatarUrl())
90+
.setAuthor(user.getAsTag(), null, user.getEffectiveAvatarUrl())
9091
.setTitle("QOTW Notification")
91-
.setColor(Bot.config.get(member.getGuild()).getSlashCommand().getSuccessColor())
92+
.setColor(Bot.config.get(guild).getSlashCommand().getSuccessColor())
9293
.setDescription(String.format(
9394
"""
9495
Your submission was marked as the best answer!
@@ -97,13 +98,13 @@ private static MessageEmbed buildBestAnswerDmEmbed(Member member, long points) {
9798
.build();
9899
}
99100

100-
private static MessageEmbed buildIncrementEmbed(Member member, long points) {
101+
private static MessageEmbed buildIncrementEmbed(User user, Guild guild, long points) {
101102
return new EmbedBuilder()
102-
.setAuthor(member.getUser().getAsTag() + " | QOTW-Point added", null, member.getUser().getEffectiveAvatarUrl())
103-
.setColor(Bot.config.get(member.getGuild()).getSlashCommand().getSuccessColor())
103+
.setAuthor(user.getAsTag() + " | QOTW-Point added", null, user.getEffectiveAvatarUrl())
104+
.setColor(Bot.config.get(guild).getSlashCommand().getSuccessColor())
104105
.addField("Total QOTW-Points", "```" + points + "```", true)
105-
.addField("Rank", "```#" + new LeaderboardCommand().getQOTWRank(member, member.getGuild()) + "```", true)
106-
.setFooter("ID: " + member.getId())
106+
.addField("Rank", "```#" + LeaderboardCommand.getQOTWRank(user, guild) + "```", true)
107+
.setFooter("ID: " + user.getId())
107108
.setTimestamp(Instant.now())
108109
.build();
109110
}

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

Lines changed: 39 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,16 @@ public void sendControls() {
8383
if (thread == null) return;
8484
thread.getManager().setName(String.format("%s %s", SUBMISSION_PENDING, thread.getName())).queue();
8585
thread.sendMessage(config.getQOTWReviewRole().getAsMention())
86-
.setEmbeds(this.buildSubmissionControlEmbed())
87-
.setActionRows(this.buildInteractionControls()).queue();
86+
.setEmbeds(new EmbedBuilder()
87+
.setTitle("Submission Controls")
88+
.setDescription("Please choose an action for this Submission.")
89+
.setTimestamp(Instant.now())
90+
.build())
91+
.setActionRow(
92+
Button.success("qotw-submission:controls:accept", "Accept"),
93+
Button.danger("qotw-submission:controls:decline", "Decline"),
94+
Button.secondary("qotw-submission:controls:delete", "🗑️")
95+
).queue();
8896
this.removeThreadOwner(thread.getJDA(), thread);
8997
log.info("Sent Submission Controls to thread {}", thread.getName());
9098

@@ -106,27 +114,16 @@ private void removeThreadOwner(JDA jda, ThreadChannel thread) {
106114
* @param thread The submission's {@link ThreadChannel}.
107115
*/
108116
protected void acceptSubmission(ButtonInteractionEvent event, ThreadChannel thread) {
109-
DbHelper.doDaoAction(QOTWSubmissionRepository::new, dao -> {
110-
Optional<QOTWSubmission> submissionOptional = dao.getSubmissionByThreadId(thread.getIdLong());
111-
if (submissionOptional.isEmpty()) return;
112-
QOTWSubmission submission = submissionOptional.get();
113-
dao.markReviewed(submission);
114-
dao.markAccepted(submission);
115-
event.getGuild().retrieveMemberById(submission.getAuthorId()).queue(
116-
member -> {
117-
if (member == null) {
118-
Responses.error(event.getHook(), "Cannot accept a submission of a user who is not a member of this server");
119-
return;
120-
}
121-
IncrementSubcommand.correct(member, true);
122-
thread.getManager().setName(SUBMISSION_ACCEPTED + thread.getName().substring(1)).queueAfter(5, TimeUnit.SECONDS);
123-
log.info("{} accepted {}'s submission", event.getUser().getAsTag(), member.getUser().getAsTag());
124-
GuildUtils.getLogChannel(event.getGuild()).sendMessageFormat("%s\n%s accepted %s's submission", thread.getAsMention(), event.getUser().getAsTag(), member.getUser().getAsTag()).queue();
125-
this.disableControls(String.format("Accepted by %s", event.getUser().getAsTag()), event.getMessage());
126-
Responses.success(event.getHook(), "Submission Accepted", "Successfully accepted submission by " + member.getAsMention()).queue();
127-
}
128-
);
129-
});
117+
DbHelper.doDaoAction(QOTWSubmissionRepository::new, dao -> dao.updateStatus(thread.getIdLong(), SubmissionStatus.ACCEPTED));
118+
thread.getManager().setName(SUBMISSION_ACCEPTED + thread.getName().substring(1)).queue();
119+
event.getJDA().retrieveUserById(submission.getAuthorId()).queue(user -> {
120+
IncrementSubcommand.correct(user, true);
121+
Responses.success(event.getHook(), "Submission Accepted",
122+
"Successfully accepted submission by " + user.getAsMention()).queue();
123+
}
124+
);
125+
this.disableControls(String.format("Accepted by %s", event.getUser().getAsTag()), event.getMessage());
126+
this.sendLogMessage(thread, event.getUser(), SubmissionStatus.ACCEPTED, null);
130127
}
131128

132129
/**
@@ -137,27 +134,16 @@ protected void acceptSubmission(ButtonInteractionEvent event, ThreadChannel thre
137134
*/
138135
protected void declineSelectSubmission(SelectMenuInteractionEvent event, ThreadChannel thread) {
139136
String reasons = String.join(", ", event.getValues());
140-
DbHelper.doDaoAction(QOTWSubmissionRepository::new, dao -> {
141-
Optional<QOTWSubmission> submissionOptional = dao.getSubmissionByThreadId(thread.getIdLong());
142-
if (submissionOptional.isEmpty()) return;
143-
QOTWSubmission submission = submissionOptional.get();
144-
dao.markReviewed(submission);
145-
event.getGuild().retrieveMemberById(submission.getAuthorId()).queue(
146-
member -> {
147-
if (member == null) {
148-
Responses.error(event.getHook(), "Cannot accept a submission of a user who is not a member of this server");
149-
return;
150-
}
151-
member.getUser().openPrivateChannel().queue(c -> c.sendMessageEmbeds(buildSubmissionDeclinedEmbed(member.getUser(), reasons)).queue());
152-
thread.getManager().setName(SUBMISSION_DECLINED + thread.getName().substring(1)).queueAfter(5, TimeUnit.SECONDS);
153-
log.info("{} declined {}'s submission for: {}", event.getUser().getAsTag(), member.getUser().getAsTag(), reasons);
154-
GuildUtils.getLogChannel(event.getGuild()).sendMessageFormat("%s\n%s declined %s's submission for: `%s`", thread.getAsMention(), event.getUser().getAsTag(), member.getUser().getAsTag(), reasons).queue();
155-
this.disableControls(String.format("Declined by %s", event.getUser().getAsTag()), event.getMessage());
156-
Responses.success(event.getHook(), "Submission Declined",
157-
String.format("Successfully declined submission by %s for the following reasons:\n`%s`", member.getAsMention(), reasons)).queue();
158-
}
159-
);
160-
});
137+
DbHelper.doDaoAction(QOTWSubmissionRepository::new, dao -> dao.updateStatus(thread.getIdLong(), SubmissionStatus.DECLINED));
138+
thread.getManager().setName(SUBMISSION_DECLINED + thread.getName().substring(1)).queue();
139+
event.getJDA().retrieveUserById(submission.getAuthorId()).queue(user -> {
140+
user.openPrivateChannel().queue(c -> c.sendMessageEmbeds(this.buildSubmissionDeclinedEmbed(user, reasons)).queue());
141+
Responses.success(event.getHook(), "Submission Declined",
142+
String.format("Successfully declined submission by %s for the following reasons:\n`%s`", user.getAsMention(), reasons)).queue();
143+
}
144+
);
145+
this.disableControls(String.format("Declined by %s", event.getUser().getAsTag()), event.getMessage());
146+
this.sendLogMessage(thread, event.getUser(), SubmissionStatus.DECLINED, reasons);
161147
}
162148

163149
/**
@@ -167,26 +153,23 @@ protected void declineSelectSubmission(SelectMenuInteractionEvent event, ThreadC
167153
* @param thread The submission's {@link ThreadChannel}.
168154
*/
169155
protected void deleteSubmission(ButtonInteractionEvent event, ThreadChannel thread) {
170-
thread.delete().queueAfter(10, TimeUnit.SECONDS);
171-
log.info("{} deleted submission thread {}", event.getUser().getAsTag(), thread.getName());
172-
this.sendLogMessage(event.getGuild(), thread, event.getUser(), SubmissionStatus.DELETED, null);
173-
this.disableControls(String.format("Deleted by %s", event.getUser().getAsTag()), event.getMessage());
174-
DbHelper.doDaoAction(QOTWSubmissionRepository::new, dao -> dao.removeSubmission(thread.getIdLong()));
156+
DbHelper.doDaoAction(QOTWSubmissionRepository::new, dao -> dao.deleteSubmission(thread.getIdLong()));
175157
event.getHook().sendMessage("This Submission will be deleted in 10 seconds.").setEphemeral(true).queue();
158+
this.disableControls(String.format("Deleted by %s", event.getUser().getAsTag()), event.getMessage());
159+
this.sendLogMessage(thread, event.getUser(), SubmissionStatus.DELETED, null);
160+
thread.delete().queueAfter(10, TimeUnit.SECONDS);
176161
}
177162

178-
private void sendLogMessage(Guild guild, ThreadChannel thread, User reviewedBy, SubmissionStatus status, @Nullable String reason) {
163+
private void sendLogMessage(ThreadChannel thread, User reviewedBy, SubmissionStatus status, @Nullable String reason) {
179164
DbHelper.doDaoAction(QOTWSubmissionRepository::new, dao -> {
180165
Optional<QOTWSubmission> submissionOptional = dao.getSubmissionByThreadId(thread.getIdLong());
181-
submissionOptional.ifPresent(submission -> guild.getJDA().retrieveUserById(submission.getAuthorId()).queue(author ->
182-
GuildUtils.getLogChannel(guild).sendMessageEmbeds(this.buildLogEmbed(thread, author, reviewedBy, status, reason)).queue()));
166+
submissionOptional.ifPresent(submission -> guild.getJDA().retrieveUserById(submission.getAuthorId()).queue(author -> {
167+
GuildUtils.getLogChannel(guild).sendMessageEmbeds(this.buildLogEmbed(thread, author, reviewedBy, status, reason)).queue();
168+
log.info("{} {} {}'s QOTW Submission{}", reviewedBy.getAsTag(), status.name().toLowerCase(), author.getAsTag(), reason != null ? " for: " + reason : ".");
169+
}));
183170
});
184171
}
185172

186-
protected void declineButtonSubmission(ButtonInteractionEvent event) {
187-
event.getMessage().editMessageComponents(ActionRow.of(this.buildDeclineMenu())).queue();
188-
}
189-
190173
private void disableControls(String buttonLabel, Message message) {
191174
message.editMessageComponents(ActionRow.of(Button.secondary("qotw-submission:controls:dummy", buttonLabel).asDisabled())).queue();
192175
}
@@ -207,32 +190,6 @@ private MessageEmbed buildSubmissionDeclinedEmbed(User createdBy, String reasons
207190
.build();
208191
}
209192

210-
private List<ActionRow> buildInteractionControls() {
211-
return List.of(ActionRow.of(
212-
Button.success("qotw-submission:controls:accept", "Accept"),
213-
Button.danger("qotw-submission:controls:decline", "Decline"),
214-
Button.secondary("qotw-submission:controls:delete", "🗑️")));
215-
216-
}
217-
218-
private SelectMenu buildDeclineMenu() {
219-
return SelectMenu.create("qotw-submission-select:decline")
220-
.setPlaceholder("Select a reason for declining this submission.")
221-
.setRequiredRange(1, 3)
222-
.addOption("Wrong Answer", "Wrong Answer", "The content of the submission was not correct.")
223-
.addOption("Incomplete Answer", "Incomplete Answer", "The submission was missing some important things and was overall incomplete.")
224-
.addOption("Too short", "Too short", "The submission was way too short in comparison to other submissions.")
225-
.build();
226-
}
227-
228-
private MessageEmbed buildSubmissionControlEmbed() {
229-
return new EmbedBuilder()
230-
.setTitle("Submission Controls")
231-
.setDescription("Please choose an action for this Submission.")
232-
.setTimestamp(Instant.now())
233-
.build();
234-
}
235-
236193
private MessageEmbed buildLogEmbed(ThreadChannel thread, User threadOwner, User reviewedBy, SubmissionStatus status, @Nullable String reason) {
237194
EmbedBuilder builder = new EmbedBuilder()
238195
.setAuthor(reviewedBy.getAsTag(), null, reviewedBy.getEffectiveAvatarUrl())

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@
44
import net.dv8tion.jda.api.entities.ThreadChannel;
55
import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent;
66
import net.dv8tion.jda.api.events.interaction.component.SelectMenuInteractionEvent;
7+
import net.dv8tion.jda.api.interactions.components.ActionRow;
8+
import net.dv8tion.jda.api.interactions.components.selections.SelectMenu;
79
import net.javadiscord.javabot.Bot;
810
import net.javadiscord.javabot.command.Responses;
911
import net.javadiscord.javabot.data.config.guild.QOTWConfig;
10-
import net.javadiscord.javabot.util.GuildUtils;
1112

1213
/**
1314
* Handles all interactions regarding the QOTW Submission System.
@@ -51,7 +52,7 @@ public static void handleControlButtons(String[] id, ButtonInteractionEvent even
5152
ThreadChannel thread = (ThreadChannel) event.getGuildChannel();
5253
switch (id[2]) {
5354
case "accept" -> manager.acceptSubmission(event, thread);
54-
case "decline" -> manager.declineButtonSubmission(event);
55+
case "decline" -> event.getMessage().editMessageComponents(ActionRow.of(buildDeclineMenu())).queue();
5556
case "delete" -> manager.deleteSubmission(event, thread);
5657
default -> Responses.error(event.getHook(), "Unknown Interaction").queue();
5758
}
@@ -85,4 +86,14 @@ private static boolean hasPermissions(Member member) {
8586
QOTWConfig config = Bot.config.get(member.getGuild()).getQotw();
8687
return !member.getRoles().isEmpty() && member.getRoles().contains(config.getQOTWReviewRole());
8788
}
89+
90+
private static SelectMenu buildDeclineMenu() {
91+
return SelectMenu.create("qotw-submission-select:decline")
92+
.setPlaceholder("Select a reason for declining this submission.")
93+
.setRequiredRange(1, 3)
94+
.addOption("Wrong Answer", "Wrong Answer", "The content of the submission was not correct.")
95+
.addOption("Incomplete Answer", "Incomplete Answer", "The submission was missing some important things and was overall incomplete.")
96+
.addOption("Too short", "Too short", "The submission was way too short in comparison to other submissions.")
97+
.build();
98+
}
8899
}

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
import java.sql.SQLException;
2424
import java.time.Instant;
25+
import java.util.Optional;
2526

2627
/**
2728
* Handles & manages QOTW Submissions by using Discords {@link ThreadChannel}s.
@@ -90,13 +91,13 @@ public WebhookMessageAction<?> handleSubmission(ButtonInteractionEvent event, in
9091
public void handleThreadDeletion(ButtonInteractionEvent event) {
9192
ThreadChannel thread = (ThreadChannel) event.getGuildChannel();
9293
DbHelper.doDaoAction(QOTWSubmissionRepository::new, dao -> {
93-
var submissionOptional = dao.getSubmissionByThreadId(thread.getIdLong());
94+
Optional<QOTWSubmission> submissionOptional = dao.getSubmissionByThreadId(thread.getIdLong());
9495
if (submissionOptional.isPresent()) {
95-
var submission = submissionOptional.get();
96+
QOTWSubmission submission = submissionOptional.get();
9697
if (submission.getAuthorId() != event.getMember().getIdLong()) {
9798
return;
9899
}
99-
dao.removeSubmission(thread.getIdLong());
100+
dao.deleteSubmission(thread.getIdLong());
100101
thread.delete().queue();
101102
}
102103
});

0 commit comments

Comments
 (0)