Упомянутый член JDA - не работает команда - PullRequest
0 голосов
/ 02 августа 2020

Я разрабатываю своего бота для Discord, используя Java и JDA API . До этого я задавал аналогичный вопрос, но столкнулся с другой проблемой.

С этой строки начались проблемы:

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

Спасибо { ссылка } за ответ на предыдущий вопрос, в котором он объяснил мне, что эта строка вызывает ошибку:

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

По той или иной причине возникает ошибка.

Я был пытаюсь найти ответ на вопрос, почему эта команда не работает. Единственное, что я знаю, это то, что эта команда returns пустой массив args. Из-за этого я не могу sh финишировать бота, то есть я не могу проверить, может ли участник выгнать других, и не может ли он сделать основной блок из кода выкинутого члена.

Как я могу исправить эту ошибку и / или написать остальной код? Извините за мой английский sh и большое вам спасибо.

Какой-то код:

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: Пожалуйста, если вы переходите на более раннюю версию, то укажите на ошибки, которые я сделал, а не просто понизьте его, потому что вы этого хотели. Хочу исправлять ошибки, а не портить настроение

1 Ответ

0 голосов
/ 03 августа 2020

Похоже, вы не совсем поняли проблемы в своем коде.

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

Это вызовет IndexOutOfBoundsException, если ваше сообщение не содержит упомянутого участника. Потому что в этом случае список getMentionedMembers() пуст. Нет объекта для доступа. get(0) ничего не может получить.

Чтобы исправить это, вы должны сначала проверить, является ли список пустым или его длина равна нулю, как уже предлагал Минн. Если это так, вы можете отобразить сообщение о том, что им нужно добавить @ username.

Я полагаю, что очистка вашего кода и его реструктуризация очень поможет. Пожалуйста, наберите go и всегда проверяйте, существуют ли необходимые данные в первую очередь и действительно ли они вам нужны. Некоторые вещи необходимы только в небольшом количестве случаев, вызывать их для каждого сообщения / команды - не лучшая практика.

Например, в настоящий момент ваш бот пытается получить первого упомянутого участника из КАЖДОГО сообщения, которое послал. Это не обязательно, поэтому вам это нужно только в том случае, если это команда kick.

Кстати, SelfMember - это сам бот. В своем коде вы говорите пользователю, что у него нет разрешения, хотя у бота (и не обязательно у пользователя) оно может отсутствовать, что может сбивать с толку.

Я не видел этого раньше: ваш бот также получает собственные сообщения. Вы можете проверить, является ли автор сообщения вашим / ботом, прежде чем продолжить.

В конце я бы посоветовал вам всегда пытаться понять ответ или совет, который вам дают. Если задать другой вопрос по той же проблеме, это не поможет вам и не проливает хорошего света на вас и вашу попытку учиться.

...