diff --git a/app/src/main/java/musicbot/CommandManager.java b/app/src/main/java/musicbot/CommandManager.java new file mode 100644 index 0000000..f6ae12f --- /dev/null +++ b/app/src/main/java/musicbot/CommandManager.java @@ -0,0 +1,41 @@ +package musicbot; + +import net.dv8tion.jda.api.entities.Guild; +import net.dv8tion.jda.api.events.ReadyEvent; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.hooks.ListenerAdapter; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +public class CommandManager extends ListenerAdapter { + private final List commands = new ArrayList<>(); + + @Override + public void onReady(final ReadyEvent event) { + for (final Guild guild : event.getJDA().getGuilds()) { + for (MCommand command : commands) { + if (command.getOptions() == null) { + guild.upsertCommand(command.getName(), command.getDescription()).queue(); + } else { + guild.upsertCommand(command.getName(), command.getDescription()).addOptions(command.getOptions()).queue(); + } + } + } + } + + @Override + public void onSlashCommandInteraction(final @NotNull SlashCommandInteractionEvent event) { + for(final MCommand command : commands) { + if(command.getName().equals(event.getName())) { + command.execute(event); + return; + } + } + } + + public void add(final MCommand command) { + commands.add(command); + } +} diff --git a/app/src/main/java/musicbot/Listeners.java b/app/src/main/java/musicbot/Listeners.java deleted file mode 100644 index f883724..0000000 --- a/app/src/main/java/musicbot/Listeners.java +++ /dev/null @@ -1,65 +0,0 @@ -package musicbot; - -import net.dv8tion.jda.api.JDA; -import net.dv8tion.jda.api.events.ReadyEvent; -import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent; -import net.dv8tion.jda.api.hooks.ListenerAdapter; -import net.dv8tion.jda.api.interactions.commands.OptionType; -import net.dv8tion.jda.api.interactions.commands.build.OptionData; -import org.jetbrains.annotations.NotNull; - -public class Listeners extends ListenerAdapter { - @Override - public void onReady(@NotNull final ReadyEvent event) { - //final JDA jda = event.getJDA().getGuildById(1197770092243599431L).getJDA(); - final JDA jda = event.getJDA(); - - jda.upsertCommand("music", "find music to play").addOptions( - new OptionData( - OptionType.STRING, - "title", - "The name of the song", - true), - new OptionData( - OptionType.STRING, - "artist", - "The artist of the song", - true) - ).queue(); - - jda.upsertCommand("recommend", "find recommendations for music").addOptions( - new OptionData( - OptionType.STRING, - "artist", - "Find other songs and artists based on an artist you like" - ), - new OptionData( - OptionType.STRING, - "genre", - "Find other songs and artists based on a genre you like" - ) - ).queue(); - - jda.upsertCommand("artist", "find songs by artist").addOptions( - new OptionData( - OptionType.STRING, - "name", - "Find tracks by an artist.", - true - ) - ).queue(); - - jda.upsertCommand("genres", "find supported genres").queue(); - } - - @Override - public void onButtonInteraction(@NotNull ButtonInteractionEvent event) { - final String artist = event.getComponent().getId(); - final String title = event.getComponent().getLabel(); - - final YoutubeSearch youtubeSearch = new YoutubeSearch(); - final String result = youtubeSearch.searchForMusic(title, artist); - - event.reply(result).queue(); - } -} diff --git a/app/src/main/java/musicbot/MCommand.java b/app/src/main/java/musicbot/MCommand.java new file mode 100644 index 0000000..d606138 --- /dev/null +++ b/app/src/main/java/musicbot/MCommand.java @@ -0,0 +1,16 @@ +package musicbot; + +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.interactions.commands.build.OptionData; + +import java.util.List; + +public interface MCommand { + String getName(); + + String getDescription(); + + List getOptions(); + + void execute(SlashCommandInteractionEvent event); +} diff --git a/app/src/main/java/musicbot/Main.java b/app/src/main/java/musicbot/Main.java index ef5bb9c..66bad0d 100644 --- a/app/src/main/java/musicbot/Main.java +++ b/app/src/main/java/musicbot/Main.java @@ -6,16 +6,16 @@ import musicbot.commands.MusicVideo; import musicbot.commands.Recommend; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.JDABuilder; - public class Main { public static void main(final String[] args) { final JDA jda = JDABuilder .createDefault(Token.TOKEN) .build(); - jda.addEventListener(new Listeners()); - jda.addEventListener(new MusicVideo()); - jda.addEventListener(new Recommend()); - jda.addEventListener(new Genres()); - jda.addEventListener(new Artist()); + final CommandManager manager = new CommandManager(); + manager.add(new Artist()); + manager.add(new Genres()); + manager.add(new MusicVideo()); + manager.add(new Recommend()); + jda.addEventListener(manager); } } diff --git a/app/src/main/java/musicbot/commands/Artist.java b/app/src/main/java/musicbot/commands/Artist.java index c21afef..74d4c7b 100644 --- a/app/src/main/java/musicbot/commands/Artist.java +++ b/app/src/main/java/musicbot/commands/Artist.java @@ -1,23 +1,44 @@ package musicbot.commands; +import musicbot.MCommand; import musicbot.SpotifyClient; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.entities.MessageEmbed; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; -import net.dv8tion.jda.api.hooks.ListenerAdapter; -import net.dv8tion.jda.api.interactions.commands.OptionMapping; -import net.dv8tion.jda.api.interactions.components.buttons.Button; -import org.jetbrains.annotations.NotNull; +import net.dv8tion.jda.api.interactions.commands.OptionType; +import net.dv8tion.jda.api.interactions.commands.build.OptionData; import se.michaelthelin.spotify.model_objects.specification.Track; +import java.util.ArrayList; import java.util.List; -public class Artist extends ListenerAdapter { +public class Artist implements MCommand { @Override - public void onSlashCommandInteraction(@NotNull SlashCommandInteractionEvent event) { - if (!event.getName().equals("artist")) return; + public String getName() { + return "artist"; + } + + @Override + public String getDescription() { + return "Find songs by artist"; + } + @Override + public List getOptions() { + final List options= new ArrayList<>(); + options.add(new OptionData( + OptionType.STRING, + "name", + "Find tracks by an artist.", + true + )); + + return options; + } + + @Override + public void execute(SlashCommandInteractionEvent event) { event.deferReply().queue(); final String artist = event.getOption("name").getAsString(); @@ -29,9 +50,9 @@ public class Artist extends ListenerAdapter { eb .setTitle("Some tracks by " + artist); - tracks.forEach(track -> { - eb.addField(track.getName(), "", false); - }); + tracks.forEach(track -> + eb.addField(track.getName(), "", false) + ); final MessageEmbed embed = eb.build(); diff --git a/app/src/main/java/musicbot/commands/Genres.java b/app/src/main/java/musicbot/commands/Genres.java index d9bc786..657dffd 100644 --- a/app/src/main/java/musicbot/commands/Genres.java +++ b/app/src/main/java/musicbot/commands/Genres.java @@ -1,21 +1,38 @@ package musicbot.commands; import com.google.common.collect.Lists; +import musicbot.MCommand; import musicbot.SpotifyClient; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.entities.MessageEmbed; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; +import net.dv8tion.jda.api.interactions.commands.build.OptionData; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; -public class Genres extends ListenerAdapter { +public class Genres implements MCommand { + @Override - public void onSlashCommandInteraction(@NotNull SlashCommandInteractionEvent event) { - if (!event.getName().equals("genres")) return; + public String getName() { + return "genres"; + } + + @Override + public String getDescription() { + return "find support genres"; + } + @Override + public List getOptions() { + return null; + } + + @Override + public void execute(SlashCommandInteractionEvent event) { final SpotifyClient spotifyClient = new SpotifyClient(); final List genres = spotifyClient.findGenres(); diff --git a/app/src/main/java/musicbot/commands/MusicVideo.java b/app/src/main/java/musicbot/commands/MusicVideo.java index f7db80f..3d258d5 100644 --- a/app/src/main/java/musicbot/commands/MusicVideo.java +++ b/app/src/main/java/musicbot/commands/MusicVideo.java @@ -1,17 +1,45 @@ package musicbot.commands; +import musicbot.MCommand; import musicbot.YoutubeSearch; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; -import net.dv8tion.jda.api.hooks.ListenerAdapter; -import org.jetbrains.annotations.NotNull; +import net.dv8tion.jda.api.interactions.commands.OptionType; +import net.dv8tion.jda.api.interactions.commands.build.OptionData; +import java.util.ArrayList; +import java.util.List; import java.util.Objects; -public class MusicVideo extends ListenerAdapter { +public class MusicVideo implements MCommand { + @Override - public void onSlashCommandInteraction(@NotNull final SlashCommandInteractionEvent event) { - if (!event.getName().equals("music")) return; + public String getName() { + return "music"; + } + + @Override + public String getDescription() { + return "find music to play"; + } + @Override + public List getOptions() { + final List options = new ArrayList<>(); + options.add(new OptionData( + OptionType.STRING, + "title", + "The name of the song", + true)); + options.add(new OptionData( + OptionType.STRING, + "artist", + "The artist of the song", + true)); + return options; + } + + @Override + public void execute(SlashCommandInteractionEvent event) { final String title = Objects.requireNonNull(event.getOption("title")).getAsString(); final String artist = Objects.requireNonNull(event.getOption("artist")).getAsString(); diff --git a/app/src/main/java/musicbot/commands/Recommend.java b/app/src/main/java/musicbot/commands/Recommend.java index 7285630..052ef09 100644 --- a/app/src/main/java/musicbot/commands/Recommend.java +++ b/app/src/main/java/musicbot/commands/Recommend.java @@ -1,15 +1,14 @@ package musicbot.commands; +import musicbot.MCommand; import musicbot.SpotifyClient; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.entities.MessageEmbed; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.interactions.commands.OptionMapping; -import net.dv8tion.jda.api.hooks.ListenerAdapter; -import net.dv8tion.jda.api.interactions.components.LayoutComponent; +import net.dv8tion.jda.api.interactions.commands.OptionType; +import net.dv8tion.jda.api.interactions.commands.build.OptionData; import net.dv8tion.jda.api.interactions.components.buttons.Button; -import net.dv8tion.jda.api.requests.restaction.WebhookMessageCreateAction; -import org.jetbrains.annotations.NotNull; import se.michaelthelin.spotify.model_objects.specification.Artist; import se.michaelthelin.spotify.model_objects.specification.ArtistSimplified; import se.michaelthelin.spotify.model_objects.specification.Track; @@ -17,12 +16,36 @@ import se.michaelthelin.spotify.model_objects.specification.Track; import java.util.*; import java.util.stream.Collectors; -public class Recommend extends ListenerAdapter { +public class Recommend implements MCommand { @Override - public void onSlashCommandInteraction(@NotNull final SlashCommandInteractionEvent event) { - if (!event.getName().equals("recommend")) return; + public String getName() { + return "recommend"; + } + + @Override + public String getDescription() { + return "find recommendations for music"; + } + @Override + public List getOptions() { + final List options = new ArrayList<>(); + options.add(new OptionData( + OptionType.STRING, + "artist", + "Find other songs and artists based on an artist you like" + )); + options.add(new OptionData( + OptionType.STRING, + "genre", + "Find other songs and artists based on a genre you like" + )); + return options; + } + + @Override + public void execute(SlashCommandInteractionEvent event) { event.deferReply().queue(); final OptionMapping artistInput = event.getOption("artist"); @@ -47,10 +70,10 @@ public class Recommend extends ListenerAdapter { .setFooter("To find a song, select a button below."); tracks.forEach(track -> { - List trackArtists = Arrays.stream(track.getArtists()) + final List trackArtists = Arrays.stream(track.getArtists()) .map(ArtistSimplified::getName) .collect(Collectors.toList()); - String artists = String.join(", ", trackArtists); + final String artists = String.join(", ", trackArtists); eb.addField(track.getName(), artists, false); });