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

用户离开语音频道时编辑用户触发DiscordAPIError问题求助

解决Discord机器人在用户离开语音频道时的角色移除失败与静音报错问题

嘿,我完全懂你折腾好几天的烦躁——第一次写Discord机器人总会遇到这种看似简单但卡壳的问题,别自责!咱们一步步拆解解决:

问题根源分析

  1. 静音报错的核心原因:你看到的DiscordAPIError: Target user is not connected to voice已经说得很清楚了。当用户离开语音频道后,oldMember.voice已经没有有效的语音连接会话,这时候调用setMute(false)自然会失败——服务器根本找不到这个用户的语音状态,操作毫无意义还会抛出错误。
  2. 角色移除无效的可能诱因:日志显示执行了但实际没生效,大概率是这几个问题:异步操作没做完整处理、机器人权限不足,或者角色查找时的名称大小写/拼写和服务器实际角色不匹配(比如服务器里的角色是hushed而非Hushed)。

修复后的代码及细节解释

我调整了你的代码,针对性解决了这两个问题:

client.on('voiceStateUpdate', (oldState, newState) => {
  const oldServer = oldState.guild;
  const oldChannel = oldState.channel;
  const oldMember = oldState.member;

  // 仅处理用户离开语音频道的场景(排除静音操作触发的状态更新)
  if (oldChannel && oldChannel !== newState.channel) {
    console.log(`${oldMember.user.tag} left channel ${oldChannel.name} (${oldServer.name}).`);
    
    // 先找到Hushed角色,避免后续操作因角色不存在报错
    const hushedRole = oldServer.roles.cache.find(role => role.name === 'Hushed');
    if (!hushedRole) {
      console.error(`警告:服务器${oldServer.name}中找不到"Hushed"角色!`);
      return;
    }

    // 用角色ID检查归属,比名称匹配更可靠
    if (oldMember.roles.cache.has(hushedRole.id)) {
      // 异步移除角色,完整处理成功/失败情况
      oldMember.roles.remove(hushedRole)
        .then(() => {
          console.log(`- 已从${oldMember.user.tag}移除"Hushed"角色`);
        })
        .catch(error => {
          console.error(`移除角色失败(用户:${oldMember.user.tag}):`, error);
        });
      
      // 删掉了取消静音的代码:用户已经离开语音,这个操作完全无效还会报错
      // 等用户下次进语音时,只要没有Hushed角色,就不会被机器人静音,完全不影响后续流程
    }
  }
});

额外优化建议

  • 改用角色ID查找:把角色名称换成角色ID(比如const hushedRole = oldServer.roles.cache.get('你的角色ID')),这样就算角色名称被修改,代码也不会失效,比用名称查找稳定得多。
  • 检查机器人权限:确保你的机器人角色在服务器角色列表里高于Hushed角色,并且拥有Manage Roles权限——没有这些权限,机器人根本没法修改用户的角色。
  • 异步操作必须处理:Discord.js的很多操作都是异步Promise,一定要用.then()或async/await处理成功和失败回调,不然可能出现日志显示执行了但实际没完成的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 23:42:34