如何通过JDA开发的机器人将Discord旧消息反应复制到新角色消息
结论
Discord平台明确禁止机器人代用户执行添加反应的自主操作,没有官方API支持直接将旧消息的用户反应复制到新消息上,你初步的判断是正确的。可以通过以下两种适配方案解决你的需求:
方案1:无感知角色同步(推荐)
该方案不需要用户做任何操作,完全不影响用户已有的角色权限:
- 先通过JDA拉取旧消息所有反应的用户数据,存储「用户ID-表情关联角色」的映射表
- 生成与旧消息样式完全一致的新embed角色分配消息,提前添加所有对应表情作为初始反应
- 根据已存储的映射表,批量为所有用户保留原有角色即可
- 可删除旧消息或在旧消息置顶提示后续新用户到新消息反应获取角色
注意:批量添加角色时不需要关闭JDA默认的速率限制处理,按默认规则请求即可避免触发平台限流。
方案2:半自动化反应补全
如果需要新消息的反应计数和用户列表完全对齐旧消息,可以搭配该方案使用:
- 完成方案1的角色同步操作后,向所有已在旧消息反应过的用户发送定向通知,说明角色已自动保留,若需要在新消息展示自己的反应可手动点击,不会影响已有权限
- 后续新用户直接通过新消息的反应逻辑获取角色即可
JDA拉取旧消息反应用户代码示例
// 初始化旧消息所在频道实例 TextChannel oldChannel = jda.getTextChannelById("你的旧消息所在频道ID"); if (oldChannel != null) { // 拉取旧消息实体 oldChannel.retrieveMessageById("你的旧消息ID").queue(oldMessage -> { // 遍历旧消息下的所有反应 for (MessageReaction reaction : oldMessage.getReactions()) { Emoji targetEmoji = reaction.getEmoji(); // 拉取该反应下的所有用户,单页最多1000条,超过需调用分页重载方法 reaction.retrieveUsers().queue(reactionUsers -> { for (User user : reactionUsers) { // 此处自行实现用户ID、对应表情、关联角色的本地存储逻辑 System.out.printf("用户ID:%s 反应表情:%s%n", user.getId(), targetEmoji.getName()); } }); } }); }
内容的提问来源于stack exchange,提问作者SteveB
相关产品推荐
相关产品推荐

