当前位置: 首页 > 知识库问答 >
问题:

如何检测用户何时离开与Discord不一致的语音通道。JSV12

屈升
2023-03-14

我在挑拨离间。v12上的js Bot,包括一个静音命令,用于静音您所在的整个语音频道。问题是当有人离开频道时,他们保持沉默。我正试图用一个简单的事件来解除此人的静音,但我不理解VoiceStateUpdateOldStateNewState。我搜索了很多,但我只能找到一个适合加入风投的,而不是离开风投的。以下是我到目前为止得到的信息:

静音命令:

    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);
});

谢谢你花时间帮助我!:)

共有3个答案

乐正穆冉
2023-03-14

根据这个链接(我还没有测试过),你需要这样的东西:

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

  }
})
商飞尘
2023-03-14

您无法操纵不在语音频道上的人的语音状态,这将导致不协调错误:目标用户未连接到语音 ,即使可以,您也可能不想这样做,因为即使您没有得到另一个未处理的允诺错误,您也可能通过检查新状态的通道是否为空来得到一个无限循环,因为一旦您取消此人的静音,它将触发另一个带有空通道的事件,依此类推。

因此,我现在认为,解决您问题的一个可能方法是,每当用户加入频道时,取消静音。如果有人能够找到一种更好的方法来检查是否正在发生频道离开,而不仅仅是使用newState,那么可能没有必要这样做。通道===null。不管怎样,如果你可以在加入时取消静音,你可以这样做:

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

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

宁弘亮
2023-03-14

好吧,你已经在正确的轨道上了。你应该做的是检查某人离开语音频道时是否静音,然后移除静音。

所以让我们开始吧。

首先,我们检查此人是否正在离开语音频道。这一点很重要,因为每当有人对他们的语音进行任何操作(如静音或加入)时,都会触发voiceStateUpdate事件。我们通过检查oldState来实现这一点。channelIDnull定义,表示加入。

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);
});
 类似资料:
  • 我想添加一个事件,如果用户在歌曲仍在播放时离开,我的音乐机器人会立即离开语音频道。如果频道中有多个用户,机器人当然应该留在频道中。我只有一种方法,但需要帮助。我会尝试以下操作: 但不知怎么的,这似乎不起作用。我知道事实上,有一个类似的职位,但这并不适用于我太多,因为我定义了一些不同的事情。 我的第二次尝试是: (也不起作用。) 定义:我现在以不同的方式构建函数: 这是一个完全不同的计数。我试图做的

  • 我为机器人制作了加入语音频道的代码, 当任何用户键入“离开”时,我希望机器人离开它所在的服务器。我该怎么做?

  • 我正在尝试创建一个机器人,当有人加入特定的语音频道(例如VC1)时,它会向特定的文本频道(例如vc-text)发送消息。 这是机器人。js代码: 一些ID: 文本通道ID是712677731023716452-发送通知到(我知道我需要添加通道消息编码) 当我加入VC1时,我会收到控制台消息“Left VC1”,当我离开/加入另一个VC1时,我也会收到相同的控制台消息。 我从https://www.

  • 我用Java(Discord JDA)制作了一个Discord音乐机器人,我一直试图让机器人在一段时间后(例如1分钟)离开一个语音通道,但我真的很挣扎。有什么帮助吗?

  • 我正在为我的discord服务器构建一个机器人来播放YouTube视频,因为我还没有在网上找到一个可靠的机器人。 在我输入后,机器人会连接到我的语音频道!播放{url}命令,但即使url有效,也会立即离开。 我的代码如下: 我尝试过在我的PC上使用一个硬编码的文件,但我得到了相同的结果,机器人一连接就离开了语音通道。 我确实通过在cmd窗口中运行命令来验证ffmpeg和youtube-dl是否正常

  • 这是我命令的代码部分!虽然只有这一部分我不能很好地理解!我正试图让机器人在队列结束后离开! 它说和工作只是让机器人离开语音通道是我无法解决的问题!我尝试了以下方法: 编辑: