【问题标题】:How to detect when a user leaves a voice channel in Discord with discord.js V12如何使用 discord.js V12 检测用户何时离开 Discord 中的语音频道
【发布时间】:2021-02-28 03:05:13
【问题描述】:

我正在 v12 上制作一个 Discord.js 机器人,其中包含一个静音命令,该命令可将您所在的整个语音频道静音。问题是当有人离开频道时,他们会保持静音。我正在尝试通过一个简单的事件来解决此问题以取消静音,但我不理解VoiceStateUpdateOldStateNewState。我已经广泛搜索,但我只能找到一个加入VC,而不是离开。这是我到目前为止得到的:

静音命令:

    else if (command === 'mute') {
        message.delete()
        if (!message.member.roles.cache.has('') && !message.member.roles.cache.has('')) {
            message.reply('You don\'t have permission to use this commmand!')
            .then(message => {
                message.delete({ timeout: 5000 })
            }).catch();
            return;
        }
        if (message.member.voice.channel) {
            let channel = message.guild.channels.cache.get(message.member.voice.channel.id);
            for (const [memberID, member] of channel.members) {
            member.voice.setMute(true);
            }
        } else {
            message.reply('You need to join a voice channel first!')
            .then(message => {
                message.delete({ timeout: 5000 })
            }).catch();
        }
    }

取消静音事件:

client.on('voiceStateUpdate', (oldState, newState) => {
    if (oldState.member.user.bot) return;

    if (oldState.member.user !== newState.member.user) member.voice.setMute(false);
});

感谢您抽出宝贵时间帮助我! :)

【问题讨论】:

  • 编辑:正如下面的一个人所说,改变已经离开的用户的状态是行不通的,所以我们可以在用户加入语音频道时这样做,如果你能帮助我的话?

标签: javascript discord discord.js bots mute


【解决方案1】:

根据this link(我还没有测试过)你需要这样的东西:

const Discord = require("discord.js")
const bot = new Discord.Client()

bot.login('*token*')

bot.on('voiceStateUpdate', (oldState, newState) => {
  let newUserChannel = newState.voiceChannel
  let oldUserChannel = oldState.voiceChannel


  if(oldUserChannel === undefined && newUserChannel !== undefined) {

     // User Joins a voice channel

  } else if(newUserChannel === undefined){

    // User leaves a voice channel

  }
})

【讨论】:

  • 这只有在某人第一次加入语音频道时才有效,而不是当他们从一个 VC 切换到另一个时才有效。
【解决方案2】:

嗯,你已经在正确的轨道上。您应该做的是检查某人在离开语音频道时是否被静音,然​​后删除该静音。

让我们开始吧。

首先,我们检查此人是否正在离开语音频道。这很重要,因为每次有人对他们的声音做任何事情(即静音或加入)时都会触发voiceStateUpdate 事件。我们通过检查 oldState.channelIDnull 还是 undefined 来做到这一点,因为这表示加入。

if (oldState.channelID === null || typeof oldState.channelID == 'undefined') return;

接下来我们需要检查离开的人是否静音,如果没有,则返回。

if (!oldState.member.voice.mute) return;

最后我们移除静音。

oldState.member.voice.setMute(false);

所以你的整个voiceStateUpdate 应该看起来像这样。

client.on('voiceStateUpdate', (oldState, newState) => {
    if (oldState.channelID === null || typeof oldState.channelID == 'undefined') return;
    if (!oldState.member.voice.mute) return;
    oldState.member.voice.setMute(false);
});

【讨论】:

  • 有些东西不能正常工作:(。我尝试了你的方法,但是当我让 VC 静音时它并没有取消静音,并且它干扰了 /mute 命令,因为它在那之后立即取消了我的静音. 我试着做一些 if - return 语句,但我似乎无法让它工作。完整版:12.4.1
【解决方案3】:
client.on('voiceStateUpdate', (oldMember, newMember) => {
  const oldUserChannel = oldMember.voice.channelID
  const newUserChannel = newMember.voice.channelID

 if (oldUserChannel === 'MUTED CHANNEL ID' && newUserChannel !== 'MUTED CHANNEL ID') {
    newMember.voice.setMute(false);
  }
});

你可以在json文件中写入静音频道的id并从那里获取,我想不出另一种方式,对不起:(

【讨论】:

  • 只有在你知道离开的人在哪个频道时才有效。另外,你忘了定义newUserChannel
  • 我认为它会起作用,但这不是我需要的。感谢您的时间和精力:)
【解决方案4】:

你不能操纵不在语音频道上的人的语音状态,这会导致DiscordAPIError: Target user is not connected to voice.,即使你可以,你可能仍然不想这样做,因为即使你不'不会得到另一个未处理的承诺错误,你可能仍然会通过检查新状态的通道是否为空来获得无限循环,因为一旦你取消静音,它就会触发另一个具有空通道的事件等等。

因此,我现在的看法是,您的问题的一个可能解决方案是在用户加入频道时取消静音。如果有人可以找出更好的方法来检查它是否是正在发生的频道离开,而不是仅使用newState.channel === null,则可能没有必要这样做。无论如何,如果您可以在加入时取消静音,您可以这样做:

client.on('voiceStateUpdate', (oldState, newState) => {
  if (oldState.channel === null && newState.channel !== null) {
    newState.setMute(false);
  }
});

请注意,如果有人在离开后恰好加入频道,这可能会出错,否则,您应该没有问题。

【讨论】:

  • 感谢您的回答!它可以在加入 VC 以取消静音用户时工作......
  • 非常感谢!它工作得很好,正如你所说,当他立即重新加入 VC 时,它不会取消静音,这对我来说非常完美!再次感谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-28
  • 2020-11-02
  • 2021-04-24
  • 2019-07-31
  • 2021-01-05
  • 2022-10-14
  • 2012-06-01
相关资源
最近更新 更多