JDA 5;指定的 ID 不是有效的雪花

JDA 5; The Specified ID is not a valid snowflake

我一直在尝试为我的小型审核机器人编写一个命令,它接受语法中提到的用户,并在指定的特定时间内为他们分配一个角色。

但是,无论我尝试什么代码,我的 IDE 都会对我大喊大叫,或者我通常会收到完全相同的错误消息。当我尝试像

这样的代码时
       if (args.length == 2) {
          Member member = event.getGuild().getMemberById(args[1].replace("<@", "").replace(">", ""));
          Role role = (Role) event.getGuild().getRolesByName("Muted", true);

我在此处的控制台中不断收到此错误消息:

[JDA MainWS-ReadThread] ERROR JDA - One of the EventListeners had an uncaught exception
java.lang.NumberFormatException: The specified ID is not a valid snowflake (<@!389127045520556043>). Expecting a valid long value!

然而,每当我尝试像

这样的代码时
 if (args.length == 2) {
    Member member = (Member) event.getGuild().getMembersByName(args[1], true);
    Role role = (Role) event.getGuild().getRolesByName("Muted", true);

我得到的错误是

[JDA MainWS-ReadThread] ERROR JDA - One of the EventListeners had an uncaught exception
java.lang.ClassCastException: class java.util.Collections$UnmodifiableRandomAccessList cannot be cast to class net.dv8tion.jda.api.entities.Member (java.util.Collections$UnmodifiableRandomAccessList is in module java.base of loader 'bootstrap'; net.dv8tion.jda.api.entities.Member is in unnamed module of loader 'app')

尽管我的 IDE 告诉我将 Member 变量和 Role 变量转换为它们各自的类型。

我四处张望,甚至尝试在 JDA 5 纪录片中寻找答案,但无济于事。我确实创建了这个 Whosebug 帐户,因为我不知道还能做什么。

好的,这将对 JDA 获取人才的方式做一些解释。在 JDA 5 中,这根本没有改变。但是让我们从第一行代码开始。

       if (args.length == 2) {
          Member member = event.getGuild().getMemberById(args[1].replace("<@", "").replace(">", ""));
          Role role = (Role) event.getGuild().getRolesByName("Muted", true);

据我所知,您是通过将提及作为字符串提取并使用 ID 从中获取成员的。但是,JDA 有一个内置方法可以为您执行此操作,也称为 Message#getMentionedMembers();。 (这样更稳定,因为它不依赖于从提及的消息中获取 Id。并且在某些情况下,提及也会包含一个 ! 在开头)。

要解决此问题,您可以使用此代码:

List<Member> members = event.getMessage().getMentionedMembers();
List<Role> roles = event.getGuild().getRolesByName("Muted", true);
if (members.size() != 1) {return;} // Or add code here to handle the mistake, this will depend on how you're handeling commands
if (roles.size() != 1) {return;} // Might wanna add a handler in here, or store the ID of the role in a database/file. This will return if either there are no roles, or if there are more then 1 role called muted)

Member member = members.get(0); // We get the single member in the list, since we made it so we can only have 1 member
Role role = roles.get(0); // Same for the role

event.getGuild().addRoleToMember(member, role).queue();
// The rest of your code, this can be logging the moderation. Or doing other stuff like doing it on other guilds.

解释第二行代码中的问题:

 if (args.length == 2) {
    Member member = (Member) event.getGuild().getMembersByName(args[1], true);
    Role role = (Role) event.getGuild().getRolesByName("Muted", true);

您正在尝试获取一个成员对象,并将其转换为一个列表对象的成员对象。这是 Java 不喜欢的东西,所以它抛出 NPE。上面的代码解决了这个问题,通过不转换任何东西,而是在两者的列表中获取项目。当您请求“getRolesByName”和“getMembersByName”时。