首页 > 解决方案 > 如何保存用户的角色历史

问题描述

有没有什么方法可以正确保存用户的角色历史,而不需要 Discord.js 上的数据库和/或 JSON 文件?我想创建一个函数来记录用户在命令开头所拥有的角色,并在触发特定函数后将其返回。

标签: discorddiscord.js

解决方案


有一种简单的方法可以在 Discord 上保存用户的角色历史记录,而无需数据库和/或任何 JSON 文件,您必须在代码中添加几行才能执行此操作。

您首先需要确保您的 Discord 机器人在 Discord 开发者门户面板中启用了“Privileged Gateway Intents”,这将大大提高机器人缓存获取任务的准确性。接下来,为用户提及或用户 ID 创建一个常量,如下所示:

const saveRolesFor = (message.mentions.members.first() || message.guild.members.cache.get(args[0]));

使用这两个参数,您将能够声明用户的 id 或提及用户。

然后您必须将指定用户的角色保存在另一个常量变量中,如下所示:

const roleHistory = saveRolesFor.roles.cache.map(r => r.id);

映射角色是最好的事情的原因是由于角色缓存包含其他元素,除了实际的用户角色之外,映射它们只会包含用户的实际角色,从而防止潜在的问题。

现在您必须声明您希望用户拥有的新角色,如下所示:

let roleToAdd = message.guild.roles.cache.find(r => r.name === 'Role');

是时候删除所有以前的角色并将其添加roleToAdd到用户了,您应该这样做:

await(saveRolesFor.roles.set([roleToAdd.id]));

您将需要set用户的角色,因为此功能会自动删除用户拥有的任何其他角色,并添加您声明的单个角色,您不再需要.removeand.add功能。

完成这些功能后,您可以创造性地在某些功能完成后将角色历史添加回来。一个非常简单的示例是在发送消息后将角色添加回用户,例如:

message.channel.send(`The roles for ${saveRolesFor} have been added back!`)
.then(saveRolesFor.roles.set(roleHistory));

所有用户以前的角色都将被成功添加,并且roleToAdd将被删除,因为您.set是用户的角色历史,这意味着您只添加了那些特定的角色。该.then函数roleHistory set在消息发送到通道后调用,您可以对其进行修改以正确适应您尝试从代码中获取的内容。

这不是添加角色的最佳方式,因为它只需要不到一秒钟的时间,但上面显示的功能在创建类似命令时非常有用。

希望对您有所帮助!


推荐阅读