JDA 提到的成员 - 不工作命令

JDA Mentioned member - not working command

我正在使用 JavaJDA API 开发我的 discord 机器人。在那之前我问过类似的问题,但是我 运行 进入了另一个问题。

问题从这一行开始:

final Member MentionedMem = event.getMessage().getMentionedMembers().get(0);

感谢 https://whosebug.com/users/10630900/minn 回答上一个问题,他向我解释了这一行导致了错误:

java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0

出于某种原因,它会引发错误。

我试图找到此命令为何不起作用的答案。我唯一知道的是这个命令 returns 是一个空数组 args。因此,我无法完成bot,即无法检查成员是否可以踢其他人,也无法使主要代码块踢成员。

如何修复此错误和/或编写其余代码? 对不起我的英语,非常感谢你。

一些代码:

public class KickComm extends ListenerAdapter {

    public void onGuildMessageReceived(GuildMessageReceivedEvent event) {
        String[] message = event
                .getMessage()
                .getContentRaw()
                .split(" ");

        // final Member target = event.getMessage().getMentionedMembers().get(0); ERROR CUZ I DONT NOW WHY
        
        final Member SelfMember = event
                .getGuild()
                .getSelfMember();

        if(message[0].equalsIgnoreCase(Main.prefix + "kick"))
        {                                                                                                   
            if (message.length < 2) {

                EmbedBuilder NoUser = new EmbedBuilder();
                NoUser.setColor(0xff3923);
                NoUser.setTitle("\uD83D\uDD34You need to add a <@username> and <reason>");
                NoUser.setFooter("Usage: " + Main.prefix + "kick <@username> <reason>.",
                        Objects
                                .requireNonNull(event.getMember())
                                .getUser()
                                .getAvatarUrl());

                event
                        .getChannel()
                        .sendMessage(NoUser.build())
                        .queue();

                NoUser.clear();

            } else if (message.length < 3) {                                                                

                EmbedBuilder NoReason = new EmbedBuilder();
                NoReason.setColor(0xff3923);
                NoReason.setTitle("\uD83D\uDD34You need to add a <reason>.");
                NoReason.setFooter("Usage: " + Main.prefix + "kick <@username> <reason>.",
                        Objects
                                .requireNonNull(event.getMember())
                                .getUser()
                                .getAvatarUrl());

                event
                        .getChannel()
                        .sendMessage(NoReason.build())
                        .queue();

                NoReason.clear();

            } else if(!SelfMember.hasPermission(Permission.KICK_MEMBERS)) {

                EmbedBuilder NoPermission = new EmbedBuilder();
                NoPermission.setColor(0xff3923);
                NoPermission.setTitle("\uD83D\uDD34You don't have permission to use this command.");
                NoPermission.setFooter("Usage: " + Main.prefix + "kick <@username> <reason>.",
                        Objects
                                .requireNonNull(event.getMember())
                                .getUser()
                                .getAvatarUrl());

                event
                        .getChannel()
                        .sendMessage(NoPermission.build())
                        .queue();

                NoPermission.clear();

            } else if(!Objects.requireNonNull(event.getMember()).hasPermission(Permission.KICK_MEMBERS) || !event.getMember().canInteract(target)) {        //Example, don't works 

                EmbedBuilder NoPermission = new EmbedBuilder();
                NoPermission.setColor(0xff3923);
                NoPermission.setTitle("\uD83D\uDD34You don't have permission to use this command.");
                NoPermission.setFooter("Usage: " + Main.prefix + "kick <@username> <reason>.",
                        Objects
                                .requireNonNull(event.getMember())
                                .getUser()
                                .getAvatarUrl());

                event
                        .getChannel()
                        .sendMessage(NoPermission.build())
                        .queue();

                NoPermission.clear();
            }
        }
    }
}

UPD:如果你降级,请指出我犯的错误,而不是因为你想降级。我要改正错误,不要毁了你的心情

您似乎没有完全理解代码中的问题。

final Member target = event.getMessage().getMentionedMembers().get(0);

如果您的消息不包含提及的成员,这将引发 IndexOutOfBoundsException。因为在这种情况下 getMentionedMembers() 的列表是空的。没有可访问的对象。 get(0)什么也拿不到。

为了解决这个问题,您必须首先检查列表是否为空,或者长度是否为零,正如 Minn 已经建议的那样。如果是,您可以显示一条消息,说明他们需要添加@username。

我想清理你的代码并相应地重组它会有很大帮助。请检查它并确保始终检查所需的数据是否首先存在以及您是否真的需要它。有些东西只在少数情况下需要,在每条消息/命令上调用它们并不是好的做法。

例如,目前您的机器人试图从发送的每条消息中获取第一个提到的成员。这不是必需的,因此只有在它是 kick 命令时才需要它。

顺便说一句,SelfMember 是机器人本身。在您的代码中,您告诉用户他们没有权限,尽管机器人(不一定是用户)可能缺少权限,这可能会造成混淆。

我之前没看到:您的机器人也在接收自己的消息。在继续之前,您可能需要检查消息的作者是否是您的/机器人。

最后,我建议您始终尝试理解给您的答案或建议。就同​​一问题提出另一个问题对您没有帮助,也不会为您和您的学习尝试投下好光。

User mentionedUser = event.getMessage().getMentionedMembers().get(0).getUser();

如果有人还需要它...

由于某种原因,问题是您使用了 Member 而不是 User。 此外,您必须使用 .getUser() 才能真正获得您想要的用户。