11package net .javadiscord .javabot .systems .qotw ;
22
33import lombok .RequiredArgsConstructor ;
4+ import net .dv8tion .jda .api .EmbedBuilder ;
45import net .dv8tion .jda .api .JDA ;
56import net .dv8tion .jda .api .Permission ;
67import net .dv8tion .jda .api .entities .Guild ;
78import net .dv8tion .jda .api .entities .Message ;
9+ import net .dv8tion .jda .api .entities .MessageEmbed ;
810import net .dv8tion .jda .api .entities .MessageHistory ;
11+ import net .dv8tion .jda .api .entities .channel .concrete .ThreadChannel ;
912import net .dv8tion .jda .api .entities .channel .middleman .MessageChannel ;
1013import net .dv8tion .jda .api .interactions .components .ActionRow ;
1114import 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 ;
1217import net .javadiscord .javabot .data .config .BotConfig ;
1318import net .javadiscord .javabot .data .config .GuildConfig ;
1419import net .javadiscord .javabot .data .config .guild .QOTWConfig ;
1520import net .javadiscord .javabot .systems .notification .NotificationService ;
21+ import net .javadiscord .javabot .systems .qotw .dao .QuestionQueueRepository ;
22+ import net .javadiscord .javabot .systems .qotw .model .QOTWQuestion ;
1623import org .jetbrains .annotations .NotNull ;
1724import org .springframework .scheduling .annotation .Scheduled ;
1825import org .springframework .stereotype .Service ;
26+ import org .springframework .util .StringUtils ;
1927
28+ import javax .swing .text .html .Option ;
2029import java .sql .SQLException ;
30+ import java .time .OffsetDateTime ;
2131import java .util .Collections ;
2232import 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
2942public 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 ) {
0 commit comments