如何检查指定Discord频道内机器人的发送消息权限
问题修正方案
原代码存在的问题
- 取值错误:
message.user.bot是用于判断消息发送者是否为机器人的布尔值,不存在permissions属性,无法通过该路径获取机器人的权限对象 - 校验范围错误:直接读取成员全局权限无法感知频道单独设置的权限覆盖规则(比如频道单独封禁机器人发言权限),无法得到指定频道下的真实权限
- 权限名拼写错误:发送消息的权限标识不是单数形式的
SEND_MESSAGE,拼写错误会导致校验结果完全失效
正确实现代码
以下是适配discord.js v13/v14(当前主流版本)的实现:
// 指定要校验的目标频道ID const TARGET_CHANNEL_ID = "988087516844421170"; // 从服务器频道缓存中获取目标频道实例 const targetChannel = message.guild.channels.cache.get(TARGET_CHANNEL_ID); // 兜底处理:频道不存在时直接返回,避免后续代码报错 if (!targetChannel) { console.log("目标频道不存在,无法校验权限"); return; } // 调用频道实例的permissionsFor方法,获取机器人在当前频道的真实生效权限 const botHasSendPerm = targetChannel.permissionsFor(message.guild.me).has("SendMessages"); if (botHasSendPerm) { console.log("I can send message!!") } else { console.log("I can't send message!!") }
补充说明
- 如果你还在使用discord.js v12及更早版本,只需要把权限字符串替换为全大写下划线格式的
SEND_MESSAGES即可,其余逻辑不变 message.guild.me是当前服务器中机器人自身的成员对象,是获取机器人权限的正确入口- 必须通过频道实例的
permissionsFor()方法做校验,才能正确计算角色继承、频道专属权限覆盖、频道同步规则等影响最终权限的逻辑,返回的校验结果才准确
内容的提问来源于stack exchange,提问作者Julian-V
相关产品推荐
相关产品推荐

