Разбанить команду JDA 4.1.1_101, не могу заставить ее работать, и я не знаю почему - PullRequest
0 голосов
/ 30 мая 2020

Я кодирую бота Discord с помощью JDA 4.1.1_101. Я создал команду "запретить", но не могу заставить ее работать. Не понимаю, почему ... Спасибо за помощь.

if (args[0].equalsIgnoreCase(Main.prefix + "unban")) {
            if(event.getGuild().getSelfMember().hasPermission(Permission.BAN_MEMBERS)) {
                if (args.length > 0 && args.length < 3) {

                    try {
                        event.getMessage().delete().queue();
                        User member = event.getMessage().getMentionedMembers().get(0).getUser();

                        String id = member.getId();

                        event.getGuild().unban(id).queue();
                        EmbedBuilder ban = new EmbedBuilder();
                        ban.setColor(Color.GREEN);
                        ban.setTitle("UnBan");
                        ban.setDescription("UnBan Report");
                        ban.addField("Staffer: ", event.getMessage().getAuthor().getName(), true);
                        ban.addField("Unban: ", member.getName(), true);

                        logs.sendMessage(ban.build()).queue();

                    } catch (IndexOutOfBoundsException exx) {
                        EmbedBuilder error = new EmbedBuilder();
                        error.setColor(0xff3923);
                        error.setTitle("Error: User");
                        error.setDescription("Invalid user.");
                        event.getChannel().sendMessage(error.build()).queue(message -> {
                            message.delete().queueAfter(5, TimeUnit.SECONDS);
                        });
                    }

                } else {
                    EmbedBuilder error = new EmbedBuilder();
                    error.setColor(0xff3923);
                    error.setTitle("Error: Wrong usage.");
                    error.setDescription("Use: .unban [@user].");
                    event.getChannel().sendMessage(error.build()).queue(message -> {
                        message.delete().queueAfter(5, TimeUnit.SECONDS);
                    });
                }

            }
        }

1 Ответ

1 голос
/ 31 мая 2020

Проблема в том, что вы пытаетесь извлечь пользователя из упоминания в сообщении.

Поскольку пользователь больше не является частью гильдии, похоже, что это не работает.

Чтобы обойти эту проблему, вам необходимо получить идентификатор вручную.

Упоминание всегда в формате <@userid> или <!@userid>.

Чтобы получить идентификатор, вы можете просто разделить сообщение и заменить ненужные части, например String id = event.getMessage().getContentRaw().split("<")[1].split(">")[0].replace("!", "").replace("@", "");

Я уверен, что есть лучшие и более удобные способы сделать это. ;)

Лучшим способом получения идентификатора было бы использование регулярного выражения, такого как <@!?(\d+)>, как упомянуто Минном.

Чтобы получить имя пользователя, вы просто нужен идентификатор через event.getJDA().getUserById(id).getName().

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

(Дополнение: я пробовал использовать .getMentionedUsers() с тем же результатом, что и OP.)

...