我对用JavaScript编码非常陌生,我正在为不和谐服务器设置一个简单的事件机器人。
这在概念上非常简单,机器人真正做的只是允许任何人给他们提到的任何成员分配一个“死亡”角色。
const { Client, Intents } = require('discord.js');
const client = new Client({ intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES] });
var prefix = "!";
client.on('ready', () => { console.log(`Logged in as ${client.user.tag}!`) });
client.on("messageCreate", (message) => {
let staff = message.guild.roles.cache.find(r => r.name === "Staff");
let dead = message.guild.roles.cache.find(r => r.name === "Dead");
let member = message.mentions.members.first();
if (!message.content.startsWith(prefix)) return;
//Ping command
if (message.content.startsWith(prefix + "ping")) {
message.channel.send("Pong!");
}
//Error if command doesn't include a mention
if (!member)
return message.channel.send('You need to mention a member, <@' + message.author.id + '>')
//Kill command
if (message.content.startsWith(prefix + "kill")) {
if (message.member.roles.cache.has(staff)) {
return message.channel.send(`${member} is not participating in the event!`);
}
if (message.member.roles.cache.has(dead)) {
return message.channel.send(`${member.toString()} is already dead!`);
} else {
member.roles.add(dead);
return message.channel.send(`${member.toString()} has been eliminated!`);
}
}
}
);
client.login('Token');
然而,我面临的问题是:
•kill命令,虽然它可以为人们提供死亡角色,并宣布一个成员被淘汰,但如果一个成员已经死亡或具有职员角色,它不会抛出相应的错误。它只是宣布该成员已被淘汰,而不管他们扮演什么角色。
•输入任何带有字母的单词!在(like!test)结果出现“需要提及成员”错误之前。(这包括!ping命令)
我做错了什么?我已经制止了不和谐。v13的js文档,我似乎找不到答案。提前谢谢!
编辑:修复了一切!我忘记了ping的return
,结果使用了不正确的kill命令函数。这是最终的代码,它按预期工作。
const { Client, Intents } = require('discord.js');
const client = new Client({ intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES] });
var prefix = "!";
client.on('ready', () => { console.log(`Logged in as ${client.user.tag}!`) });
client.on("messageCreate", (message) => {
if (!message.content.startsWith(prefix)) return;
//Ping command
if (message.content.startsWith(prefix + "ping")) {
return message.channel.send('Pong! <@' + message.author.id + '>');
}
//Kill command
if (message.content.startsWith(prefix + "kill")) {
let member = message.mentions.members.first();
let dead = message.guild.roles.cache.find(r => r.name === "Dead");
//No mention
if (!member)
return message.channel.send('You need to mention a member, <@' + message.author.id + '>');
//Staff check
if (member.roles.cache.find(r => r.name == "Staff")) {
return message.channel.send(`${member} is not participating in the event!`);
}
//Dead check
if (member.roles.cache.find(r => r.name == "Dead")) {
return message.channel.send(`${member.toString()} is already dead!`);
} else {
member.roles.add(dead);
return message.channel.send(`${member.toString()} has been eliminated!`);
}
}
});
谢谢大家的帮助!并随时批评最终的代码,欢迎所有的提示和花絮!
好的,所以你总是得到“需要提到成员”的原因是因为两个原因,第一,你没有返回ping
命令,第二,你没有在你需要的命令中检查成员。您不需要在“全局”级别上这样做,因为不是每个命令都需要提及。因此,这里的解决方案是将成员检查移动到代码的实际命令部分。
我还建议使用某种捕获错误命令的命令处理程序。
对于第一个问题,您需要通过角色的ID检查角色。这是因为角色管理器的缓存
是一个集合,它由该集合中的任何对象的ID映射。因此,只需添加一个。id
,它应该可以正常工作。
以正确的方式修改您的代码:
client.on("messageCreate", (message) => {
if (!message.content.startsWith(prefix)) return;
//Ping command
if (message.content.startsWith(prefix + "ping")) {
return message.channel.send("Pong!");
}
//Kill command
if (message.content.startsWith(prefix + "kill")) {
let staff = message.guild.roles.cache.find(r => r.name === "Staff");
let dead = message.guild.roles.cache.find(r => r.name === "Dead");
let member = message.mentions.members.first();
//Error if command doesn't include a mention
if (!member) return message.channel.send('You need to mention a member, <@' + message.author.id + '>');
if (message.member.roles.cache.has(staff.id)) {
return message.channel.send(`${member} is not participating in the event!`);
}
if (message.member.roles.cache.has(dead.id)) {
return message.channel.send(`${member.toString()} is already dead!`);
} else {
member.roles.add(dead);
return message.channel.send(`${member.toString()} has been eliminated!`);
}
}
});
成员。角色。您试图搜索的缓存是一个集合对象,它扩展了普通JavaScript映射。映射将其值存储在键值对中。在本例中,角色是值,关键是自动生成的雪花,这基本上是一个唯一的ID。如果缓存(映射)的值与作为参数解析的内容相匹配,则has()函数实际上不会搜索,而是搜索是否有与之匹配的键。
搜索地图中是否有特定值要复杂一些。有几种方法可以做到这一点。其中之一是将映射快速转换为数组并调用。在该数组上包含(),如下所示:
Array.from(yourMap.values()).includes(yourRole)
或者,您可以遍历Map的所有值,并根据您的角色检查它们,如下所示:
const findInMap = (map, val) => {
for (let [k, v] of map) {
if (v === val) {
return true;
}
}
return false;
}
老实说,我不喜欢这两种方式,但是既然你没有选择角色是如何存储的,你就必须做出应有的选择,对吗?
在编程中,跟踪程序执行时的路径是非常重要的。在你的. on函数中,我们可以看看这个。
首先,我们获取一组变量,并检查消息是否以预定义的命令前缀开头。如果它没有返回,那么它会立即离开代码块,这很好。然而,在下一个if语句中,这有点错误。检查命令是否正确!ping,如果是,则返回消息。在任何地方,您都不会告诉程序离开代码块,例如使用return语句,即使我们知道其中的其余代码与我们收到的消息无关。
因为您只检查消息是否有您的前缀,然后没有任何东西阻止它到达询问是否提到成员的if语句,所以它将对以!开头的每条消息执行。
为了解决这个问题,您可以非常简单地将检查所提到成员的if语句移动到if语句块中,该语句块在我们知道它是一个成员之后执行!杀戮命令。这样,它将只需要一个提到的成员,如果我们真的做了一个!杀戮命令。
这是因为代码正在执行您的所有条件。如果您希望ping实际上只是ping,而不是执行命令的其余部分,您可以向其添加返回。
例如:
return message.channel.send("Pong!");
我看到您已经在代码中使用了return
,但例如ping命令响应没有return语句,因此它将检查成员是否为null
Bot只是不工作:/Bot没有给出任何错误
我正在尝试做一个命令,给用户一个角色。它以前是工作的,但不是它只是给机器人一个角色。 这也发生在我的level命令上,该命令应该检查用户的级别。它检查的是机器人的水平,而不是用户的水平。
这是我的不和谐机器人我正在工作最近,在我把所有的代码移到我的VPS后,reactionroles不再工作了。 因此,由于某种原因,每次单击emoij时,它不会向用户添加角色,我试了很多次,但没有成功。看来应该能行,我是不是漏掉了什么?当我启动机器人时,一切似乎都很好,甚至命令也起作用了。我没有在role.id中犯任何错误,因为我也尝试了role.name,并在其中输入了名称。这也没用,我希望你有足
问题内容: 因此,我一直试图让机器人在成员获得角色授予时宣布,我知道这段代码可能根本没有意义,但这就是为什么我问:我该怎么做? 问题答案: 首先,您必须检查用户是否具有新角色。然后,您可以检查他们所担任的角色是您所寻找的角色之一:
我有一个机器人,我正在努力让它变得更好。它叫做版主机器人,我正在添加新命令。我只是到处找不到代码。 如何让版主机器人在用户加入服务器时赋予他们角色。如何使服务器所有者可以配置它,以便机器人可以在不同的服务器上使用? 我还希望它对owner命令进行DM,这样他们就可以看到它,只有owner集角色才能访问该命令。 这听起来很先进,可能是,但是有人能为我写代码或者告诉我如何制作吗?
我想让我的机器人直接向加入我的服务器的人发送消息,并在30秒后给他们角色。我没有收到任何错误,我的机器人没有崩溃,但它什么也不做。 我的代码: 我已经导入了,,我的机器人有权限,成员没有阻止DMs。