【问题标题】:Discord JDA - Invalid Member ListDiscord JDA - 无效的成员列表
【发布时间】:2020-07-28 07:18:05
【问题描述】:

我正在创建一个 Discord 机器人,但遇到了一个奇怪的问题。我需要遍历服务器上的每个用户并执行条件操作。但是当收到所有成员的列表时,它只包含我和机器人本身。

public class Bot extends ListenerAdapter {
    public void onGuildMessageReceived(GuildMessageReceivedEvent Event) {
        String Message = Event.getMessage().getContentRaw();

        if(Message.charAt(0) == Globals.BOT_PREFIX) {
            String[] Args = Message.split("\\s+");

        if(Args[0].equalsIgnoreCase(CommandType.COMMAND_DEV_TEST)) {
            List<Member> MemberList = Event.getGuild().getMembers();
            for(int i = 0; i < MemberList.size(); i++)
                System.out.println(MemberList.get(i));
        }
    }
}

如果另一个人写,那么仍然只显示我和机器人。

【问题讨论】:

    标签: java bots discord discord-jda


    【解决方案1】:

    我假设您使用的是 4.2.0 版本(4.1.1_102 及更高版本)的开发版本

    在这些版本中,引入了新的工厂方法,以使人们了解新的 discord API 设计。未来,bot 将仅限于缓存默认连接到语音通道的成员。

    如果您只需要成员数,您可以使用Guild#getMemberCount!否则:

    createDefault/createLight 只会缓存连接到语音频道的成员或公会所有者(一见钟情)。要缓存更多成员,您必须在机器人的应用程序仪表板和 JDA 中启用 GUILD_MEMBERS 意图。

    现在你可以这样做了:

    JDA api = JDABuilder.createDefault(token)
                        .setMemberCachePolicy(MemberCachePolicy.ALL)
                        .enableIntents(GatewayIntent.GUILD_MEMBERS)
                        .build();
    

    需要GUILD_MEMBERS 意图,因为它使GUILD_MEMBER_REMOVE 调度能够告诉库在成员被踢/禁止/离开时从缓存中删除。

    此设置将执行延迟加载,这意味着它将仅从语音成员开始,并在他们激活后将更多成员添加到缓存中。

    要在启动时加载所有成员,您必须另外启用成员分块

    JDABuilder.createDefault(token)
              .setChunkingFilter(ChunkingFilter.ALL) // enable member chunking for all guilds
              .setMemberCachePolicy(MemberCachePolicy.ALL) // ignored if chunking enabled
              .enableIntents(GatewayIntent.GUILD_MEMBERS)
              .build();
    

    您也可以使用Guild#loadMembersGuild#findMembers 为各个公会加载它们。

    我建议您也阅读这篇 JDA wiki 文章:Gateway Intents and Member Cache Policy

    【讨论】:

    • 是的,这正是我们所需要的。非常感谢。
    • loadMembers 是如何工作的?从文档来看,它似乎对我正在尝试实现的功能很有用,但我对 java 不是很精通,所以我不知道 Task 是如何工作的。它就像一个承诺一样吗?任务结束处理后如何获取最终成员列表?
    猜你喜欢
    • 2021-06-02
    • 2022-01-05
    • 2020-08-09
    • 2020-10-23
    • 2021-05-05
    • 2021-12-20
    • 2021-05-07
    相关资源
    最近更新 更多