Browse Source

Initial refactor to organize button interactions

main
Stephanie Gredell 2 years ago
parent
commit
78a7da442b
  1. 9
      app/src/main/java/musicbot/ButtonInteraction.java
  2. 29
      app/src/main/java/musicbot/ButtonInteractionManager.java
  3. 53
      app/src/main/java/musicbot/Listeners.java
  4. 22
      app/src/main/java/musicbot/Main.java
  5. 38
      app/src/main/java/musicbot/RecommendationService.java
  6. 86
      app/src/main/java/musicbot/buttonInteractions/MoreRecommendation.java

9
app/src/main/java/musicbot/ButtonInteraction.java

@ -0,0 +1,9 @@
package musicbot;
import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent;
public interface ButtonInteraction {
String getName();
void execute(ButtonInteractionEvent event);
}

29
app/src/main/java/musicbot/ButtonInteractionManager.java

@ -0,0 +1,29 @@
package musicbot;
import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
public class ButtonInteractionManager extends ListenerAdapter {
private final List<ButtonInteraction> buttonInteractions = new ArrayList<>();
@Override
public void onButtonInteraction(@NotNull ButtonInteractionEvent event) {
final String id = event.getComponent().getId();
final String[] args = id.split("_");
for (final ButtonInteraction buttonInteraction : buttonInteractions) {
if (args[0].equals(buttonInteraction.getName())) {
buttonInteraction.execute(event);
}
}
}
public void add(@NotNull final ButtonInteraction buttonInteraction) {
buttonInteractions.add(buttonInteraction);
}
}

53
app/src/main/java/musicbot/Listeners.java

@ -0,0 +1,53 @@
package musicbot;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import net.dv8tion.jda.api.interactions.components.buttons.Button;
import org.jetbrains.annotations.NotNull;
import java.util.List;
public class Listeners extends ListenerAdapter {
@Override
public void onButtonInteraction(@NotNull ButtonInteractionEvent event) {
final String id = event.getComponent().getId();
final String label = event.getComponent().getLabel();
final String[] args = id.split("_");
event.deferReply().queue();
if (args[0].equalsIgnoreCase("recommend")) {
final YoutubeSearch youtubeSearch = new YoutubeSearch();
final String result = youtubeSearch.searchForMusic(label, args[1]);
event.getHook().sendMessage(result).queue();
}
if (args[0].equalsIgnoreCase("genre")) {
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 EmbedBuilder eb = new EmbedBuilder();
if (nextPage <= maxPage) {
genres.subList(offset, index).forEach(genreItem -> eb.addField(genreItem, "", false));
event.getHook().sendMessageEmbeds(eb.build()).addActionRow(
Button.primary("genre_" + nextPage, "More")
).queue();
} else {
genres.subList(offset, maxSize).forEach(genreItem -> eb.addField(genreItem, "", false));
event.getHook().sendMessageEmbeds(eb.build()).queue();
}
}
}
}

22
app/src/main/java/musicbot/Main.java

@ -1,5 +1,6 @@
package musicbot; package musicbot;
import musicbot.buttonInteractions.MoreRecommendation;
import musicbot.commands.Artist; import musicbot.commands.Artist;
import musicbot.commands.Genres; import musicbot.commands.Genres;
import musicbot.commands.MusicVideo; import musicbot.commands.MusicVideo;
@ -11,12 +12,21 @@ public class Main {
final JDA jda = JDABuilder final JDA jda = JDABuilder
.createDefault(Token.TOKEN) .createDefault(Token.TOKEN)
.build(); .build();
final CommandManager manager = new CommandManager(); final CommandManager commandManager = new CommandManager();
manager.add(new Artist()); final ButtonInteractionManager buttonInteractionManager = new ButtonInteractionManager();
manager.add(new Genres());
manager.add(new MusicVideo()); // commands
manager.add(new Recommend()); commandManager.add(new Artist());
jda.addEventListener(manager); commandManager.add(new Genres());
commandManager.add(new MusicVideo());
commandManager.add(new Recommend());
// button interactions
buttonInteractionManager.add(new MoreRecommendation());
// add the managers
jda.addEventListener(commandManager);
jda.addEventListener(buttonInteractionManager);
jda.addEventListener(new Listeners()); jda.addEventListener(new Listeners());
} }
} }

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

@ -0,0 +1,38 @@
package musicbot;
import com.google.common.collect.ImmutableList;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.MessageEmbed;
import net.dv8tion.jda.api.interactions.commands.OptionMapping;
import net.dv8tion.jda.api.interactions.components.buttons.Button;
import se.michaelthelin.spotify.model_objects.specification.Artist;
import se.michaelthelin.spotify.model_objects.specification.ArtistSimplified;
import se.michaelthelin.spotify.model_objects.specification.Track;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
public class RecommendationService {
public List<Track> getRecommendations(final String artist, final String genre, final int page) {
if (artist.isEmpty() && genre.isEmpty()) {
return ImmutableList.of();
}
final SpotifyClient spotifyClient = new SpotifyClient();
final Optional<String> maybeArtistId = findArtistId(artist);
final String artistId = maybeArtistId.orElse("");
final List<Track> tracks = spotifyClient.findRecommendations(artistId, genre);
return tracks;
}
private Optional<String> findArtistId(final String artist) {
final SpotifyClient spotifyClient = new SpotifyClient();
final Optional<Artist> maybeArtist = spotifyClient.findArtist(artist);
return maybeArtist.map(Artist::getId);
}
}

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

@ -0,0 +1,86 @@
package musicbot.buttonInteractions;
import musicbot.ButtonInteraction;
import musicbot.RecommendationService;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.MessageEmbed;
import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent;
import net.dv8tion.jda.api.interactions.components.buttons.Button;
import se.michaelthelin.spotify.model_objects.specification.ArtistSimplified;
import se.michaelthelin.spotify.model_objects.specification.Track;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
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() {
return "more-recommend";
}
@Override
public void execute(final ButtonInteractionEvent event) {
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 EmbedBuilder eb = new EmbedBuilder();
final List<Track> trackList = tracks.subList(baseIndex, maxIndex);
if (!trackList.isEmpty()) {
eb
.setTitle("More recommendations based on \"" + artist + "\"")
.setDescription("Here are more recommendations based on your input.");
trackList.forEach(track -> {
final List<String> trackArtists = Arrays.stream(track.getArtists())
.map(ArtistSimplified::getName)
.collect(Collectors.toList());
final String artists = String.join(", ", trackArtists);
eb.addField(track.getName(), artists, false);
});
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(", "));
return Button.primary("recommend_" + artists, track.getName());
}).collect(Collectors.toList());
if (nextPage <= maxPage) {
final String buttonId = "more-recommend_" + artist + "--" + genre + "_" + nextPage;
event
.getHook()
.sendMessageEmbeds(embed)
.addActionRow(buttons)
.addActionRow(Button.secondary(buttonId, "Get more recommendations"))
.queue();
} else {
event
.getHook()
.sendMessageEmbeds(embed)
.addActionRow(buttons)
.queue();
}
}
}
}
Loading…
Cancel
Save