Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么当用户离开语音频道时,试图编辑用户时会出现不协调错误?_Javascript_Node.js_Discord.js - Fatal编程技术网

Javascript 为什么当用户离开语音频道时,试图编辑用户时会出现不协调错误?

Javascript 为什么当用户离开语音频道时,试图编辑用户时会出现不协调错误?,javascript,node.js,discord.js,Javascript,Node.js,Discord.js,让我先说一下,这是我第一次尝试编写一个不和谐机器人。而且,在过去的几天里,我的头一直在往这个方向撞,所以我的大脑感觉像糊状的。尽管如此,如果其他人对此问题的答案似乎显而易见,我表示歉意 为了解释我在这里所做的事情,我的机器人被用于一个特定的游戏,其中有一段时间我们不希望人们能够听到彼此的谈话(或对游戏中发生的事情做出非自愿的反应)。运行游戏的人使用命令,这将使语音频道中的每个人静音或取消静音。机器人在这方面工作得很好。它已经被多人多次测试过 然而,我想添加一个意外情况,因为我们不希望过早离开游戏

让我先说一下,这是我第一次尝试编写一个不和谐机器人。而且,在过去的几天里,我的头一直在往这个方向撞,所以我的大脑感觉像糊状的。尽管如此,如果其他人对此问题的答案似乎显而易见,我表示歉意

为了解释我在这里所做的事情,我的机器人被用于一个特定的游戏,其中有一段时间我们不希望人们能够听到彼此的谈话(或对游戏中发生的事情做出非自愿的反应)。运行游戏的人使用命令,这将使语音频道中的每个人静音或取消静音。机器人在这方面工作得很好。它已经被多人多次测试过

然而,我想添加一个意外情况,因为我们不希望过早离开游戏的人最终无限期地关闭服务器(直到管理员可以做些什么)。我对此的回答是有一个特定的角色,该角色在静音时分配,在取消静音时删除。然后,当用户离开语音频道时,bot应该检查该角色,如果有,则确保删除该角色并取消该用户的静音。(这确保了如果他们由于除此bot之外的其他原因而被服务器禁用,他们将无法使用bot功能绕过此问题。)

下面是我所写的(并且多次重写,试图让它正常工作):

它可以识别某人何时离开语音频道,并知道他们是否拥有该角色,因为my console.log消息会打印到控制台窗口,但这似乎是功能停止的地方。它不会删除角色或取消用户静音。这里是我的控制台日志(我已经屏蔽了我认为私有的任何信息,原因显而易见):

我对自己的代码编程或调试并不陌生,通常可以自己解决这些问题(通过阅读文档或在谷歌上搜索)。不过,在为此挣扎了几天之后,我已经没有什么运气了。所以我决定尝试接触社区。如果您能帮助我找出导致此失败的原因,我将不胜感激。

表示,当用户不在语音频道时尝试设置静音/耳聋将抛出错误,因此用户离开频道后,您无法取消静音。相反,如果用户加入具有“静默”角色的频道(不在频道中之后),则可以取消用户静音:

client.on('voiceStateUpdate',(oldState,newState)=>{
让oldServer=oldState.guild;
设oldChannel=oldState.channel;
让oldMember=oldState.member;
设newChannel=newState.channel;
//如果用户更改了语音频道或用户加入了一个频道(未加入一个频道后)
if(旧频道&&newChannel&&oldChannel!==newChannel | |!旧频道){
//检查他们是否有“安静”的角色。
if(oldMember.roles.cache.some(role=>role.name=='Hushed')){
//删除“静默”角色(如果用户有)。
让role=oldServer.roles.cache.find(role=>role.name==='Hushed');
oldMember.roles.remove(角色)
.然后(()=>{
//此操作将在成功删除角色后记录。
//由于删除角色是异步的,因此您的代码会记录此操作
//不管角色是否已实际删除。
log(`-“Hushed”角色从${oldMember.user.tag}.`中删除);
//取消此成员的静音。
返回oldMember.voice.setMute(false);
})
.then(()=>console.log(`-User${oldMember.User.tag}取消静音。`))
.catch(error=>console.error(error));
}
}
}
});
使用ES2017的
异步
/
等待

client.on('voiceStateUpdate',异步(oldState,newState)=>{
让oldServer=oldState.guild;
设oldChannel=oldState.channel;
让oldMember=oldState.member;
设newChannel=newState.channel;
//如果用户更改了语音频道或用户加入了一个频道(未加入一个频道后)
if(旧频道&&newChannel&&oldChannel!==newChannel | |!旧频道){
//检查他们是否有“安静”的角色。
if(oldMember.roles.cache.some(role=>role.name=='Hushed')){
//删除“静默”角色(如果用户有)。
让role=oldServer.roles.cache.find(role=>role.name==='Hushed');
试一试{
等待oldMember.roles.remove(角色);
log(`-“Hushed”角色从${oldMember.user.tag}.`中删除);
//取消此成员的静音。
等待oldMember.voice.setMute(false);
log(`-User${oldMember.User.tag}unmuted.`);
}捕获(错误){
控制台错误(error);
}
}
}
});

哇,真不敢相信我错过了。我确实说过我的脑子乱七八糟!非常感谢你的帮助,这绝对是问题所在。
client.on('voiceStateUpdate', (oldState, newState) => {
    let oldServer = oldState.guild;
    let oldChannel = oldState.channel;
    let oldMember = oldState.member;
    // If user leaves a voice channel (ignores voiceStateUpdate caused by muting/unmuting in other functions).
    if (oldChannel && oldChannel !== newState.channel) {
        console.log(`${oldMember.user.tag} left channel ${oldChannel.name} (${oldServer.name}).`);
        // Check if they have the "Hushed" role.
        if (oldMember.roles.cache.some(role => role.name === 'Hushed')) {
            // Remove the "Hushed" role, if the user has it.
            let role = oldServer.roles.cache.find(role => role.name === 'Hushed');
            oldMember.roles.remove(role).catch(console.error);
            console.log(`- "Hushed" role removed from ${oldMember.user.tag}.`);
            // Unmute this member.
            oldMember.voice.setMute(false);
            console.log(`- User ${oldMember.user.tag} unmuted.`);
        }
    }
})
MY_DISCORD_TAG left channel Testing (MY_DISCORD_SERVER).
- "Hushed" role removed from MY_DISCORD_TAG.
- User MY_DISCORD_TAG unmuted.
(node:17092) UnhandledPromiseRejectionWarning: DiscordAPIError: Target user is not connected to voice.
    at RequestHandler.execute (C:\Users\MY_NAME\Discord\Hush\node_modules\discord.js\src\rest\RequestHandler.js:170:25)
    at processTicksAndRejections (internal/process/task_queues.js:93:5)
(Use `node --trace-warnings ...` to show where the warning was created)
(node:17092) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:17092) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.