discord - 如何保存用户的角色历史
问题描述
有没有什么方法可以正确保存用户的角色历史,而不需要 Discord.js 上的数据库和/或 JSON 文件?我想创建一个函数来记录用户在命令开头所拥有的角色,并在触发特定函数后将其返回。
解决方案
有一种简单的方法可以在 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
用户的角色,因为此功能会自动删除用户拥有的任何其他角色,并添加您声明的单个角色,您不再需要.remove
and.add
功能。
完成这些功能后,您可以创造性地在某些功能完成后将角色历史添加回来。一个非常简单的示例是在发送消息后将角色添加回用户,例如:
message.channel.send(`The roles for ${saveRolesFor} have been added back!`)
.then(saveRolesFor.roles.set(roleHistory));
所有用户以前的角色都将被成功添加,并且roleToAdd
将被删除,因为您.set
是用户的角色历史,这意味着您只添加了那些特定的角色。该.then
函数roleHistory set
在消息发送到通道后调用,您可以对其进行修改以正确适应您尝试从代码中获取的内容。
这不是添加角色的最佳方式,因为它只需要不到一秒钟的时间,但上面显示的功能在创建类似命令时非常有用。
希望对您有所帮助!
推荐阅读
- regex - 用于通过 5.0 和失败 5.1 的正则表达式
- git - 推送到功能分支而不合并
- bash - 如何选择匹配文件的每一行并对其进行操作?
- php - CakePHP - 实体对象不可访问
- angular - 如何将角材料 MatPaginator 升级到版本 8
- javascript - 如何从 json 文件 ArcGIS API for JavaScript 将 GeoJSONLayer 添加到地图?
- python - 如何使用 KNN 和 Scikit-Learn 找到项目之间的相对相似性/差异?
- django - 使用来自 Django 应用程序的自定义身份验证来验证对 Django Rest Framework 的访问
- javascript - 为什么它只显示第一个输入?
- java - Java 8 lambdas 将列表分组到映射中 - 如果每个键有多个列表项,则使用不同的键