简体   繁体   中英

Discord.js V12 Message Collector “bug”?

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


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





            }
            
        }
    }});

Picture: 漏洞

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.

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.

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 ... */

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM