簡體   English   中英

Discord.js 我的“幫助”命令不起作用

[英]Discord.js my command for 'help' is not working

所以基本上我已經為我的 discord.js 機器人創建了一個幫助命令,我嘗試在機器人中實現一個頁面系統,但我有兩個問題。 1:每當我對表情符號做出反應時,機器人都會滯后,有時它不會更改頁面,以及 2:命令不會分成兩半,因此我無法將命令的兩半顯示到單獨的頁面上,這樣第一個嵌入不是那么長。 這是我的代碼

const {
    MessageEmbed
} = require("discord.js");
const {
    stripIndents
} = require("common-tags");
const {
    getMember,
    formatDate
} = require("../../functions.js");
const viewPerms = require("../../cmdviewperms.json");

module.exports = {
    config: {
        name: "help",
        aliases: ["?"],
        category: "Info",
        description: "Returns help information",
        usage: "!help",
    },
    run: (client, message, args) => {
        let cmds = client.commands;
        let allUsers = {
            Everyone: [],
            ADMINISTRATOR: []
        }

        for (let value of cmds) {
            let category = value[1].config.category;
            viewPerms.forEach(e => {
                if (e.cmdGroup.toLowerCase() == category.toLowerCase()) {
                    //console.log(`CATEGORY OF ${value[1].config.name} IS ${e.cmdGroup}`)
                    if (value[1].config.bypassUsers) {
                        value[1].config.bypassUsers.forEach(x => {
                            //console.log(`${value[1].config.name} ADDED TO ${x}; CMDGROUP: ${e.cmdGroup}`)
                            allUsers[x].push(value[1].config);
                        })
                    } else {
                        e.AllowedUsers.forEach(x => {
                            //console.log(`${value[1].config.name} ADDED TO ${x}; CMDGROUP: ${e.cmdGroup}`)
                            allUsers[x].push(value[1].config);
                        })
                    }
                }
            })
        }
        let adminEmbedText = "";
        let userEmbedText = "";
        allUsers.ADMINISTRATOR.forEach(e => {
            let name = e.name.charAt(0).toUpperCase() + e.name.slice(1, e.name.length);
            adminEmbedText = `${adminEmbedText} ${name}\n`;
        })

        allUsers.Everyone.forEach(e => {
            let name = e.name.charAt(0).toUpperCase() + e.name.slice(1, e.name.length);
            userEmbedText = `${userEmbedText} ${name}\n`;
        })

        //const embedHalf = Math.ceil(userEmbedText.length / 2);
        // var firsthalf = userEmbedText.lastIndexOf(' ', embedHalf);
        // var secondhalf = userEmbedText.indexOf(' ', embedHalf + 1);

        const embedhalf = Math.ceil(userEmbedText.split(" "))
        var firsthalf = userEmbedText.lastIndexOf(' ', embedhalf);
        var secondhalf = userEmbedText.indexOf(' ', embedhalf + 1);

        let page = 1 
        let pages = [firsthalf, secondhalf]


        let adminEmbed = new MessageEmbed()
            .setTitle("Commands")
            .setColor("RANDOM")
            .setDescription(adminEmbedText)
            .setFooter(`Page ${page} of ${pages.length}`)
        let userEmbed = new MessageEmbed()
            .setTitle("Commands")
            .setColor("RANDOM")
            .setDescription(userEmbedText)
            .setFooter(`Page ${page} of ${pages.length}`)


                //console.log(sh)
                //console.log(fh)
        if (args.length == 0) {
            if (message.member.hasPermission("ADMINISTRATOR")) return message.author.send(adminEmbed);
            return message.channel.send(userEmbed).then(msg => {

                msg.react('◀️').then(r => {
                    msg.react('▶️')

                    const filter = (reaction, user) => {
                        return ['◀️', '▶️'].includes(reaction.emoji.name) && user.id === message.author.id;
                    };

                    const back = msg.createReactionCollector(filter, {
                        timeout: 60000
                    });
                    const forw = msg.createReactionCollector(filter, {
                        timeout: 60000
                    })

                    back.on('collect', (r, u) => {
                        if (page === 1) return r.users.remove(r.users.cache.filter(u => u === message.author).first())
                        page--
                        userEmbed.setDescription(userEmbedText)
                        userEmbed.setFooter(`Page ${page} of ${pages.length}`)
                        msg.edit(userEmbed)
                        r.users.remove(r.users.cache.filter(u => u === message.author).first())
                    })
                
                    forw.on('collect', (r, u) => {
                        if (page === pages.length) return r.users.remove(r.users.cache.filter(u => u === message.author).first())
                        page++
                        userEmbed.setDescription(userEmbedText)
                        userEmbed.setFooter(`Page ${page} of ${pages.length}`)
                        msg.edit(userEmbed)
                        r.users.remove(r.users.cache.filter(u => u === message.author).first())
                    })
                  })
                })
    
        } else {
            let cmd = args.join(" ");
            let cmdFound = false;
            let embed = "No command found!";
            if (message.member.hasPermission("ADMINISTRATOR")) {
                allUsers.ADMINISTRATOR.forEach(e => {
                    if (cmd.toLowerCase() == e.name.toLowerCase()) {
                        let name = e.name.charAt(0).toUpperCase() + e.name.slice(1, e.name.length);
                        embed = new MessageEmbed()
                            .setTitle(`Command: ${name}`)
                            .setColor("RANDOM")
                            .setDescription(`Name: ${name} \n\n > Description: ${e.description} \n\n> Category: ${e.category} \n\n > Usage: ${e.usage}`);
                    }
                })
            }
            allUsers.Everyone.forEach(e => {
                if (cmd.toLowerCase() == e.name.toLowerCase()) {
                    let name = e.name.charAt(0).toUpperCase() + e.name.slice(1, e.name.length);
                    embed = new MessageEmbed()
                        .setTitle(`Command: ${e.name}`)
                        .setColor("RANDOM")
                        .setDescription(`Name: ${name} \n\n > Description: ${e.description} \n\n> Category: ${e.category} \n\n > Usage: ${e.usage}`);
                }
            })
            return message.channel.send(embed);
        }
    }
}```

我看到瀏覽此代碼的第一個問題是在從split()獲得的數組上使用Math.ceil() ) ,這沒有任何意義,因為Math.ceil()只接受數字。 這就是導致您的幫助文本沒有分成兩頁的原因。 再往下,您的兩個消息反應收集器forwback都在尋找相同的反應,因為您使用相同的過濾器創建了它們。 每次點擊任一反應時都會執行這兩個回調,因為這兩個反應都通過了過濾器。 這使得頁面是否實際切換成為一個問題。 讓收集器使用兩個不同的過濾器,每個過濾器只尋找正確的反應。 我沒有逐行查看代碼,因此可能存在更多問題,但這是我看到的兩個主要問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM