1111
1212import xyz .dynxsty .dih4jda .interactions .commands .application .SlashCommand ;
1313import net .discordjug .javabot .systems .qotw .QOTWPointsService ;
14- import net .discordjug .javabot .systems .qotw .dao .QuestionPointsRepository ;
1514import net .discordjug .javabot .systems .qotw .model .QOTWAccount ;
1615import net .discordjug .javabot .util .ExceptionLogger ;
1716import net .discordjug .javabot .util .Pair ;
1817import net .discordjug .javabot .util .UserUtils ;
1918import net .dv8tion .jda .api .EmbedBuilder ;
20- import net .dv8tion .jda .api .entities .Guild ;
2119import net .dv8tion .jda .api .entities .Member ;
2220import net .dv8tion .jda .api .entities .Message ;
2321import net .dv8tion .jda .api .entities .MessageEmbed ;
@@ -35,29 +33,27 @@ public class QOTWLeaderboardSubcommand extends SlashCommand.Subcommand {
3533
3634 private final QOTWPointsService pointsService ;
3735 private final ExecutorService asyncPool ;
38- private final QuestionPointsRepository qotwPointsRepository ;
3936
4037 /**
4138 * The constructor of this class, which sets the corresponding {@link SubcommandData}.
4239 * @param pointsService The {@link QOTWPointsService} managing {@link QOTWAccount}s
4340 * @param asyncPool The thread pool for asynchronous operations
44- * @param qotwPointsRepository Dao object that represents the QOTW_POINTS SQL Table.
4541 */
46- public QOTWLeaderboardSubcommand (QOTWPointsService pointsService , ExecutorService asyncPool , QuestionPointsRepository qotwPointsRepository ) {
42+ public QOTWLeaderboardSubcommand (QOTWPointsService pointsService , ExecutorService asyncPool ) {
4743 setCommandData (new SubcommandData ("qotw" , "The QOTW Points Leaderboard." ));
4844 this .pointsService =pointsService ;
4945 this .asyncPool = asyncPool ;
50- this .qotwPointsRepository = qotwPointsRepository ;
5146 }
5247
5348 @ Override
5449 public void execute (SlashCommandInteractionEvent event ) {
5550 event .deferReply ().queue ();
5651 asyncPool .submit (() -> {
5752 try {
58- WebhookMessageCreateAction <Message > action = event .getHook ().sendMessageEmbeds (buildLeaderboardRankEmbed (event .getMember ()));
53+ List <Pair <QOTWAccount ,Member >> topMembers = pointsService .getTopMembers (DISPLAY_COUNT , event .getGuild ());
54+ WebhookMessageCreateAction <Message > action = event .getHook ().sendMessageEmbeds (buildLeaderboardRankEmbed (event .getMember (), topMembers ));
5955 // check whether the image may already been cached
60- byte [] array = LeaderboardCreator .attemptLoadFromCache (getCacheName (), ()->generateLeaderboard (event . getGuild () ));
56+ byte [] array = LeaderboardCreator .attemptLoadFromCache (getCacheName (topMembers ), ()->generateLeaderboard (topMembers ));
6157 action .addFiles (FileUpload .fromData (new ByteArrayInputStream (array ), Instant .now ().getEpochSecond () + ".png" )).queue ();
6258 } catch (IOException e ) {
6359 ExceptionLogger .capture (e , getClass ().getSimpleName ());
@@ -68,11 +64,12 @@ public void execute(SlashCommandInteractionEvent event) {
6864 /**
6965 * Builds the Leaderboard Rank {@link MessageEmbed}.
7066 *
67+ * @param topMembers the accounts with the top QOTW users
7168 * @param member The member which executed the command.
7269 * @return A {@link MessageEmbed} object.
7370 */
74- private MessageEmbed buildLeaderboardRankEmbed (Member member ) {
75- int rank = pointsService . getQOTWRank (member . getIdLong () );
71+ private MessageEmbed buildLeaderboardRankEmbed (Member member , List < Pair < QOTWAccount , Member >> topMembers ) {
72+ int rank = findRankOfMember (member , topMembers );
7673 String rankSuffix = switch (rank % 10 ) {
7774 case 1 -> "st" ;
7875 case 2 -> "nd" ;
@@ -90,49 +87,53 @@ private MessageEmbed buildLeaderboardRankEmbed(Member member) {
9087 .build ();
9188 }
9289
90+ private int findRankOfMember (Member member , List <Pair <QOTWAccount , Member >> topMembers ) {
91+ return pointsService .getQOTWRank (member .getIdLong (),
92+ topMembers
93+ .stream ()
94+ .map (Pair ::first )
95+ .toList ());
96+ }
97+
9398 /**
9499 * Draws a single "user card".
95100 *
96101 * @param leaderboardCreator handling actual drawing.
97102 * @param member The member.
98103 * @param service The {@link QOTWPointsService}.
104+ * @param topMembers the accounts with the top QOTW users
99105 * @throws IOException If an error occurs.
100106 */
101- private void drawUserCard (LeaderboardCreator leaderboardCreator , @ NotNull Member member , QOTWPointsService service ) throws IOException {
102- leaderboardCreator .drawLeaderboardEntry (member , UserUtils .getUserTag (member .getUser ()), service .getPoints (member .getIdLong ()), service . getQOTWRank (member . getIdLong () ));
107+ private void drawUserCard (LeaderboardCreator leaderboardCreator , @ NotNull Member member , QOTWPointsService service , List < Pair < QOTWAccount , Member >> topMembers ) throws IOException {
108+ leaderboardCreator .drawLeaderboardEntry (member , UserUtils .getUserTag (member .getUser ()), service .getPoints (member .getIdLong ()), findRankOfMember (member , topMembers ));
103109 }
104110
105111 /**
106112 * Draws and constructs the leaderboard image.
107113 *
108- * @param guild The current guild.
114+ * @param topMembers the accounts with the top QOTW users
109115 * @return The finished image as a {@link ByteArrayInputStream}.
110116 * @throws IOException If an error occurs.
111117 */
112- private @ NotNull byte [] generateLeaderboard (Guild guild ) throws IOException {
113- List <Pair <QOTWAccount , Member >> topMembers = pointsService .getTopMembers (DISPLAY_COUNT , guild );
114-
118+ private @ NotNull byte [] generateLeaderboard (List <Pair <QOTWAccount , Member >> topMembers ) throws IOException {
115119 try (LeaderboardCreator creator = new LeaderboardCreator (Math .min (DISPLAY_COUNT , topMembers .size ()), "QuestionOfTheWeekHeader" )){
116120 for (Pair <QOTWAccount , Member > pair : topMembers ) {
117- drawUserCard (creator , pair .second (), pointsService );
121+ drawUserCard (creator , pair .second (), pointsService , topMembers );
118122 }
119- return creator .getImageBytes (getCacheName (), "qotw_leaderboard" );
123+ return creator .getImageBytes (getCacheName (topMembers ), "qotw_leaderboard" );
120124 }
121125 }
122126
123127 /**
124128 * Builds the cached image's name.
125129 *
130+ * @param topMembers the accounts with the top QOTW users
126131 * @return The image's cache name.
127132 */
128- private @ NotNull String getCacheName () {
133+ private @ NotNull String getCacheName (List < Pair < QOTWAccount , Member >> topMembers ) {
129134 try {
130- List <QOTWAccount > accounts = qotwPointsRepository .sortByPoints (QOTWPointsService .getCurrentMonth ())
131- .stream ()
132- .limit (DISPLAY_COUNT )
133- .toList ();
134135 StringBuilder sb = new StringBuilder ("qotw_leaderboard_" );
135- accounts .forEach (account -> sb .append (String .format (":%s:%s" , account .getUserId (), account .getPoints ())));
136+ topMembers .forEach (account -> sb .append (String .format (":%s:%s" , account .first (). getUserId (), account . first () .getPoints ())));
136137 return sb .toString ();
137138 } catch (DataAccessException e ) {
138139 ExceptionLogger .capture (e , getClass ().getSimpleName ());
0 commit comments