summaryrefslogtreecommitdiff
path: root/src/main/java/net/tylermurphy/ken/command/music/Play.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/net/tylermurphy/ken/command/music/Play.java')
-rw-r--r--src/main/java/net/tylermurphy/ken/command/music/Play.java94
1 files changed, 94 insertions, 0 deletions
diff --git a/src/main/java/net/tylermurphy/ken/command/music/Play.java b/src/main/java/net/tylermurphy/ken/command/music/Play.java
new file mode 100644
index 0000000..e32333c
--- /dev/null
+++ b/src/main/java/net/tylermurphy/ken/command/music/Play.java
@@ -0,0 +1,94 @@
+package net.tylermurphy.ken.command.music;
+
+import com.google.api.services.youtube.model.SearchResult;
+import net.dv8tion.jda.api.Permission;
+import net.dv8tion.jda.api.entities.*;
+import net.dv8tion.jda.api.interactions.commands.OptionType;
+import net.dv8tion.jda.api.managers.AudioManager;
+import net.tylermurphy.ken.Ken;
+import net.tylermurphy.ken.command.Command;
+import net.tylermurphy.ken.command.Option;
+import net.tylermurphy.ken.command.Response;
+import net.tylermurphy.ken.music.PlayerManager;
+
+import java.net.URL;
+import java.util.List;
+
+public class Play {
+
+ @Command(name="play", description="Plays a song in a voice channel")
+ @Option(name="query", description="YouTube video URL or search query", type=OptionType.STRING, required=true)
+ public Response execute(Member sender, GuildMessageChannel channel, Guild guild, List<Object> args) {
+ AudioManager audioManager = guild.getAudioManager();
+ String input = (String) args.get(0);
+ if(!isUrl(input)){
+ String ytSearched = searchYoutube(input);
+ if(ytSearched == null) {
+ return Response.error("Unable to find youtube video with a similar name");
+ }
+ input = ytSearched;
+ }
+
+ PlayerManager manager = Ken.getInstance().getPlayerManager();
+
+ if(!audioManager.isConnected()) {
+ GuildVoiceState memberVoiceState = sender.getVoiceState();
+ if (memberVoiceState == null || !memberVoiceState.inAudioChannel()) {
+ return Response.error("Please join a voice channel first");
+ }
+ AudioChannel audioChannel = memberVoiceState.getChannel();
+ Member selfMember = guild.getSelfMember();
+ assert audioChannel != null;
+ if (!selfMember.hasPermission(audioChannel, Permission.VOICE_CONNECT)) {
+ return Response.error("I am missing permission to join "+audioChannel);
+ }
+ audioManager.openAudioConnection(audioChannel);
+ manager.loadAndPlay(channel, input, sender.getUser());
+ } else if(manager.getGuildMusicManager(guild).scheduler.isQueueLooped()) {
+ return Response.error("Queue is currently looped");
+ } else {
+ GuildVoiceState memberVoiceState = sender.getVoiceState();
+ assert memberVoiceState != null;
+ AudioChannel voiceChannel = memberVoiceState.getChannel();
+ assert voiceChannel != null;
+ AudioChannel selfVoiceChannel = audioManager.getConnectedChannel();
+ assert selfVoiceChannel != null;
+ if(voiceChannel.getIdLong() == selfVoiceChannel.getIdLong()) {
+ manager.loadAndPlay(channel, input, sender.getUser());
+ } else {
+ return Response.error("You have to be in the same voice channel as me to use this command");
+ }
+ }
+ return Response.success(":arrow_forward: Queueing Track");
+ }
+
+ private boolean isUrl(String input) {
+ try {
+ new URL(input);
+ return true;
+ } catch (Exception e) {
+ return false;
+ }
+ }
+
+ private String searchYoutube(String input) {
+ try {
+ List<SearchResult> results = Ken.getInstance().getYouTube().search()
+ .list("id,snippet")
+ .setQ(input)
+ .setMaxResults(1L)
+ .setType("video")
+ .setFields("items(id/kind,id/videoId,snippet/title,snippet/thumbnails/default/url)")
+ .setKey(Ken.getInstance().getConfig().getString("youtubeAPIKey"))
+ .execute()
+ .getItems();
+ if (!results.isEmpty()) {
+ String videoId = results.get(0).getId().getVideoId();
+ return "https://www.youtube.com/watch?v=" + videoId;
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+}