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

Posted

技术标签:

【中文标题】JDA 5;指定的 ID 不是有效的雪花【英文标题】:JDA 5; The Specified ID is not a valid snowflake 【发布时间】:2022-01-12 20:34:32 【问题描述】:

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

但是,无论我尝试什么代码,要么我的 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 纪录片中寻找答案,但无济于事。我真的创建了这个 *** 帐户,因为我不知道还能做什么。

【问题讨论】:

getByName getter 返回列表,您应该像使用任何其他列表一样使用它们。 现在它实际上正在检索提到的成员,但是现在它仍然没有执行其余的命令。 【参考方案1】:

好的,这将需要对 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”时。

【讨论】:

非常感谢!感谢您对此的解释。我一直在使用几年前的教程,并且对这些教程进行了一些研究,很难解析当时有效的方法和现在有效的方法。 如果您有更多问题,我建议您加入 JDA Discord,因为这里的大多数人都可以帮助您及时了解您所面临的问题。还有为什么某事可能会或可能不会奏效。邀请在这里:discord.gg/jda 如果这有助于您解决问题,请单击绿色复选标记将其标记为解决方案。这有助于其他人找到问题的原因

以上是关于JDA 5;指定的 ID 不是有效的雪花的主要内容,如果未能解决你的问题,请参考以下文章

雪花算法(SnowFlake)

雪花数据库中的公共模式

如何使用 Discord API 指定父类别?

使用雪花连接器和 COPY INTO 功能将 csv 上传到雪花时如何指定分隔符

在 JDA 中向提及的用户添加角色

确定 DST 是不是对给定 time_t 的指定时区有效