首页 > 解决方案 > 有没有办法为每个对嵌入消息做出反应的用户编辑频道?

问题描述

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

我目前的代码是:

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

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

例如:

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

我希望在点击反应后允许两个用户查看频道,但只是不知道如何做到这一点。

标签: javascriptdiscorddiscord.js

解决方案


当我为自己的不和谐机器人创建错误报告系统(使用票务类型系统)时,我遇到了完全相同的问题并意识到我无法使用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()从覆盖数组中删除覆盖的索引,然后用我们新修改的版本更新频道的覆盖。

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

相关资源

用于 channel.overwritePermissions() 的 Discord.js 文档
我的 discord 机器人中的一个工作示例


推荐阅读