【问题标题】:Discord.js not checking if args existDiscord.js 不检查参数是否存在
【发布时间】:2021-08-22 18:11:24
【问题描述】:

我正在尝试使用 discord.js 和 minecraft-server-util 编写 Minecraft 服务器信息检查器,但会检查 args 是否存在或只有 1 个参数不起作用,并且它正在通过这些检查而无所事事错了,但是当我不包含任何内容时,server-util 部分会向控制台发送错误“预期主机(参数)有内容,得到一个空字符串”如果你能帮助我,我不确定问题是什么那就太好了。

命令名称:@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)
    })
})

【问题讨论】:

    标签: javascript discord discord.js minecraft


    【解决方案1】:

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

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

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

    另外需要注意的是,如果消息也是"{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);
          });
      }
    });
    

    下面是一个 sn-p,代码与您问题中的代码相似,以帮助突出问题:

    // 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() 或类似的东西来检查您的命令是否正在运行
    • 仅在符合条件的情况下运行代码

    【讨论】:

    • 这甚至不是我的问题,我之前使用过 discord.js,你提到的一切都没有问题。
    • 我确实完整地阅读了您的帖子,模拟了运行命令,并得出了我在这个答案中得出的结论。该命令自行运行,将进入 for 循环,但 args 长度将为 1。(单个空字符串的数组)。因此,它继续到 if 语句的末尾并运行命令的代码,从而导致您的问题。
    • 我现在在答案中添加了一个 sn-p 以突出我在答案中指出的问题。
    • 它根本没有发送消息,我的代码很好,没有工作。
    猜你喜欢
    • 2020-11-14
    • 2021-04-18
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多