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);
答案 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);
我不打算告诉你如何做这个部分,因为它涉及很多个人喜欢你将来如何处理你的代码。我建议您通过以下几种方式修改命令系统:
如果您不确定如何在此列表中执行任何操作,请告诉我,我很乐意帮助您。
根据代码的简单性来判断,您似乎是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。对不起。