Поиск в подпапках обработчика команд Discord.JS - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть обработчик команд для моего диска разногласия, который ищет в папке ./commands/, в которой перечислены все команды .js.Я хочу очистить все команды, и вместо того, чтобы все они были в одной папке, поместите их в свои папки категорий.Теперь проблема в том, что я понятия не имею, как заставить бота искать в подкаталогах папки ./commands/, чтобы найти каждую команду в отдельной папке категории.Ниже у меня есть код, который я использую для поиска в ./commands/.Любая идея заставить его искать в каждом каталоге в ./commands/?

client.commands = new Discord.Collection();
client.aliases = new Discord.Collection();

fs.readdir("./commands/", (err, files) => {
  if (err) return console.error(err);
  console.log(`Loading a total of ${files.length} commands.`);
  files.forEach(file => {
    if (!file.endsWith(".js")) return;
    let props = require(`./commands/${file}`);
    console.log(`Loading Command: ${props.help.name} ✔`);
    client.commands.set(props.help.name, props);
        props.conf.aliases.forEach(alias => {
      client.aliases.set(alias, props.help.name);
    });
  });
});

Редактировать:

Это ответ, который jakemingolla помог мне создать:

function walk(dir, callback) {
    fs.readdir(dir, function(err, files) {
        if (err) throw err;
        files.forEach(function(file) {
            console.log(`Loading a total of ${files.length} commands.`);
            var filepath = path.join(dir, file);
            fs.stat(filepath, function(err,stats) {
                if (stats.isDirectory()) {
                    walk(filepath, callback);
                } else if (stats.isFile() && file.endsWith('.js')) {
                    let props = require(`./${filepath}`);
                    console.log(`Loading Command: ${props.help.name} ✔`);
                    client.commands.set(props.help.name, props);
                    props.conf.aliases.forEach(alias => {
                    client.aliases.set(alias, props.help.name);
                  });
                }
            });
        });
    });
}
walk(`./commands/`)

1 Ответ

0 голосов
/ 26 февраля 2019

Используйте функцию для инкапсуляции повторяющейся работы!

Вы уже на полпути - у вас есть функция, которая может взять один каталог и вывести список файлов внутри него.Если вместо этого вы встретите каталог, повторите процесс:

function walk(dir, callback) {
    fs.readdir(dir, function(err, files) {
        if (err) throw err;
        files.forEach(function(file) {
            var filepath = path.join(dir, file);
            fs.stat(filepath, function(err,stats) {
                if (stats.isDirectory()) {
                    walk(filepath, callback);
                } else if (stats.isFile() && file.endsWith('.js')) {
                    ... your logic here ...
                }
            });
        });
    });
}
...