当前位置: 首页 > 知识库问答 >
问题:

YouTube搜索命令为JDA不和谐音乐机器人

左丘昕
2023-03-14

我已经在不和谐机器人上工作了几天。

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

我也使用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;
    }
}

共有1个答案

裴俊能
2023-03-14

我想你在找服务员。使用JDA实用程序,您可以实现您想要的。

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

例如,你会想检查收到的文本是否是youtube搜索结果的一部分。也不要忘记接受答案有时间限制。

 类似资料:
  • 当我在discord内部运行以下脚本(“cmd中的node musicbot.js”)和“!play ytlink”时,bot加入语音通道,并在控制台中记录命令和链接。然而,音乐并没有开始播放。我安装了ffmpeg、ytdl核心和discord。js。 有人能帮我吗?我不知道是哪一部分搞砸了。

  • 我已经创建了一个bot,它现在在我的discord服务器中,使用下面的代码。 我的问题是,一旦我在与bot不和谐的聊天中,我如何调用命令让bot运行代码,为用户列表收集csv?我不确定如何调用机器人,一旦它在聊天/服务器中获得列表。

  • 我开始写一个Discord机器人,但我已经设法遇到了一个问题。我只是写了他写的东西,做了一些小改动,不会对程序产生太大影响。我有两个类,主类只获取bot的令牌,然后使用 下面是MyBot.cs: 它可以连接,机器人也可以在线。这是我的控制台中的输出: 当我现在打字的时候。一般来说,什么都不会发生。控制台中没有,一般情况下也没有。我已经看过了,但它并没有解决我的问题 编辑:我知道我应该使用Comma

  • 在有2个问题。 首先,我试图制作一个音乐机器人来处理不和谐,它一直很好,直到我试图播放它的另一首歌,播放另一首歌(也许排队?)我不得不从语音频道离开机器人,再次编写播放命令(这不是我想要的),还试图从音乐标题播放,而不仅仅是从网址播放(因为它一团糟,去youtube复制链接我想玩的每首歌),但它只有当我把标题之间undescore(像!玩name_of_the_song)我尝试了很多东西,但似乎都

  • 我想制作一个可分页队列命令,这样我就可以用反应控制整个队列。但是,每当我运行命令时,总是会出现错误。因此,我希望每当消息作者对⏹" 反应。这是我的密码: 但是,即使在机器人对停止反应作出反应时删除它。我从bot收到一条消息,说发生了一个错误。我无法理解为什么,也无法理解如何解决它。你能帮我吗?提前谢谢!

  • 当用户使用搜索命令时,我的机器人将用结果和表情符号回复。如何检查用户是否单击此表情符号? 事件回复(idResults.getMovieResults()。获取(0)。toString())。队列();事件getChannel()。sendMessage(“单击将其添加到您关注的列表中”)。队列(msg)-