如何在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(); }); }); }); } }
几个关键细节提醒你:
- 机器人需要拥有
MESSAGE_HISTORY权限,否则无法获取反应的用户列表,会抛出权限不足的异常 retrieveUsers()默认一次最多返回100个用户,如果你的场景可能超过这个数,需要用分页逻辑循环获取(不过大部分小服务器场景一次就够了)- 用
EmbedBuilder(originalEmbed)初始化可以省去手动复制标题、描述等属性的麻烦,代码更简洁也不容易出错
内容的提问来源于stack exchange,提问作者qwertydev
相关产品推荐
相关产品推荐

