diff options
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.java | 94 |
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; + } +} |