【问题标题】:Discord.js V12 Message Collector "bug"?Discord.js V12 消息收集器“错误”?
【发布时间】:2020-10-25 03:14:35
【问题描述】:

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

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


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





            }
            
        }
    }});

图片:

【问题讨论】:

    标签: javascript discord discord.js


    【解决方案1】:

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

    看起来您试图用collector.off 停止原始侦听器,但因为这是一个语句而不是函数调用,所以它什么也没做。此外,如果它确实起作用了,它将结束父收集器,并且后续的 collector.on 回调都不会起作用。

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

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

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

    【讨论】:

    • 嘿,有点修好了,现在只要我输入管理员角色的名称,它就会停止,有什么解决办法吗?
    • 这是因为你设置了收集器在 10,000 毫秒(或 10 秒)后过期,这行:const collector = new Discord.MessageCollector(message.channel, m => m.author.id === message.author.id, { time: 10000 });,所以我建议删除这部分:{time: 10000},这样就没有时间了收集器的限制。
    • 那么,你必须在最后一个角色名称之后手动结束收集器,所以你应该在message.channel.send("That's it for setup.")行之后使用collector.stop()
    猜你喜欢
    • 2020-11-02
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 2021-01-03
    • 2022-01-21
    • 2019-07-30
    • 2022-11-17
    相关资源
    最近更新 更多