You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Discord JDA中获取已反应用户列表并编辑嵌入消息?

获取Discord JDA中已反应的用户列表以更新嵌入消息

我正在尝试制作一个机器人,实现添加反应后编辑嵌入消息的功能——具体是向旧嵌入消息添加一个包含已反应用户列表的字段。我使用的是最新版本的Discord JDA,请问如何获取已反应用户列表?

以下是我的代码:

public void onMessageReactionAdd(MessageReactionAddEvent e) { 
    if (e.getReactionEmote().getName().equals("👍")) { 
        if (!e.getUser().isBot()) { 
            e.getChannel().retrieveMessageById(e.getMessageId()).queue(p -> { 
                if (p.getEmbeds().size() > 0) { 
                    if (p.getEmbeds().get(0) != null) { 
                        EmbedBuilder gameEmbedWithPlayers = new EmbedBuilder() 
                            .setTitle(p.getEmbeds().get(0).getTitle()) 
                            .setDescription(p.getEmbeds().get(0).getDescription()) 
                            .setThumbnail(p.getEmbeds().get(0).getThumbnail().getUrl()) 
                            .setFooter(p.getEmbeds().get(0).getFooter().getText(), p.getEmbeds().get(0).getFooter().getIconUrl()) 
                            .setColor(p.getEmbeds().get(0).getColor()) 
                            // help here 
                            .addField("👥 Players", REACTIONED USERS, false); 
                        p.editMessage(gameEmbedWithPlayers.build()).queue(); 
                    } 
                } 
            }); 
        } 
    } 
}

嘿,我之前刚好做过类似的功能,能给你一些实际的解决方案!

在JDA里要获取某个反应的用户列表,核心是用MessageReaction#retrieveUsers()方法,不过得注意JDA的异步特性,不能直接同步获取结果。我帮你把代码调整一下,同时做了些优化:

public void onMessageReactionAdd(MessageReactionAddEvent e) { 
    if (e.getReactionEmote().getName().equals("👍") && !e.getUser().isBot()) { 
        e.getChannel().retrieveMessageById(e.getMessageId()).queue(p -> { 
            if (p.getEmbeds().isEmpty()) return; // 简化空嵌入的判断逻辑
            MessageEmbed originalEmbed = p.getEmbeds().get(0);
            
            // 找到消息上对应的👍反应
            p.getReactions().stream()
                .filter(reaction -> reaction.getReactionEmote().getName().equals("👍"))
                .findFirst()
                .ifPresent(reaction -> {
                    // 异步获取该反应的所有用户,同时过滤掉机器人
                    reaction.retrieveUsers()
                        .filter(user -> !user.isBot())
                        .queue(users -> {
                            // 将用户列表格式化成@提及的字符串,也可以换成用户名
                            String userList = users.stream()
                                .map(User::getAsMention)
                                .collect(Collectors.joining("\n"));
                            
                            // 处理没有用户的情况,避免字段空白
                            if (userList.isEmpty()) {
                                userList = "还没有玩家加入哦!";
                            }
                            
                            // 直接用原Embed初始化Builder,不用手动复制所有属性
                            EmbedBuilder gameEmbedWithPlayers = new EmbedBuilder(originalEmbed)
                                .addField("👥 Players", userList, false);
                            
                            p.editMessage(gameEmbedWithPlayers.build()).queue();
                        });
                });
        }); 
    } 
}

几个关键细节提醒你:

  1. 机器人需要拥有MESSAGE_HISTORY权限,否则无法获取反应的用户列表,会抛出权限不足的异常
  2. retrieveUsers()默认一次最多返回100个用户,如果你的场景可能超过这个数,需要用分页逻辑循环获取(不过大部分小服务器场景一次就够了)
  3. 用EmbedBuilder(originalEmbed)初始化可以省去手动复制标题、描述等属性的麻烦,代码更简洁也不容易出错

内容的提问来源于stack exchange,提问作者qwertydev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:31:09