Discord.js没有检查args是否存在



我正试图用discord.js和Minecraft server util编写一个Minecraft服务器信息检查器,但检查参数是否存在或只有一个参数不起作用,它会忽略这些检查,认为没有任何错误,但当我不包括任何内容时,server util部分会向console发送一个错误"期望Host(The Arguments(具有内容,但得到一个空字符串";我不确定问题出在哪里,如果你能帮我,那就太好了。

命令名:@javaserverstatus命令和前缀是17个字符,这就是slice设置为17的原因。

client.on('message', (message) => {
const args = message.content.slice(17).trim().split(' ') // this is where args is defined.
if (message.content === `${prefix}javaserverstatus`) {
if (!args.length) {
return message.channel.send(`You didn't provide a server, ${message.author}!`) // checks if args exist
}
if (args.length > 1) {
return message.channel.send(`Wrong input! EG. play.hypixel.net, ${message.author}`) // checks if there are only 1 arguments
}
}
const util = require('minecraft-server-util')
var serverinfo = null
util
.status(args.toString()) // This code is giving an error saying args does not exist.
.then((response) => {
console.log(response)
serverinfo = response
const embed = new Discord.MessageEmbed()
.setTitle(args + ' Server Status')
.setColor(0xff0000)
.setDescription('IP: ' + response.host + 'n' + 'Port: ' + response.port + 'n' + 'Version: ' + response.version + 'n' + 'Online Players: ' + response.onlinePlayers.toString() + 'n' + 'Max Players: ' + response.maxPlayers.toString() + 'n')
message.channel.send(embed)
})
.catch((error) => {
console.error(error)
})
})

即使消息不是命令,命令的代码仍在运行。

例如,消息"hi"将导致[""]的args。然后它将简单地忽略if语句并运行您的命令。

此外,如果消息是"{prefix}javaserverstatus",则它将始终具有1([""](的args长度。

另一件需要注意的事情是,如果消息也是"{prefix}javaserverstatus some arguments",那么验证数据的if语句将不会运行,因为消息不再等于${prefix}javaserverstatus

您应该将代码修复为仅在命令实际运行时运行,并正确验证数据:

client.on("message", (message) => {
// create args
const args = message.content.slice(17).trim().split(" ");
// fits the command, including arguments, not just a blank command
if (message.content.startsWith(`${prefix}javaserverstatus`)) {
// args.length will always be 1 or greater.
// instead, check if the first argument is an empty string.
if (args[0] === "") {
return message.channel.send(`You didn't provide a server, ${message.author}!`); // checks if args exist
}
if (args.length > 1) {
return message.channel.send(`Wrong input! EG. play.hypixel.net, ${message.author}`) // checks if there are only 1 arguments
}
// only if the command is valid, then run the command.
const util = require('minecraft-server-util');
let serverinfo = null;
util
.status(args.toString())
.then((response) => {
console.log(response);
serverinfo = response;
const embed = new Discord.MessageEmbed()
.setTitle(args + " Server Status")
.setColor(0xff0000)
.setDescription("IP: " + response.host + "n" + "Port: " + response.port + "n" + "Version: " + response.version + "n" + "Online Players: " + response.onlinePlayers.toString() + "n" + "Max Players: " + response.maxPlayers.toString() + "n")
message.channel.send(embed);
})
.catch((error) => {
console.error(error);
});
}
});

下面是一个片段,其中的代码与您问题中的代码相似,有助于突出问题:

// The following code will not work as expected
function simulateOnMessage(content) {
console.log("================");
const args = content.slice(17).trim().split(" ");
console.log("Args: ", args);
console.log("Args length: " + args.length);
if (content === "!javaserverstatus") {
console.log("Checking arguments...");
if (!args.length) {
return console.log("No server provided!");
}
if (args.length > 1) {
return console.log("Bad input!");
}
console.log("No problems found!");
}
doSomethingWith(args.toString());
}
function doSomethingWith(str) {
if (str === "") {
console.log("EMPTY STRING!");
} else {
console.log("OK!");
}
}
simulateOnMessage("!javaserverstatus");
simulateOnMessage("!javaserverstatus args");
simulateOnMessage("!javaserverstatus with args");
simulateOnMessage("completely invalid message");
simulateOnMessage("hi");

TLDR;

  • 使用String.startsWith()或类似工具检查命令是否正在运行
  • 仅在符合条件的情况下运行代码

最新更新