Browse Source

Refactor commands

main
Stephanie Gredell 2 years ago
parent
commit
4a428a8914
  1. 41
      app/src/main/java/musicbot/CommandManager.java
  2. 65
      app/src/main/java/musicbot/Listeners.java
  3. 16
      app/src/main/java/musicbot/MCommand.java
  4. 12
      app/src/main/java/musicbot/Main.java
  5. 41
      app/src/main/java/musicbot/commands/Artist.java
  6. 23
      app/src/main/java/musicbot/commands/Genres.java
  7. 38
      app/src/main/java/musicbot/commands/MusicVideo.java
  8. 41
      app/src/main/java/musicbot/commands/Recommend.java

41
app/src/main/java/musicbot/CommandManager.java

@ -0,0 +1,41 @@ @@ -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<MCommand> 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);
}
}

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

@ -1,65 +0,0 @@ @@ -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();
}
}

16
app/src/main/java/musicbot/MCommand.java

@ -0,0 +1,16 @@ @@ -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<OptionData> getOptions();
void execute(SlashCommandInteractionEvent event);
}

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

@ -6,16 +6,16 @@ import musicbot.commands.MusicVideo; @@ -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);
}
}

41
app/src/main/java/musicbot/commands/Artist.java

@ -1,23 +1,44 @@ @@ -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<OptionData> getOptions() {
final List<OptionData> 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 { @@ -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();

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

@ -1,21 +1,38 @@ @@ -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<OptionData> getOptions() {
return null;
}
@Override
public void execute(SlashCommandInteractionEvent event) {
final SpotifyClient spotifyClient = new SpotifyClient();
final List<String> genres = spotifyClient.findGenres();

38
app/src/main/java/musicbot/commands/MusicVideo.java

@ -1,17 +1,45 @@ @@ -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<OptionData> getOptions() {
final List<OptionData> 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();

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

@ -1,15 +1,14 @@ @@ -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; @@ -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<OptionData> getOptions() {
final List<OptionData> 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 { @@ -47,10 +70,10 @@ public class Recommend extends ListenerAdapter {
.setFooter("To find a song, select a button below.");
tracks.forEach(track -> {
List<String> trackArtists = Arrays.stream(track.getArtists())
final List<String> 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);
});

Loading…
Cancel
Save