我在挑拨离间。v12上的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);
});
谢谢你花时间帮助我!:)
根据这个链接(我还没有测试过),你需要这样的东西:
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
}
})
您无法操纵不在语音频道上的人的语音状态,这将导致不协调错误:目标用户未连接到语音
,即使可以,您也可能不想这样做,因为即使您没有得到另一个未处理的允诺错误,您也可能通过检查新状态的通道是否为空来得到一个无限循环,因为一旦您取消此人的静音,它将触发另一个带有空通道的事件,依此类推。
因此,我现在认为,解决您问题的一个可能方法是,每当用户加入频道时,取消静音。如果有人能够找到一种更好的方法来检查是否正在发生频道离开,而不仅仅是使用
newState,那么可能没有必要这样做。通道===null
。不管怎样,如果你可以在加入时取消静音,你可以这样做:
client.on('voiceStateUpdate', (oldState, newState) => {
if (oldState.channel === null && newState.channel !== null) {
newState.setMute(false);
}
});
请注意,如果有人在离开后加入频道,这可能会出现错误,否则,您应该不会有问题。
好吧,你已经在正确的轨道上了。你应该做的是检查某人离开语音频道时是否静音,然后移除静音。
所以让我们开始吧。
首先,我们检查此人是否正在离开语音频道。这一点很重要,因为每当有人对他们的语音进行任何操作(如静音或加入)时,都会触发voiceStateUpdate
事件。我们通过检查oldState来实现这一点。channelID
为null
或未定义
,表示加入。
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是否正常
这是我命令的代码部分!虽然只有这一部分我不能很好地理解!我正试图让机器人在队列结束后离开! 它说和工作只是让机器人离开语音通道是我无法解决的问题!我尝试了以下方法: 编辑: