我正在用一个简单的命令处理程序制作一个不和谐的机器人。我以前从未使用过命令处理程序,因此我对这类功能和类似的东西并不了解很多。我收到一条错误消息,指出execute是未定义的,我不知道如何解决。代码:
module.exports = {Discord : 'Discord.JS'}
module.exports = {client : 'Discord.Client'}
const fs = require('fs');
client.commands = new Discord.Collection();
const commandFiles = fs.readdirSync('./commands/').filter(file => file.endsWith('.js'));
for(const file of commandFiles) {
const command = require(`./commands/${file}`);
client.commands.set(command.name, command);
};
client.on('message', msg => {
let message = '';
if (msg.channel === msg.author.dmChannel) {
return
} else {
client.commands.get('./commands/allyApplication').execute(message, msg);
};
if (msg.content.toLowerCase().startsWith('!accept')) {
client.commands.get('./commands/acceptAlly').execute(message, msg);
};
if (msg.content.toLowerCase().startsWith('!decline')) {
client.commands.get('./commands/declineAlly').execute(message, msg);
};
});
这是读取此内容的脚本的代码:
module.exports = {
name: 'declineAlly',
description: 'Declines allies.',
execute(message, msg) {
REST OF CODE
}
}
如果有人知道我如何解决该错误,那将是很棒的,因为我是命令处理程序的新手。
答案 0 :(得分:0)
要回答您的问题,您的代码无效,因为您需要像这样client.commands.get('declineAlly').execute(message, msg);
来调用它,并且由于client.commands.get('./commands/allyApplication').execute(message, msg);
总是运行else
,这意味着您的代码代码甚至还没有达到定义命令的地步。此外,您总是将空字符串传递给命令。您在这里所做的事情本身并没有错,那就是您必须手动将每个命令添加到处理程序中。那不是很有效。
所以让我们解决这个问题。
让我们从顶部开始。将命令设置到集合中的代码可以正常工作。因此,让我们开始探讨问题的根源client.on('message', message
。在以下代码段中,我始终使用message
而不是msg
。
开始时,您应该做两件事。首先检查该频道是否为DM,如果是则返回。
if (message.guild === null) {
return message.reply("Hey there, no reason to DM me anything. I won't answer anyway :wink:"); //example sentence
}
并检查发送此消息的用户是否是机器人。这样其他机器人就无法使用您的机器人。
if (message.author.bot) return;
接下来应该做的是设置一个前缀值(在您的情况下为!
,并检查消息是否以所述前缀开头。
const prefix = '!';
if (!message.content.startsWith(prefix)) {
return;
}
现在,我们已经检查了消息是否实际上是一条命令,我们可以切掉前缀并将消息的其余部分转换成我们称为args
的数组。
const args = message.content.slice(prefix.length).trim().split(/ +/g);
接下来,我们需要获取该数组的第一个元素,将其删除并将其存储为命令值。我们还将其转换为小写。
const cmd = args.shift().toLowerCase();
接下来,我们需要检查消息是否确实包含一些参数。这很重要,因此,如果消息只是简单的!
,则此代码的其余部分将不会执行。
if (cmd.length === 0) return;
之后,该从我们的命令集中获取命令了。
let command = client.commands.get(cmd);
完成后,我们需要检查命令是否确实存在。如果没有,则返回错误。
if (!command) return message.reply(`\`${prefix + cmd}\` doesn't exist!`);
一旦我们确认该命令存在,就该执行该命令了。
command.execute(message, args);
就在那里。命令处理程序完成。我们还没有完成。在使用这些命令之前,我们需要在此处进行一些更改。
最后,我们应该稍微更改一下命令,以便于阅读。
module.exports = {
name: 'declineally',
description: 'Declines allies.',
execute: (message, msg) => {
// the rest of your code
}
}
所有这些之后,您的client.on('message'
事件应该看起来像这样:
client.on('message', message => {
// check if the message comes through a DM
if (message.guild === null) {
return message.reply("Hey there, no reason to DM me anything. I won't answer anyway :wink:");
}
// check if the author is a bot
if (message.author.bot) return;
// set a prefix and check if the message starts with it
const prefix = "!";
if (!message.content.startsWith(prefix)) {
return;
}
// slice off the prefix and convert the rest of the message into an array
const args = message.content.slice(prefix.length).trim().split(/ +/g);
// convert all arguments to lowercase
const cmd = args.shift().toLowerCase();
// check if there is a message after the prefix
if (cmd.length === 0) return;
// look for the specified command in the collection of commands
let command = client.commands.get(cmd);
// if there is no command we return with an error message
if (!command) return message.reply(`\`${prefix + cmd}\` doesn't exist!`);
// finally run the command
command.execute(message, args);
});