Как выполнить цикл одной и той же команды с другим значением в discord.js

#javascript #optimization #discord.js

Вопрос:

Я кодирую бота discord с discord.js, и одна из особенностей заключается в том, что, когда кто-то отправляет сообщение с префиксом ( .exe ) со словом сразу после (например .exebot , или .exeserverinv ), бот возвращает определенное сообщение. Код работает просто отлично, но я знаю, что просто скопировать, вставить один и тот же код более 30 раз и просто изменить значения-это плохая оптимизация.

Есть ли какой-нибудь простой способ сделать так, чтобы я мог просто использовать цикл или что-то еще для повторения команды, но с другими значениями?

Вот неоптимизированный код:

 command(client, 'command name', message => {
    message.channel.send('bot message')
})
command(client, 'random', message =>{
    message.channel.send('some text')
})
command(client, 'bot', message =>{
    message.channel.send('random text')
})
command(client, 'testing', message =>{
    message.channel.send('text')
})
command(client, 'test', message =>{
    message.channel.send('example text')
})
command(client, 'second to last test', message =>{
    message.channel.send('is almost there')
})
command(client, 'last test', message =>{
    message.channel.send('is the very last one')
})
 

Обработчик команд, из которого выполняется эта команда, является:

 const { prefix } = require('./config.json')

module.exports = (client, aliases, callback) => {
    if (typeof aliases === 'string') {
        aliases = [aliases]
    }

    client.on('message', message => {
        const { content } = message;

        aliases.forEach(alias => {
            const command = `${prefix}${alias}`

            if (content.startsWith(`${command} `) || content === command) {
                console.log(`Running the command ${command}`)
                callback(message)
            }
        })
    })
}
 

Пожалуйста, посоветуйте.

Ответ №1:

Вы можете использовать объектную нотацию JavaScript и сопоставить имена команд с ответами.

 const commandToReply = {
    "command name": "bot message",
    "random": "some text",
    "bot": "random text",
    "testing": "text",
    "test": "example text",
    "second to last test": "is almost there",
    "last test": "is the very last one"
};

for (const [name, reply] of Object.entries(commandToReply)) {
    command(client, name, (message) => {
        message.channel.send(reply);
    });
}
 

Чтобы выполнить итерацию по объекту, посмотрите, как Object.entries() это работает.