使用Discord-JDA的Java机器人仅更新第二位选中用户的语音频道权限问题
问题原因及解决方案
核心问题
- 选中成员获取错误:你用
event.getMentions().getMembers()来获取选中用户,但EntitySelectInteraction中,菜单选中的实体应该通过event.getSelectedEntities()获取,getMentions()是用来获取消息中@提及的用户,不是菜单选中的对象,这会导致你实际操作的不是选中的第一个用户。 - 重复创建管理器并单次提交:每次循环都调用
getManager()生成新的频道管理器实例,每次修改后立即complete(),第二次的操作会覆盖第一次的修改请求,最终只有最后一次的权限设置生效。
修复后的代码
// 获取选中的用户成员列表 List<Member> selectedMembers = event.getSelectedEntities().stream() .filter(entity -> entity instanceof Member) .map(Member.class::cast) .collect(Collectors.toList()); // 确保选中了至少两位用户 if (selectedMembers.size() >= 2) { VoiceChannel voiceChannel = event.getMember().getVoiceState().getChannel().asVoiceChannel(); VoiceChannelManager manager = voiceChannel.getManager(); // 批量添加权限覆盖 for (Member member : selectedMembers.subList(0, 2)) { manager.putMemberPermissionOverride( member.getIdLong(), null, EnumSet.of(Permission.VOICE_CONNECT) ); } // 一次性提交所有修改 manager.complete(); }
关键改动说明
- 改用
event.getSelectedEntities()获取菜单选中的用户,确保操作对象正确。 - 只创建一次
VoiceChannelManager实例,批量添加所有需要的权限覆盖后,再调用complete()提交,避免多次提交导致的覆盖问题。 - 增加了列表长度判断,防止索引越界异常。
内容的提问来源于stack exchange,提问作者Николай
相关产品推荐
相关产品推荐

