首页 > 解决方案 > 如何在不重新启动机器人的情况下加载新命令

问题描述

我有一个工作机器人,具有功能正常的命令处理程序,并且我有一个重新加载命令来更新我的代码以获取预先存在的命令。每当我添加新命令时,我都必须重新启动整个机器人。由于这个特定的机器人有运行间隔的脚本,重新启动我的机器人将终止所有运行间隔,迫使所有用户手动重新启动它们。我不想每次添加新命令时都不得不重新启动我的机器人,所以我需要帮助。

这是我现在的重新加载命令:

const botconfig = require("../config.json");

module.exports = {
    name: 'reload',
    type: "Developer",
    description: 'Reloads a command (developer only)',
    cooldown: 1,
    execute(message, args) {

        if (message.author.id != botconfig.developerid) return message.channel.send("Only my developer can use this command...");
        message.channel.send("Developer command confirmed!");

        if (!args.length) return message.channel.send(`You didn't pass any command to reload!`);
        const commandName = args[0].toLowerCase();
        const command = message.client.commands.get(commandName) ||
            message.client.commands.find(cmd => cmd.aliases && cmd.aliases.includes(commandName));

        if (!command) return message.channel.send(`There is no command with name or alias \`${commandName}\`, ${message.author}!`);

        delete require.cache[require.resolve(`./${command.name}.js`)];

        try {
            const newCommand = require(`./${command.name}.js`);
            message.client.commands.set(newCommand.name, newCommand);
            message.channel.send("Command `" + command.name + "` was reloaded!");
        } catch (error) {
            console.log(error);
            message.channel.send("There was an error while reloading the `" + botconfig.prefix + command.name + "` command. \n\nError is as follows:\n``${error.message}`");
        }
    },
};

我想在命令名称之前添加一个可选的“新”参数以专门查找新命令,因为当前代码有效,但它只看到预先存在的命令。如果更改当前代码以另外查找新命令会更简单,但如果没有找到仍然会出错,那也很好。

标签: javascriptnode.jsdiscorddiscord.js

解决方案


是的,您可以使用以下代码,因此如果该命令已加载,则会将其删除。

const botconfig = require("../config.json");

module.exports = {
    name: 'reload',
    type: "Developer",
    description: 'Reloads a command (developer only)',
    cooldown: 1,
    execute(message, args) {

        if (message.author.id != botconfig.developerid) return message.channel.send("Only my developer can use this command...");
        message.channel.send("Developer command confirmed!");

        if (!args.length) return message.channel.send(`You didn't pass any command to reload!`);
        const commandName = args[0].toLowerCase();

        if(message.client.commands.get(commandName)){
            const command = message.client.commands.get(commandName) ||
            message.client.commands.find(cmd => cmd.aliases && cmd.aliases.includes(commandName));

            if (!command) return message.channel.send(`There is no command with name or alias \`${commandName}\`, ${message.author}!`);

            delete require.cache[require.resolve(`./${command.name}.js`)];
        }

        try {
            const newCommand = require(`./${commandName}.js`);
            message.client.commands.set(commandName, newCommand);
            message.channel.send("Command `" + commandName+ "` was reloaded!");
        } catch (error) {
            console.log(error);
            message.channel.send("There was an error while reloading the `" + botconfig.prefix + commandName + "` command. \n\nError is as follows:\n``${error.message}`");
        }
    },
};

推荐阅读