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

Posted

技术标签:

【中文标题】JDA Discord 音乐机器人的 Youtube 搜索命令【英文标题】:Youtube Search Command for JDA Discord Music Bot 【发布时间】:2021-01-28 01:44:30 【问题描述】:

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

一开始只用简单的命令等。但慢慢地我也投入到音乐机器人这个话题上。

我还为此使用了 YouTube 数据 API,到目前为止一切正常。但是,我现在想合并一个 Youtube 搜索命令或将其构建到另一个(播放命令)中。我已经有半条搜索命令了。

到目前为止你可以做到$play(歌曲标题)

将选择找到的第一首曲目。

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

我已经想出了如何显示搜索结果,但是现在我需要一些帮助来了解如何输入一个命令,在你已经输入了另一个命令之后。

所以你输入:$play Faded

然后会出现一个普通的 EmbedBuilder 并向您显示搜索结果,然后您可以通过输入 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;
    

【问题讨论】:

【参考方案1】:

我认为您正在寻找 EventWaiter。 使用JDA-Utilities,您可以实现您想要的。

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

例如,您需要检查接收到的文本是否是 youtube 搜索结果的一部分。另外不要忘记接受答案的时间限制。

【讨论】:

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

以上是关于JDA Discord 音乐机器人的 Youtube 搜索命令的主要内容,如果未能解决你的问题,请参考以下文章

使用 JDA 制作的 Discord 机器人正在删除不正确的消息

JDA Discord 向消息添加反应

Discord JDA - 有时有效,有时无效

Discord JDA OnReady 不起作用

如何使用 JDA 在 Discord 中创建文本通道:Java Discord Api

Discord JDA 无法创建角色