Music Commands

About

Of all the music commands, I’m showcasing the play command. My bot is able to play links from SoundCloud and YouTube.

Source Code

package bot.commands.music;

import bot.commands.CommandContext;
import bot.commands.CommandInterface;
import bot.driver.Monitor;
import bot.handlers.music.PlayerManager;

import java.net.URL;
import java.util.List;
import java.util.Objects;

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.youtube.YouTube;
import com.google.api.services.youtube.model.SearchResult;

import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.Permission;
import net.dv8tion.jda.api.managers.AudioManager;

public class Play implements CommandInterface {

    private final YouTube youTube;

    public Play() {
        YouTube temp = null;

        try {
            temp = new YouTube.Builder(GoogleNetHttpTransport.newTrustedTransport(), JacksonFactory.getDefaultInstance(), null)
            .setApplicationName("Monitor Discord Bot")
            .build();
        } catch (Exception e) {
            e.printStackTrace();
        }
        youTube = temp;
    }

    private String youtubeSearch(String searchInput) {
        try {
            List<SearchResult> result = youTube.search()
            .list("id,snippet")
            .setQ(searchInput)
            .setMaxResults(1L)
            .setFields("items(id/kind,id/videoId,snippet/title,snippet/thumbnails/default/url)")
            .setKey(System.getenv("YouTube_KEY"))
            .execute()
            .getItems();

            if(!result.isEmpty()) {
                String videoID = result.get(0).getId().getVideoId();
                String playlistID = result.get(0).getId().getPlaylistId();

                if(result.get(0).getId().getKind().equals("youtube#video")) {
                    return "https://www.youtube.com/watch?v=" + videoID;
                }
                else if(result.get(0).getId().getKind().equals("youtube#playlist")) {
                    return "https://www.youtube.com/playlist?list=" + playlistID;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    private boolean isUrl(String url) {
        try {
            new URL(url).toURI();
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    @Override
    public void handle(CommandContext c) {
        AudioManager manager = c.getGuild().getAudioManager();

        if(c.getMember().hasPermission(Permission.VOICE_CONNECT)) {

            if(c.getCommandParameters().isEmpty()) {
                EmbedBuilder play = new EmbedBuilder();
                play.setColor(0x05055e);
                play.setTitle("Play Command Usage");
                play.setDescription(Monitor.prefix +"play [insert link or search query here]");
                play.setFooter("The Monitor ™ | Powered by Java", Monitor.myBot.getSelfUser().getEffectiveAvatarUrl());
                c.getChannel().sendTyping().queue();
                c.getChannel().sendMessage(play.build()).queue();
                play.clear();
            }
            else {

                if(Objects.requireNonNull(c.getMember().getVoiceState()).getChannel() != null && c.getMember().getVoiceState().getChannel() == manager.getConnectedChannel() && manager.isConnected()) {
                    String link = String.join(" ", c.getCommandParameters());

                    if(!isUrl(link)) {
                        String ytSearch = youtubeSearch(link);

                        if(ytSearch == null) {
                            c.getChannel().sendTyping().queue();
                            c.getChannel().sendMessage("Sorry, YouTube returned no results for your query.").queue();
                            return;
                        }
                        link = ytSearch;
                        PlayerManager.getInstance().loadAndPlay(c.getChannel(), link);
                    }
                    else {
                        String formatLink = link.substring(link.indexOf("h"));
                        PlayerManager.getInstance().loadAndPlay(c.getChannel(), formatLink);
                    }
                }
                else {
                    c.getChannel().sendTyping().queue();
                    c.getChannel().sendMessage("You have to be in the same voice channel as me to play anything. Please use the join command to summon me.").queue();
                }
            }
        }
    }

    @Override
    public String getName() {
        return "play";
    }
}

More From This Site