Java JDA Discord音乐机器人的Youtube搜索命令

Java JDA Discord音乐机器人的Youtube搜索命令,java,youtube-api,discord,discord-jda,Java,Youtube Api,Discord,Discord Jda,我已经在一个Discord机器人上工作了几天了 起初只是简单的命令等,但慢慢地,我也致力于音乐机器人的主题 我也使用YouTube数据API来实现这一点,到目前为止一切都正常。不过,我现在想合并一个Youtube搜索命令或将其构建到另一个(Play命令)中。我已经有半个搜索命令了 到目前为止,您可以执行$play(歌曲标题) 将选择找到的第一个轨迹 但是,我希望能够看到前10个搜索结果,然后在它们之间进行选择 我已经知道了如何显示搜索结果,但现在我需要一些帮助,在您输入另一个命令之后,如何输入命

我已经在一个Discord机器人上工作了几天了

起初只是简单的命令等,但慢慢地,我也致力于音乐机器人的主题

我也使用YouTube数据API来实现这一点,到目前为止一切都正常。不过,我现在想合并一个Youtube搜索命令或将其构建到另一个(Play命令)中。我已经有半个搜索命令了

到目前为止,您可以执行$play(歌曲标题)

将选择找到的第一个轨迹

但是,我希望能够看到前10个搜索结果,然后在它们之间进行选择

我已经知道了如何显示搜索结果,但现在我需要一些帮助,在您输入另一个命令之后,如何输入命令

所以你进去了:$play

然后出现一个普通的EmbeddeBuilder,向您显示搜索结果,然后您可以通过输入1、2、3、4、5、6、7、8、9或10来选择所需的轨迹

代码如下:

public class PlayCommand implements ServerCommand {
    private final YouTube youTube;

    public PlayCommand() {
        YouTube temp = null;

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

        youTube = temp;
    }

    @Override
    public void performCommand(List<String> args, Member m, TextChannel channel, Message message) throws RiotApiException {
        String input = String.join(" ", args.subList(1, args.size() - 1));

        if (!isUrl(input)) {
            String ytSearched = searchYoutube(channel, input);

            if (ytSearched == null) {
                channel.sendMessage("Keine Ergebnisse!").queue();

                return;
            }


            input = ytSearched;
        }

        PlayerManager manager = PlayerManager.getInstance();

        manager.loadAndPlay(channel, input);
        manager.getGuildMusicManager(channel.getGuild()).player.setVolume(100);
    }

    private boolean isUrl(String input) {
        try {
            new URL(input);

            return true;
        } catch (MalformedURLException ignored) {
            return false;
        }
    }

    @Nullable
    private String searchYoutube(TextChannel channel, String input) {
        String youtubeKey = "AIzaSyDoQ4OInMTYth7hdlWwQSIaHuxpxxv7eJs";

        try {
            List<SearchResult> results = youTube.search()
                    .list("id,snippet")
                    .setQ(input)
                    .setMaxResults(10L)
                    .setType("video")
                    .setFields("items(id/kind,id/videoId,snippet/title,snippet/thumbnails/default/url)")
                    .setKey(youtubeKey)
                    .execute()
                    .getItems();

            if (!results.isEmpty()) {
                String videoId = results.get(0).getId().getVideoId();


                /*EmbedBuilder builder = new EmbedBuilder();
                builder.setTitle("Suchergebnisse");
                builder.setColor(Color.RED);
                builder.setDescription( "1. " + results.get(0).getSnippet().getTitle() + "\n" +
                                        "2. " + results.get(1).getSnippet().getTitle() + "\n" +
                                        "3. " + results.get(2).getSnippet().getTitle() + "\n" +
                                        "4. " + results.get(3).getSnippet().getTitle() + "\n" +
                                        "5. " + results.get(4).getSnippet().getTitle() + "\n" +
                                        "6. " + results.get(5).getSnippet().getTitle() + "\n" +
                                        "7. " + results.get(6).getSnippet().getTitle() + "\n" +
                                        "8. " + results.get(7).getSnippet().getTitle() + "\n" +
                                        "9. " + results.get(8).getSnippet().getTitle() + "\n" +
                                        "10. " + results.get(9).getSnippet().getTitle());

                channel.sendMessage(builder.build()).queue();
                */


                return "https://www.youtube.com/watch?v=" + videoId;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }
}
public类PlayCommand实现ServerCommand{
私人决赛;
公共播放命令(){
YouTube temp=null;
试一试{
temp=newyoutube.Builder(
GoogleNetHttpTransport.newTrustedTransport(),
JacksonFactory.getDefaultInstance(),
无效的
)
.setApplicationName(“JDA Discord Bot”)
.build();
}捕获(例外e){
e、 printStackTrace();
}
youTube=温度;
}
@凌驾
public void performCommand(列表参数、成员m、文本频道、消息消息)引发RiotapieException{
字符串输入=String.join(“,args.subList(1,args.size()-1));
如果(!isUrl(输入)){
字符串YTSearch=searchYoutube(频道,输入);
如果(Y=null){
channel.sendMessage(“Keine Ergebnisse!”).queue();
返回;
}
输入=YT;
}
PlayerManager=PlayerManager.getInstance();
manager.loadAndPlay(频道、输入);
manager.getGuildMusicManager(channel.getGuild()).player.setVolume(100);
}
专用布尔值isUrl(字符串输入){
试一试{
新网址(输入);
返回true;
}捕获(已忽略格式错误的异常){
返回false;
}
}
@可空
私有字符串搜索YouTube(TextChannel频道,字符串输入){
字符串youtubeKey=“AIzaSyDoQ4OInMTYth7hdlWwQSIaHuxpxxv7eJs”;
试一试{
List results=youTube.search()
.list(“id,代码段”)
.setQ(输入)
.setMaxResults(10L)
.setType(“视频”)
.setFields(“项目(id/种类、id/视频id、代码段/标题、代码段/缩略图/默认值/url)”)
.setKey(youtubeKey)
.execute()
.getItems();
如果(!results.isEmpty()){
字符串videoId=results.get(0.getId().getVideoId();
/*EmbeddeBuilder=新的EmbeddeBuilder();
建造商名称(“Suchergebnisse”);
builder.setColor(Color.RED);
builder.setDescription(“1.”+results.get(0).getSnippet().getTitle()+“\n”+
“2.+results.get(1).getSnippet().getTitle()+”\n”+
“3.+results.get(2).getSnippet().getTitle()+”\n”+
“4.+results.get(3).getSnippet().getTitle()+”\n”+
“5.+results.get(4).getSnippet().getTitle()+”\n”+
“6.+results.get(5).getSnippet().getTitle()+”\n”+
“7.+results.get(6).getSnippet().getTitle()+”\n”+
“8.+results.get(7).getSnippet().getTitle()+”\n”+
“9.+results.get(8).getSnippet().getTitle()+”\n”+
“10.+results.get(9.getSnippet().getTitle());
channel.sendMessage(builder.build()).queue();
*/
返回“https://www.youtube.com/watch?v=“+视频ID;
}
}捕获(例外e){
e、 printStackTrace();
}
返回null;
}
}

我想你在找一位服务员。 有了它,你就能实现你想要的

您基本上只是等待一个事件,检查它是否适合您的用例(例如:是一个特定的事件,或者包含一个特定的文本) 查看此关于EventWater的信息,并将其添加为EventListener


例如,您可能希望检查收到的文本是否是youtube搜索结果的一部分。也不要忘记接受答案有一个时间限制。

好的,现在我可以得到消息了,但是该方法在我设置videoId之前返回videoId…我如何解决这个问题?