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

使用Discord-JDA的Java机器人仅更新第二位选中用户的语音频道权限问题

问题原因及解决方案

核心问题

  1. 选中成员获取错误:你用event.getMentions().getMembers()来获取选中用户,但EntitySelectInteraction中,菜单选中的实体应该通过event.getSelectedEntities()获取,getMentions()是用来获取消息中@提及的用户,不是菜单选中的对象,这会导致你实际操作的不是选中的第一个用户。
  2. 重复创建管理器并单次提交:每次循环都调用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,提问作者Николай

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 16:39:55