Browse Source

Refactor to using paginator

main
Stephanie Gredell 2 years ago
parent
commit
468b1a899d
  1. 2
      app/src/main/java/musicbot/RecommendationService.java
  2. 17
      app/src/main/java/musicbot/buttonInteractions/MoreGenre.java
  3. 21
      app/src/main/java/musicbot/buttonInteractions/MoreRecommendation.java
  4. 7
      app/src/main/java/musicbot/commands/Genres.java
  5. 14
      app/src/main/java/musicbot/commands/Recommend.java

2
app/src/main/java/musicbot/RecommendationService.java

@ -16,7 +16,7 @@ import java.util.stream.Collectors;
public class RecommendationService { public class RecommendationService {
public List<Track> getRecommendations(final String artist, final String genre, final int page) { public List<Track> getRecommendations(final String artist, final String genre) {
if (artist.isEmpty() && genre.isEmpty()) { if (artist.isEmpty() && genre.isEmpty()) {
return ImmutableList.of(); return ImmutableList.of();

17
app/src/main/java/musicbot/buttonInteractions/MoreGenre.java

@ -1,6 +1,7 @@
package musicbot.buttonInteractions; package musicbot.buttonInteractions;
import musicbot.ButtonInteraction; import musicbot.ButtonInteraction;
import musicbot.Paginator;
import musicbot.SpotifyClient; import musicbot.SpotifyClient;
import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent; import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent;
@ -17,31 +18,25 @@ public class MoreGenre implements ButtonInteraction {
@Override @Override
public void execute(ButtonInteractionEvent event) { public void execute(ButtonInteractionEvent event) {
final String id = event.getComponent().getId(); final String id = event.getComponent().getId();
final String label = event.getComponent().getLabel(); final Paginator paginator = new Paginator();
final String[] args = id.split("_"); final String[] args = id.split("_");
event.deferReply().queue(); event.deferReply().queue();
final int page = Integer.parseInt(args[1]); 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 SpotifyClient spotifyClient = new SpotifyClient();
final List<String> genres = spotifyClient.findGenres(); final List<String> genres = spotifyClient.findGenres();
final int maxSize = genres.size(); final Paginator.PaginatedItems<String> paginatedGenre = paginator.paginate(genres, 10, page);
final int maxPage = (int) Math.floor(maxSize / 10);
final EmbedBuilder eb = new EmbedBuilder(); final EmbedBuilder eb = new EmbedBuilder();
if (nextPage <= maxPage) { paginatedGenre.get().forEach(genreItem -> eb.addField(genreItem, "", false));
genres.subList(offset, index).forEach(genreItem -> eb.addField(genreItem, "", false)); if (!paginatedGenre.isIsLastPage()) {
event.getHook().sendMessageEmbeds(eb.build()).addActionRow( event.getHook().sendMessageEmbeds(eb.build()).addActionRow(
Button.primary("genre_" + nextPage, "More") Button.primary("genre_" + paginatedGenre.getNextPageNum(), "More genres")
).queue(); ).queue();
} else { } else {
genres.subList(offset, maxSize).forEach(genreItem -> eb.addField(genreItem, "", false));
event.getHook().sendMessageEmbeds(eb.build()).queue(); event.getHook().sendMessageEmbeds(eb.build()).queue();
} }
} }

21
app/src/main/java/musicbot/buttonInteractions/MoreRecommendation.java

@ -1,6 +1,7 @@
package musicbot.buttonInteractions; package musicbot.buttonInteractions;
import musicbot.ButtonInteraction; import musicbot.ButtonInteraction;
import musicbot.Paginator;
import musicbot.RecommendationService; import musicbot.RecommendationService;
import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.MessageEmbed; 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 int INCREMENT = 5;
private static final String ARGS_DELIMITER = "_"; private static final String ARGS_DELIMITER = "_";
private static final String ARTIST_GENRE_DELIMITER = "--"; private static final String ARTIST_GENRE_DELIMITER = "--";
private static final int NUM_RECOMMENDATIONS = 5;
@Override @Override
public String getName() { public String getName() {
@ -33,20 +33,19 @@ public class MoreRecommendation implements ButtonInteraction {
event.deferReply().queue(); event.deferReply().queue();
final String id = event.getComponent().getId(); final String id = event.getComponent().getId();
final String[] args = id.split(ARGS_DELIMITER); final String[] args = id.split(ARGS_DELIMITER);
final String[] artistGenre = args[1].split(ARTIST_GENRE_DELIMITER); final String[] artistGenre = args[1].split(ARTIST_GENRE_DELIMITER);
final String artist = artistGenre[0]; final String artist = artistGenre[0];
final String genre = artistGenre.length < 2 ? "" : artistGenre[1]; 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<Track> tracks = new RecommendationService().getRecommendations(artist, genre, page); final int pageNumber = Integer.parseInt(args[2]);
final int maxSize = tracks.size(); final List<Track> tracks = new RecommendationService().getRecommendations(artist, genre);
final int maxPage = (int) Math.floor(maxSize / NUM_RECOMMENDATIONS);
final Paginator paginator = new Paginator();
final Paginator.PaginatedItems<Track> paginatedTracks = paginator.paginate(tracks, 5, pageNumber);
final EmbedBuilder eb = new EmbedBuilder(); final EmbedBuilder eb = new EmbedBuilder();
final List<Track> trackList = tracks.subList(baseIndex, maxIndex); final List<Track> trackList = paginatedTracks.get();
if (!trackList.isEmpty()) { if (!trackList.isEmpty()) {
eb eb
.setTitle("More recommendations based on \"" + artist + "\"") .setTitle("More recommendations based on \"" + artist + "\"")
@ -70,8 +69,8 @@ public class MoreRecommendation implements ButtonInteraction {
return Button.primary("recommend_" + artists, track.getName()); return Button.primary("recommend_" + artists, track.getName());
}).collect(Collectors.toList()); }).collect(Collectors.toList());
if (nextPage <= maxPage) { if (!paginatedTracks.isIsLastPage()) {
final String buttonId = "more-recommend_" + artist + "--" + genre + "_" + nextPage; final String buttonId = "more-recommend_" + artist + "--" + genre + "_" + paginatedTracks.getNextPageNum();
event event
.getHook() .getHook()

7
app/src/main/java/musicbot/commands/Genres.java

@ -2,6 +2,7 @@ package musicbot.commands;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import musicbot.MCommand; import musicbot.MCommand;
import musicbot.Paginator;
import musicbot.SpotifyClient; import musicbot.SpotifyClient;
import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.MessageEmbed; import net.dv8tion.jda.api.entities.MessageEmbed;
@ -37,13 +38,15 @@ public class Genres implements MCommand {
event.deferReply().queue(); event.deferReply().queue();
final SpotifyClient spotifyClient = new SpotifyClient(); final SpotifyClient spotifyClient = new SpotifyClient();
final List<String> genres = spotifyClient.findGenres(); final List<String> genres = spotifyClient.findGenres();
final Paginator paginator = new Paginator();
final EmbedBuilder eb = new EmbedBuilder(); final EmbedBuilder eb = new EmbedBuilder();
final Paginator.PaginatedItems<String> 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( event.getHook().sendMessageEmbeds(eb.build()).addActionRow(
Button.primary("genre_1", "More") Button.primary("genre_" + paginatedGenre.getNextPageNum(), "More genres")
).queue(); ).queue();
} }
} }

14
app/src/main/java/musicbot/commands/Recommend.java

@ -1,6 +1,7 @@
package musicbot.commands; package musicbot.commands;
import musicbot.MCommand; import musicbot.MCommand;
import musicbot.Paginator;
import musicbot.RecommendationService; import musicbot.RecommendationService;
import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.MessageEmbed; 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 artistInput = event.getOption("artist") != null ? event.getOption("artist").getAsString() : "";
final String genreInput = event.getOption("genre") != null ? event.getOption("genre").getAsString() : ""; final String genreInput = event.getOption("genre") != null ? event.getOption("genre").getAsString() : "";
final List<Track> tracks = new RecommendationService().getRecommendations(artistInput, genreInput);
final List<Track> tracks = new RecommendationService().getRecommendations(artistInput, genreInput, 1); final Paginator paginator = new Paginator();
final Paginator.PaginatedItems<Track> paginatedTracks = paginator.paginate(tracks, 5, 1);
final EmbedBuilder eb = new EmbedBuilder(); final EmbedBuilder eb = new EmbedBuilder();
final List<Track> trackList = tracks.subList(0, 5); final List<Track> trackList = paginatedTracks.get();
if (!trackList.isEmpty()) { if (!trackList.isEmpty()) {
eb eb
.setTitle("Recommendations based on \"" + artistInput + "\"") .setTitle("Recommendations based on \"" + artistInput + "\"")
@ -70,8 +72,6 @@ public class Recommend implements MCommand {
}); });
final MessageEmbed embed = eb.build(); final MessageEmbed embed = eb.build();
final List<Button> buttons = trackList.stream().map(track -> { final List<Button> buttons = trackList.stream().map(track -> {
final String artists = Arrays.stream(track.getArtists()).map(ArtistSimplified::getName) final String artists = Arrays.stream(track.getArtists()).map(ArtistSimplified::getName)
.collect(Collectors.joining(", ")); .collect(Collectors.joining(", "));
@ -79,7 +79,7 @@ public class Recommend implements MCommand {
return Button.primary("recommend_" + artists, track.getName()); return Button.primary("recommend_" + artists, track.getName());
}).collect(Collectors.toList()); }).collect(Collectors.toList());
final String buttonId = "more-recommend_" + artistInput + "--" + genreInput + "_" + "1"; final String buttonId = "more-recommend_" + artistInput + "--" + genreInput + "_" + paginatedTracks.getNextPageNum();
event event
.getHook() .getHook()

Loading…
Cancel
Save