【问题标题】:How to save a user's role history如何保存用户的角色历史
【发布时间】:2021-06-11 08:14:05
【问题描述】:

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

【问题讨论】:

    标签: discord discord.js


    【解决方案1】:

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

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

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

    使用这 2 个参数,您将能够声明用户的 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.add 功能。

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

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

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

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

    希望对您有所帮助!

    【讨论】:

    • 客户端重启后呢?
    • 这是roleHistory函数通过一个简单的命令行的缺点,这只是它的基本思想,因为你没有在任何数据库中存储任何值,这意味着一旦机器人重新启动,函数不会返回角色,这是由于机器人在您键入命令后立即为指定用户保存角色。为了保存角色并在机器人重新启动后应用它们,您需要一个数据库来存储它们,然后使用不同的命令获取它们。
    • 适用于可靠 VPS 上的小型机器人,但对于需要不断更新的大型机器人而言,效果不佳
    猜你喜欢
    • 2019-04-18
    • 2017-04-24
    • 1970-01-01
    • 2018-01-06
    • 1970-01-01
    • 2019-05-21
    • 2016-12-12
    • 2016-07-22
    • 2015-02-20
    相关资源
    最近更新 更多