当前位置: 首页 > 知识库问答 >
问题:

《不和》中有条件的角色赋予。JS

狄玉书
2023-03-14

我对用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!`);
        }
    }
});

谢谢大家的帮助!并随时批评最终的代码,欢迎所有的提示和花絮!

共有3个答案

云捷
2023-03-14

好的,所以你总是得到“需要提到成员”的原因是因为两个原因,第一,你没有返回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!`);
        }

    }
});
邓阳嘉
2023-03-14

成员。角色。您试图搜索的缓存是一个集合对象,它扩展了普通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语句块中,该语句块在我们知道它是一个成员之后执行!杀戮命令。这样,它将只需要一个提到的成员,如果我们真的做了一个!杀戮命令。

田宇
2023-03-14

这是因为代码正在执行您的所有条件。如果您希望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。