#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()
это работает.