如何检测用户何时使用Discord.js V12离开Discord中的语音频道



我正在v12上制作一个Discord.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);
});

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

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

所以,让我们开始吧。

首先,我们检查此人是否正在离开语音通道。这一点很重要,因为每当有人对自己的声音做任何事情时,即静音或加入时,都会触发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);
});

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

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

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

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

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

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
}
})
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,然后从那里获取,我想不出其他方法了,对不起:(

最新更新