Discord bot Javascript声明或声明预期

时间:2018-01-02 13:30:32

标签: javascript discord

const Discord = require("discord.js");

const TOKEN = "BEEP";
const PREFIX = "$$";

var bot = new Discord.Client();

bot.on("ready", function() {

  console.log("ThunderBird is a go");

  bot.user.setPresence({
    game: {
      name: "Choccy Milk",
      type: 0
    }
  });

});

bot.on("message", function(message) {
      if (message.author.equals(bot.user)) return;

      if (message.content == "hello") {
        message.channel.send("Hi, how are you!");

        if (!message.content.startsWith(PREFIX)) return;

        var args = message.content.substring(PREFIX.length).split(" ");

        switch (args[0]) {
          case "ping":
            message.channel.send("Pong!");
            break;
        }

      });

    bot.login(TOKEN);

1 个答案:

答案 0 :(得分:1)

注意:最终代码位于答案的底部,因为我需要说很多内容。

注意:如果您只是担心它有效,不要过分关注使用良好做法,或者不喜欢我为了使用良好做法而改变的东西:在第四步之后停止。< / p>

此代码存在一些问题,必须修复以使机器人正常工作。首先是缩进。您发送的内容非常难以阅读,因此如果我们稍微修改它,我们可以轻松识别错误。这是你的代码,有适当的缩进。

第一步:缩进:

  const Discord = require("discord.js");

  const TOKEN = "BEEP";
  const PREFIX = "$$";

  var bot = new Discord.Client();

  bot.on("ready", function() {
     console.log("ThunderBird is a go");

     bot.user.setPresence({game: {
        name: "Choccy Milk",
        type: 0
     }});
  });

  bot.on("message", function(message) {
     if (message.author.equals(bot.user)) return;
     if (message.content == "hello") {
        message.channel.send("Hi, how are you!");

        if (!message.content.startsWith(PREFIX)) return;

        var args = message.content.substring(PREFIX.length).split(" ");

        switch (args[0]) {
           case "ping":
              message.channel.send("Pong!");
              break;
        }

  });

现在不容易阅读。您可能已经看到错误。倒数第二行缺少一些东西。如果代码末尾附近没有任何红色下划线,我会下载一个新的文本编辑器。一些最流行的编辑器可以做到这一点,包括VSCode,Atom和Sublime Text。链接包括https://code.visualstudio.com/&amp; https://atom.io/&amp; http://www.sublimetext.com/(我更喜欢VSCode)。

如果你看起来很干净,就会有一个永远不会完全关闭的IF块。您只需在倒数第二行添加另一个大括号即可关闭它。

第二步:语法更正:

  const Discord = require("discord.js");

  const TOKEN = "BEEP";
  const PREFIX = "$$";

  var bot = new Discord.Client();

  bot.on("ready", function() {
     console.log("ThunderBird is a go");

     bot.user.setPresence({game: {
        name: "Choccy Milk",
        type: 0
     }});
  });

  bot.on("message", function(message) {
     if (message.author.equals(bot.user)) return;
     if (message.content == "hello") {
        message.channel.send("Hi, how are you!");

        if (!message.content.startsWith(PREFIX)) return;

        var args = message.content.substring(PREFIX.length).split(" ");

        switch (args[0]) {
           case "ping":
              message.channel.send("Pong!");
              break;
        }
     }
  });

此时您会注意到您的程序运行正常且没有错误。唯一的问题是你的机器人实际上并没有实现,这是因为你永远不会告诉它连接到Discord。你永远不会认为它只是假设显而易见的。您的程序然后关闭的原因是因为您只是定义了操作但从未运行它们。值得庆幸的是,Discord.JS为您完成了大部分工作,所以您需要做的就是键入一行代码。

第三步:连接:

  const Discord = require("discord.js");

  const TOKEN = "BEEP";
  const PREFIX = "$$";

  var bot = new Discord.Client();

  bot.on("ready", function() {
     console.log("ThunderBird is a go");

     bot.user.setPresence({game: {
        name: "Choccy Milk",
        type: 0
     }});
  });

  bot.on("message", function(message) {
     if (message.author.equals(bot.user)) return;
     if (message.content == "hello") {
        message.channel.send("Hi, how are you!");

        if (!message.content.startsWith(PREFIX)) return;

        var args = message.content.substring(PREFIX.length).split(" ");

        switch (args[0]) {
           case "ping":
              message.channel.send("Pong!");
              break;
        }
     }
  });

  bot.login(TOKEN);

嗯,这很容易。现在你的机器人将使用正确的游戏上线。就像你指定的一样,如果你输入hello&#34; hello&#34;,它会回复&#34;嗨,你好!&#34;。这很好但是如果你键入$$ ping,字面上没有任何反应。这是因为它只查找消息$$ ping,如果消息也是&#34;你好&#34;。显然这是有问题的,因为消息不能同时说两件事。我们真正想要的是如果消息不是&#34;你好&#34;它就会寻找$$ ping。您可以使用ELSE子句执行此操作。

第四步:ELSE条款:

  const Discord = require("discord.js");

  const TOKEN = "BEEP";
  const PREFIX = "$$";

  var bot = new Discord.Client();

  bot.on("ready", function() {
     console.log("ThunderBird is a go");

     bot.user.setPresence({game: {
        name: "Choccy Milk",
        type: 0
     }});
  });

  bot.on("message", function(message) {
     if (message.author.equals(bot.user)) return;
     if (message.content == "hello") {
        message.channel.send("Hi, how are you!");
     } else {
        if (!message.content.startsWith(PREFIX)) return;

        var args = message.content.substring(PREFIX.length).split(" ");

        switch (args[0]) {
           case "ping":
              message.channel.send("Pong!");
              break;
        }
     }
  });

  bot.login(TOKEN);

我所做的只是添加一个新行(第22行)和&#34;}否则{&#34;。现在一切都很完美,但仍有一些问题需要解决。如果我在这里做了你不喜欢的事情,只需复制并粘贴第四步中的代码即可。

我建议改变的第一件事是变量名称;特别是机器人的名字。您可能已经注意到,method.Client()以大写字母开头。这不是一个意外,在开发人员部分非常正确。当方法是类或遵循特定的对象创建模式时,这样做。 (主要的OCP包括工厂,构造函数和原型)。你可以说它是其中之一,因为它需要new关键字。看完Discord.JS的代码后,我相信它是一个类。解决这个问题的方法是将变量名称更改为&#34; Bot&#34;来自&#34; bot&#34;以及变量的所有用途。

第五步:变量名称

  const Discord = require("discord.js");

  const TOKEN = "BEEP";
  const PREFIX = "$$";

  var Bot = new Discord.Client();

  Bot.on("ready", function() {
     console.log("ThunderBird is a go");

     Bot.user.setPresence({game: {
        name: "Choccy Milk",
        type: 0
     }});
  });

  Bot.on("message", function(message) {
     if (message.author.equals(Bot.user)) return;
     if (message.content == "hello") {
        message.channel.send("Hi, how are you!");
     } else {
        if (!message.content.startsWith(PREFIX)) return;

        var args = message.content.substring(PREFIX.length).split(" ");

        switch (args[0]) {
           case "ping":
              message.channel.send("Pong!");
              break;
        }
     }
  });

  Bot.login(TOKEN);

接下来应该改变的是Bot变量类型。通常,您希望变量是常量。这是因为如果变量发生变化,你不希望它继续运行;相反,你希望它停止并告诉你有关错误及其发生的时间。如果您和机器人的eval命令一样,这可能会变得非常重要。

第六步:常数变量:

  const Discord = require("discord.js");
  const Bot = new Discord.Client();

  const TOKEN = "BEEP";
  const PREFIX = "$$";

  Bot.on("ready", function() {
     console.log("ThunderBird is a go");

     Bot.user.setPresence({game: {
        name: "Choccy Milk",
        type: 0
     }});
  });

  Bot.on("message", function(message) {
     if (message.author.equals(Bot.user)) return;
     if (message.content == "hello") {
        message.channel.send("Hi, how are you!");
     } else {
        if (!message.content.startsWith(PREFIX)) return;

        var args = message.content.substring(PREFIX.length).split(" ");

        switch (args[0]) {
           case "ping":
              message.channel.send("Pong!");
              break;
        }
     }
  });

  Bot.login(TOKEN);

此代码的另一个问题是它使用旧版本的函数。 ECMAScript(AKA JavaScript)中的标准是使用所谓的箭头函数。老实说,我不确定为什么它是一个标准,而不仅仅是一个偏好,但它是最好的,我们只能遵循它。箭头函数也更好,因为它们更具可读性,并且没有this关键字的局部范围(这是一个优势,因为您仍然可以访问全局关键字)。您可以通过将函数(){...}替换为()=&gt;来使用箭头函数{...}如果你想要参数,你可以像函数一样将它们放在括号中。例如(function(req,res,next){...} to(req,res,next)=&gt; {...})。此外,如果只有一个参数,您甚至不需要括号。例如(功能(消息){...}到消息=&gt; {...})。您可以在此处阅读ECMAScript和箭头函数的标准:https://github.com/lukehoban/es6features#arrows

第七步:箭头功能:

  const Discord = require("discord.js");
  const Bot = new Discord.Client();

  const TOKEN = "BEEP";
  const PREFIX = "$$";

  Bot.on("ready", () => {
     console.log("ThunderBird is a go");

     Bot.user.setPresence({game: {
        name: "Choccy Milk",
        type: 0
     }});
  });

  Bot.on("message", message => {
     if (message.author.equals(Bot.user)) return;
     if (message.content == "hello") {
        message.channel.send("Hi, how are you!");
     } else {
        if (!message.content.startsWith(PREFIX)) return;

        var args = message.content.substring(PREFIX.length).split(" ");

        switch (args[0]) {
           case "ping":
              message.channel.send("Pong!");
              break;
        }
     }
  });

  Bot.login(TOKEN);

应该进行的另一项调整是更换&#34; var&#34;关键字&#34; let&#34;。这是另一个已成为标准的事情,尽管有些人只是喜欢&#34; var&#34;。 &#34;让&#34;关键字更好,因为它会使代码运行得更快,它的范围是块级别,而不是功能级别,这是一种更一致的方式。 let关键字也很棒,因为它允许您临时覆盖IF语句之类的变量。就个人而言,我通过使用let修复了我的代码中的错误,可能是因为较低范围的变量不会与较高范围的变量冲突。你可以阅读关于&#34; let&#34;关键字https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let。要进行此更改,只需替换单词&#34; var&#34;与&#34;让&#34;。 (其他代码可能还需要其他步骤,这就是为什么我建议阅读let)。您可以在以下示例中看到此额外步骤:

  (() => {

  var regex = /^[1-9]/u;
  var DateNow = Date.now();
  var token = process.env.BOT_TOKEN;

  var condition1 = regex.test(String(token));
  var condition2 = DateNow > 1515354893761;

  if((condition1) && (condition2)) {
     var text = 'Yes';
  }else {
     var text = 'No';
  }

  console.log(text);

  })();

这样可以完美地工作但是如果我尝试使用&#34;让&#34;,它会做一些非常意外的事情。

  (() => {

  let regex = /^[1-9]/u;
  let DateNow = Date.now();
  let token = process.env.BOT_TOKEN;

  let condition1 = regex.test(String(token));
  let condition2 = DateNow > 1515354893761;

  if((condition1) && (condition2)) {
     let text = 'Yes';
  }else {
     let text = 'No';
  }

  console.log(text);

  })();

这不起作用,而是提供错误&#34; ReferenceError:文本未定义&#34;。为了解决这个问题并仍然使用&#34;让我们只需要将它移到更高的范围。

  (() => {

  let regex = /^[1-9]/u;
  let DateNow = Date.now();
  let token = process.env.BOT_TOKEN;

  let condition1 = regex.test(String(token));
  let condition2 = DateNow > 1515354893761;

  let text;

  if((condition1) && (condition2)) {
     text = 'Yes';
  }else {
     text = 'No';
  }

  console.log(text);

  })();

这与&#34; var&#34;的示例完全相同虽然仍然能够保持&#34;让&#34;关键词。另一种方法是使用三元运算符。

  (() => {

  let regex = /^[1-9]/u;
  let DateNow = Date.now();
  let token = process.env.BOT_TOKEN;

  let condition1 = regex.test(String(token));
  let condition2 = DateNow > 1515354893761;

  let text = (condition1) && (condition2) ? 'Yes' : 'No';

  console.log(text);

  })();

三元组是一种更快捷的方法,但是其他块类型(如循环)没有三元组。

现在让我们回到代码。

第八步:LET关键字:

  const Discord = require("discord.js");
  const Bot = new Discord.Client();

  const TOKEN = "BEEP";
  const PREFIX = "$$";

  Bot.on("ready", () => {
     console.log("ThunderBird is a go");

     Bot.user.setPresence({game: {
        name: "Choccy Milk",
        type: 0
     }});
  });

  Bot.on("message", message => {
     if (message.author.equals(Bot.user)) return;
     if (message.content == "hello") {
        message.channel.send("Hi, how are you!");
     } else {
        if (!message.content.startsWith(PREFIX)) return;

        let args = message.content.substring(PREFIX.length).split(" ");

        switch (args[0]) {
           case "ping":
              message.channel.send("Pong!");
              break;
        }
     }
  });

  Bot.login(TOKEN);

您可能希望在每种情况下都使用三等号运算符。虽然它在这个例子中不是很多,但这是一个很好的习惯。 double和triple equals之间的区别在于double等于更改一侧的数据类型以使它们匹配。虽然这在实践中似乎有用,但最好在需要停止潜在错误时自行转换它们。在处理奇怪的转换时,例如布尔值,这可能是一团糟。要全面了解这些错误,我建议在YouTube上推荐 JavaScript:了解奇怪的部分 - 前3.5个小时

第九步:三等于:

  const Discord = require("discord.js");
  const Bot = new Discord.Client();

  const TOKEN = "BEEP";
  const PREFIX = "$$";

  Bot.on("ready", () => {
     console.log("ThunderBird is a go");

     Bot.user.setPresence({game: {
        name: "Choccy Milk",
        type: 0
     }});
  });

  Bot.on("message", message => {
     if (message.author.equals(Bot.user)) return;
     if (message.content === "hello") {
        message.channel.send("Hi, how are you!");
     } else {
        if (!message.content.startsWith(PREFIX)) return;

        let args = message.content.substring(PREFIX.length).split(" ");

        switch (args[0]) {
           case "ping":
              message.channel.send("Pong!");
              break;
        }
     }
  });

  Bot.login(TOKEN);

在Node.JS中,您经常希望使您的函数异步。这不会影响当前的代码,但我认为这将是一个很好的细节添加。通过添加&#34; async&#34;来创建异步函数。功能之前的关键字。通常情况下这并不重要,但由于Discord.JS是基于承诺的,所以这是非常好的做法。您可以在异步上阅读并等待:https://javascript.info/async-await

异步功能:

  const Discord = require("discord.js");
  const Bot = new Discord.Client();

  const TOKEN = "BEEP";
  const PREFIX = "$$";

  Bot.on("ready", async () => {
     console.log("ThunderBird is a go");

     Bot.user.setPresence({game: {
        name: "Choccy Milk",
        type: 0
     }});
  });

  Bot.on("message", async message => {
     if (message.author.equals(Bot.user)) return;
     if (message.content === "hello") {
        message.channel.send("Hi, how are you!");
     } else {
        if (!message.content.startsWith(PREFIX)) return;

        let args = message.content.substring(PREFIX.length).split(" ");

        switch (args[0]) {
           case "ping":
              message.channel.send("Pong!");
              break;
        }
     }
  });

  Bot.login(TOKEN);

我不打算告诉你如何做这个部分,因为它涉及很多个人喜欢你将来如何处理你的代码。我建议您通过以下几种方式修改命令系统:

  • 使命令成为参数的单独变量。您可能需要查看Array.slice()方法。
  • 使命令不区分大小写。您可能希望查看String.toLowerCase()方法。
  • 将命令代码放在不同的文件中。您可能需要查看module.exports属性。

如果您不确定如何在此列表中执行任何操作,请告诉我,我很乐意帮助您。

根据代码的简单性来判断,您似乎是Discord.JS的初学者。我建议您仔细阅读以下文档:https://discord.js.org/#/&gt;文档。

请记住将令牌变量更改回机器人的令牌。

最终守则

  const Discord = require("discord.js");
  const Bot = new Discord.Client();

  const TOKEN = "BEEP";
  const PREFIX = "$$";

  Bot.on("ready", async () => {
     console.log("ThunderBird is a go");

     Bot.user.setPresence({game: {
        name: "Choccy Milk",
        type: 0
     }});
  });

  Bot.on("message", async message => {
     if (message.author.equals(Bot.user)) return;
     if (message.content === "hello") {
        message.channel.send("Hi, how are you!");
     } else {
        if (!message.content.startsWith(PREFIX)) return;

        let args = message.content.substring(PREFIX.length).split(" ");

        switch (args[0]) {
           case "ping":
              message.channel.send("Pong!");
              break;
        }
     }
  });

  Bot.login(TOKEN);

编辑:我刚才意识到你确实放了bot.login。对不起。

相关问题