我正在v12上制作一个Discord.js Bot,它包含一个静音命令,可以静音你所在的整个语音频道。问题是,当有人离开该频道时,他们会保持静音。我正试图通过一个简单的事件来解决这个问题,取消此人的静音,但我不理解VoiceStateUpdate
、OldState
和NewState
。我搜索了很多,但我只能找到一个加入风险投资公司的,而不是离开。到目前为止,我得到的是:
静音命令:
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.channelID
是null
还是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,然后从那里获取,我想不出其他方法了,对不起:(