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. 20
      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; @@ -16,7 +16,7 @@ import java.util.stream.Collectors;
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()) {
return ImmutableList.of();

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

@ -1,6 +1,7 @@ @@ -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 { @@ -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<String> genres = spotifyClient.findGenres();
final int maxSize = genres.size();
final int maxPage = (int) Math.floor(maxSize / 10);
final Paginator.PaginatedItems<String> 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();
}
}

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

@ -1,6 +1,7 @@ @@ -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 { @@ -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 { @@ -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<Track> 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<Track> tracks = new RecommendationService().getRecommendations(artist, genre);
final Paginator paginator = new Paginator();
final Paginator.PaginatedItems<Track> paginatedTracks = paginator.paginate(tracks, 5, pageNumber);
final EmbedBuilder eb = new EmbedBuilder();
final List<Track> trackList = tracks.subList(baseIndex, maxIndex);
final List<Track> trackList = paginatedTracks.get();
if (!trackList.isEmpty()) {
eb
.setTitle("More recommendations based on \"" + artist + "\"")
@ -70,8 +69,8 @@ public class MoreRecommendation implements ButtonInteraction { @@ -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()

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

@ -2,6 +2,7 @@ package musicbot.commands; @@ -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 { @@ -37,13 +38,15 @@ public class Genres implements MCommand {
event.deferReply().queue();
final SpotifyClient spotifyClient = new SpotifyClient();
final List<String> genres = spotifyClient.findGenres();
final Paginator paginator = new Paginator();
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(
Button.primary("genre_1", "More")
Button.primary("genre_" + paginatedGenre.getNextPageNum(), "More genres")
).queue();
}
}

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

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

Loading…
Cancel
Save