Discord.js V12 消息收集器“错误"? [英] Discord.js V12 Message Collector "bug"?

查看:22
本文介绍了Discord.js V12 消息收集器“错误"?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在创建一个名册命令,这是我到目前为止的代码,错误是当涉及到管理员时,它会像图片中一样出现错误并且它不会继续......它还保存了所有答案在一个文件中.因此,管理员执行 $roster setup 并开始为每个文件的名称保存回复.这是我目前唯一完成的部分,所以设置.我在那里遇到了那个错误,控制台中没有错误.

I am making a roster command, and this is my code so far, the error is when it comes to the admin it bugs out like in the picture and it doesn't continue... It also saves all of the answers in a file. So an admin does $roster setup and it starts saving replies for the names of each file. This is the only part I've done for now, so the setup. And I am getting that bug there, there's no error in the console.

client.on('message', async message => {
    if (message.content.startsWith(prefix + "roster")) {
    if (!message.member.hasPermission('ADMINISTRATOR')) return message.channel.send('You do not have that permission! :x:').then(message.react(':x:'))
    if (message.author.bot){}
        else {
            !fs.existsSync(`./roster/` + message.guild.id) && fs.mkdirSync(`./roster/` + message.guild.id, { recursive: true })
            const args = message.content.slice(prefix.length + 7).split(/ +/)
            let uReply = args[0];
            if(!uReply) return message.channel.send("Please use the following options: `setup`, `send`, `add` or `remove`!")

            //SETUP
            if(uReply === "setup") {
                const collector = new Discord.MessageCollector(message.channel, m => m.author.id === message.author.id, { time: 10000 });
            
                message.channel.send("Please write the exact role name of leader role (with emojis if it has).")
                collector.on('collect', message => {
                    let leaderRole = message.content
                    fs.writeFileSync(`./roster/${message.guild.id}/`+ `Leader`+".txt", message.content, (err) => console.error);
                    message.channel.send(`Ok, the leader role is called `${leaderRole}`.`) 
                    collector.off
                

                message.channel.send("Now, whats the role name of co-leader or co-owner role (with emojis if it has)?")
                collector.on('collect', message => {
                    let coleaderRole = message.content
                    fs.writeFileSync(`./roster/${message.guild.id}/`+ `Co-Leader`+".txt", message.content, (err) => console.error);
                    message.channel.send(`Ok, the co-leader/co-owner role is called `${coleaderRole}`.`) 
                    collector.off


                message.channel.send("Now, whats the role name of admin role (with emojis if it has)?")
                collector.on('collect', message => {
                    let adminRole = message.content
                    fs.writeFileSync(`./roster/${message.guild.id}/`+ `Admin`+".txt", message.content, (err) => console.error);
                    message.channel.send(`Ok, the admin role is called `${adminRole}`.`) 
                    collector.off
 

                message.channel.send("Awesome, now whats the role name of staff role (with emojis if it has)?")
                collector.on('collect', message => {
                    let staffRole = message.content
                    fs.writeFileSync(`./roster/${message.guild.id}/`+ `Staff`+".txt", message.content, (err) => console.error);
                    message.channel.send(`Ok, the staff role is called `${staffRole}`.`)
                    collector.off


                message.channel.send("Cool, now whats the role name of tiny-staff role (with emojis if it has)?")
                collector.on('collect', message => {
                    let tinyStaffRole = message.content
                    fs.writeFileSync(`./roster/${message.guild.id}/`+ `Tiny-Staff`+".txt", message.content, (err) => console.error);
                    message.channel.send(`Ok, the tiny-staff role is called `${tinyStaffRole}`.`)
                    collector.off


                message.channel.send("Just a few more, now whats the role name of higher ranked members role (with emojis if it has)?")
                collector.on('collect', message => {
                    let HigherRankedRole = message.content
                    fs.writeFileSync(`./roster/${message.guild.id}/`+ `HigherRanked`+".txt", message.content, (err) => console.error);
                    message.channel.send(`Ok, the higher ranked members role is called `${HigherRankedRole}`.`)
                    collector.off


                message.channel.send("Last one, whats the role name of the normal members role (with emojis if it has)?")
                collector.on('collect', message => {
                    let NormalMembersRole = message.content
                    fs.writeFileSync(`./roster/${message.guild.id}/`+ `NormalMembers`+".txt", message.content, (err) => console.error);
                    message.channel.send(`Awesome, the normal members role is called `${NormalMembersRole}`.`)
                    message.channel.send("That's it for setup.")
                    collector.off


                })})})})})})})





            }
            
        }
    }});

图片:

推荐答案

我认为错误来自原始 MessageCollector 侦听器未正确禁用,因此原始侦听器仍然会为每条附加消息触发.

I believe that the error comes from the original MessageCollector listener not being properly disabled, so the original listener still triggers for each additional message.

看起来您尝试使用 collector.off 来停止原始侦听器,但因为这是一个语句而不是函数调用,所以它没有做任何事情.此外,如果它确实起作用,它将结束父收集器,并且后续的 collector.on 回调将不起作用.

It looks like you tried to stop the original listener with collector.off, but because this is a statement instead of a function call, it doesn't do anything. Furthermore, if it did function, it would end the parent collector and none of the subsequent collector.on callbacks would work.

相反,我会将 collector.on 函数替换为 collector.once 并删除 collector.off 语句.将其更改为 collector.once 会在侦听器接收到第一个事件后自动结束它,这正是您在这种情况下想要的.如果您想接收多个事件,则必须使用其他东西.

Instead, I would replace the collector.on functions with collector.once and remove the collector.off statements. Changing it to collector.once automatically ends the listener after it receives the first event, which is what you want in this scenario. If you wanted to receive more than one event, you'd have to use something else.

例如,监听器看起来像这样:

For example, the listener would look something like this:

collector.once('collect', message => {
    let leaderRole = message.content
    fs.writeFileSync(`./roster/${message.guild.id}/`+ `Leader`+".txt", message.content, (err) => console.error);
    message.channel.send(`Ok, the leader role is called `${leaderRole}`.`)

    /* ... Rest of code ... */

}

这篇关于Discord.js V12 消息收集器“错误"?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆