有没有办法为每个对嵌入消息做出反应的用户编辑频道?

时间:2020-12-28 14:36:48

标签: javascript discord discord.js

我目前在编辑对嵌入做出反应的每个成员的频道权限时遇到问题。

我目前的代码是:

channel.createOverwrite([{ id: user.id, allow: ['VIEW_CHANNEL'] }])

这确实允许用户查看频道,但它只更改一次频道权限。

例如:

用户 1 单击允许他们进入频道的嵌入反应。 然后,用户 2 对嵌入做出反应,从而使用户 1 无法查看频道并添加用户 2。

我希望在点击反应后允许两个用户查看频道,但不知道如何执行此操作。

1 个答案:

答案 0 :(得分:1)

当我为自己的 Discord 机器人创建错误报告系统(使用票务类型系统)时,我遇到了完全相同的问题,并意识到我无法使用 channel.createOverwrite(),因为它会覆盖任何和之前为频道设置的所有权限(包括为其他用户创建的覆盖,以及阻止每个人在我的错误报告频道中发送消息的覆盖)。

我的解决方案是首先获取通道的所有当前覆盖,然后简单地为对它们做出反应的用户附加覆盖。可能有一种更简单的方法可以做到这一点;但是我的解决方案已经过测试并且对我有用,所以这就是我在这个答案中包含的内容。这是一个示例,它基于我的机器人中的代码并根据您的目的进行了修改。

授予用户查看频道的权限

//Fetch current channel permission overwrites
var overwrites = channel.permissionOverwrites.array();

//If overwrite already exists for reacting user, address it (to prevent dupe overwrites)
if (overwrites.find(o => o.id == user.id)) return;

//Add the overwrite for the user that reacted
overwrites.push({
    id: user.id,
    allow: ['VIEW_CHANNEL'],
})

//Give permissions to view channel
channel.overwritePermissions(overwrites, 'Add reason for allowing user to view channel here');

删除用户查看频道的权限

//Fetch current channel permission overwrites
var overwrites = channel.permissionOverwrites.array();

//Remove the user's perms to send messages in channel
overwrites.splice(overwrites.findIndex(o => o.id == user.id), 1);
message.channel.overwritePermissions(overwrites, 'Reason');

说明

因此,在两个示例中,我们首先获取频道中所有当前权限覆盖(包括为该频道中的角色和用户设置的权限)。

当给用户权限时,我们然后检查用户是否已经在频道中进行了覆盖,如果是,则返回(假设他们将在此频道中获得的唯一覆盖是他们的 VIEW_CHANNEL 权限)从此机器人接收;否则,将 return 更改为适合您目的的其他内容)。然后,我们为我们的反应用户添加一个新的覆盖,并用我们新修改的版本替换所有通道的权限覆盖;这使我们能够包括对刚刚做出反应的用户的覆盖以及对所有已经做出反应的用户的覆盖。

在删除用户查看频道的权限时,我们只需使用 .splice() 从覆盖数组中删除覆盖的索引,然后使用我们新修改的版本更新频道的覆盖。

如果您在任何时候找到一种更简单的方法来实现这一目标,请随时在下面发表评论,我会将其附加到此答案中。

相关资源

Discord.js docs for channel.overwritePermissions()
A working example in my discord bot