From 468b1a899d62c49a2fa4c0aa81ef2d8ab31c8391 Mon Sep 17 00:00:00 2001 From: Stephanie Gredell Date: Wed, 24 Jan 2024 23:55:00 -0800 Subject: [PATCH] Refactor to using paginator --- .../java/musicbot/RecommendationService.java | 2 +- .../buttonInteractions/MoreGenre.java | 17 ++++++--------- .../MoreRecommendation.java | 21 +++++++++---------- .../main/java/musicbot/commands/Genres.java | 7 +++++-- .../java/musicbot/commands/Recommend.java | 20 +++++++++--------- 5 files changed, 32 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/musicbot/RecommendationService.java b/app/src/main/java/musicbot/RecommendationService.java index 2f74b8b..d6d684c 100644 --- a/app/src/main/java/musicbot/RecommendationService.java +++ b/app/src/main/java/musicbot/RecommendationService.java @@ -16,7 +16,7 @@ import java.util.stream.Collectors; public class RecommendationService { - public List getRecommendations(final String artist, final String genre, final int page) { + public List getRecommendations(final String artist, final String genre) { if (artist.isEmpty() && genre.isEmpty()) { return ImmutableList.of(); diff --git a/app/src/main/java/musicbot/buttonInteractions/MoreGenre.java b/app/src/main/java/musicbot/buttonInteractions/MoreGenre.java index d0f6208..28e85c1 100644 --- a/app/src/main/java/musicbot/buttonInteractions/MoreGenre.java +++ b/app/src/main/java/musicbot/buttonInteractions/MoreGenre.java @@ -1,6 +1,7 @@ package musicbot.buttonInteractions; import musicbot.ButtonInteraction; +import musicbot.Paginator; import musicbot.SpotifyClient; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent; @@ -17,31 +18,25 @@ public class MoreGenre implements ButtonInteraction { @Override public void execute(ButtonInteractionEvent event) { final String id = event.getComponent().getId(); - final String label = event.getComponent().getLabel(); + final Paginator paginator = new Paginator(); final String[] args = id.split("_"); event.deferReply().queue(); final int page = Integer.parseInt(args[1]); - final int offset = page * 10; - final int index = offset + 10; - final int nextPage = page + 1; final SpotifyClient spotifyClient = new SpotifyClient(); final List genres = spotifyClient.findGenres(); - final int maxSize = genres.size(); - final int maxPage = (int) Math.floor(maxSize / 10); + final Paginator.PaginatedItems paginatedGenre = paginator.paginate(genres, 10, page); final EmbedBuilder eb = new EmbedBuilder(); - if (nextPage <= maxPage) { - genres.subList(offset, index).forEach(genreItem -> eb.addField(genreItem, "", false)); - + paginatedGenre.get().forEach(genreItem -> eb.addField(genreItem, "", false)); + if (!paginatedGenre.isIsLastPage()) { event.getHook().sendMessageEmbeds(eb.build()).addActionRow( - Button.primary("genre_" + nextPage, "More") + Button.primary("genre_" + paginatedGenre.getNextPageNum(), "More genres") ).queue(); } else { - genres.subList(offset, maxSize).forEach(genreItem -> eb.addField(genreItem, "", false)); event.getHook().sendMessageEmbeds(eb.build()).queue(); } } diff --git a/app/src/main/java/musicbot/buttonInteractions/MoreRecommendation.java b/app/src/main/java/musicbot/buttonInteractions/MoreRecommendation.java index 4540fb5..e4a520d 100644 --- a/app/src/main/java/musicbot/buttonInteractions/MoreRecommendation.java +++ b/app/src/main/java/musicbot/buttonInteractions/MoreRecommendation.java @@ -1,6 +1,7 @@ package musicbot.buttonInteractions; import musicbot.ButtonInteraction; +import musicbot.Paginator; import musicbot.RecommendationService; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.entities.MessageEmbed; @@ -21,7 +22,6 @@ public class MoreRecommendation implements ButtonInteraction { private static final int INCREMENT = 5; private static final String ARGS_DELIMITER = "_"; private static final String ARTIST_GENRE_DELIMITER = "--"; - private static final int NUM_RECOMMENDATIONS = 5; @Override public String getName() { @@ -33,20 +33,19 @@ public class MoreRecommendation implements ButtonInteraction { event.deferReply().queue(); final String id = event.getComponent().getId(); final String[] args = id.split(ARGS_DELIMITER); + final String[] artistGenre = args[1].split(ARTIST_GENRE_DELIMITER); final String artist = artistGenre[0]; final String genre = artistGenre.length < 2 ? "" : artistGenre[1]; - final int page = Integer.parseInt(args[2]); - final int nextPage = page + 1; - final int maxIndex = INCREMENT * page; - final int baseIndex = maxIndex - INCREMENT; - final List tracks = new RecommendationService().getRecommendations(artist, genre, page); - final int maxSize = tracks.size(); - final int maxPage = (int) Math.floor(maxSize / NUM_RECOMMENDATIONS); + final int pageNumber = Integer.parseInt(args[2]); + final List tracks = new RecommendationService().getRecommendations(artist, genre); + + final Paginator paginator = new Paginator(); + final Paginator.PaginatedItems paginatedTracks = paginator.paginate(tracks, 5, pageNumber); final EmbedBuilder eb = new EmbedBuilder(); - final List trackList = tracks.subList(baseIndex, maxIndex); + final List trackList = paginatedTracks.get(); if (!trackList.isEmpty()) { eb .setTitle("More recommendations based on \"" + artist + "\"") @@ -70,8 +69,8 @@ public class MoreRecommendation implements ButtonInteraction { return Button.primary("recommend_" + artists, track.getName()); }).collect(Collectors.toList()); - if (nextPage <= maxPage) { - final String buttonId = "more-recommend_" + artist + "--" + genre + "_" + nextPage; + if (!paginatedTracks.isIsLastPage()) { + final String buttonId = "more-recommend_" + artist + "--" + genre + "_" + paginatedTracks.getNextPageNum(); event .getHook() diff --git a/app/src/main/java/musicbot/commands/Genres.java b/app/src/main/java/musicbot/commands/Genres.java index 80cf95c..b2902ef 100644 --- a/app/src/main/java/musicbot/commands/Genres.java +++ b/app/src/main/java/musicbot/commands/Genres.java @@ -2,6 +2,7 @@ package musicbot.commands; import com.google.common.collect.Lists; import musicbot.MCommand; +import musicbot.Paginator; import musicbot.SpotifyClient; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.entities.MessageEmbed; @@ -37,13 +38,15 @@ public class Genres implements MCommand { event.deferReply().queue(); final SpotifyClient spotifyClient = new SpotifyClient(); final List genres = spotifyClient.findGenres(); + final Paginator paginator = new Paginator(); final EmbedBuilder eb = new EmbedBuilder(); + final Paginator.PaginatedItems paginatedGenre = paginator.paginate(genres, 10, 1); - genres.subList(0, 10).forEach(genre -> eb.addField(genre, "", false)); + paginatedGenre.get().forEach(genre -> eb.addField(genre, "", false)); event.getHook().sendMessageEmbeds(eb.build()).addActionRow( - Button.primary("genre_1", "More") + Button.primary("genre_" + paginatedGenre.getNextPageNum(), "More genres") ).queue(); } } diff --git a/app/src/main/java/musicbot/commands/Recommend.java b/app/src/main/java/musicbot/commands/Recommend.java index 9869a8d..4492871 100644 --- a/app/src/main/java/musicbot/commands/Recommend.java +++ b/app/src/main/java/musicbot/commands/Recommend.java @@ -1,6 +1,7 @@ package musicbot.commands; import musicbot.MCommand; +import musicbot.Paginator; import musicbot.RecommendationService; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.entities.MessageEmbed; @@ -48,11 +49,12 @@ public class Recommend implements MCommand { final String artistInput = event.getOption("artist") != null ? event.getOption("artist").getAsString() : ""; final String genreInput = event.getOption("genre") != null ? event.getOption("genre").getAsString() : ""; - - final List tracks = new RecommendationService().getRecommendations(artistInput, genreInput, 1); - + final List tracks = new RecommendationService().getRecommendations(artistInput, genreInput); + final Paginator paginator = new Paginator(); + final Paginator.PaginatedItems paginatedTracks = paginator.paginate(tracks, 5, 1); final EmbedBuilder eb = new EmbedBuilder(); - final List trackList = tracks.subList(0, 5); + final List trackList = paginatedTracks.get(); + if (!trackList.isEmpty()) { eb .setTitle("Recommendations based on \"" + artistInput + "\"") @@ -70,16 +72,14 @@ public class Recommend implements MCommand { }); final MessageEmbed embed = eb.build(); - - final List