Discord.js v12中Discord.EvaluatedPermissions替代方案咨询
嘿,我来帮你搞定Discord.js v12的权限替换问题!
Discord.js v12确实彻底移除了EvaluatedPermissions,官方推荐用更灵活的Permissions类来替代,刚好能完美适配你原来的业务逻辑,分两种常见场景给你解决方案:
1. 最常见:从OAuth2接口获取的用户公会数据
因为是dashboard场景,大概率你是通过OAuth授权拿到的用户公会列表,这里的guild.permissions是数值类型(权限位的总和),不是现成的Permissions实例,需要手动包装:
第一步:修改dashboard.js
删掉原来的Discord.EvaluatedPermissions相关代码,改成传递Discord.Permissions给模板:
// 移除 const perms = Discord.EvaluatedPermissions; renderTemplate(res, req, "dashboard.ejs", { Permissions: Discord.Permissions });
第二步:修改dashboard.ejs的逻辑
把原来实例化perms的代码换成Permissions类,判断逻辑和原来完全一致:
user.guilds.forEach(guild => { // 用Permissions类包装数值权限,替代原来的EvaluatedPermissions const permsOnGuild = new Permissions(guild.permissions); // 和原来一样用字符串权限名判断 if (!permsOnGuild.has("MANAGE_GUILD")) return; // 你的后续业务逻辑... })
2. 特殊情况:user.guilds是完整的Discord.js Guild实例
如果你的公会数据是直接从Discord.js客户端获取的完整Guild对象,那guild.permissions本身就是Permissions实例,无需额外包装:
第一步:修改dashboard.js
直接移除perms相关代码,不需要传递额外变量:
// 删掉 const perms = Discord.EvaluatedPermissions; renderTemplate(res, req, "dashboard.ejs", {});
第二步:修改dashboard.ejs
直接用公会自带的permissions对象判断:
user.guilds.forEach(guild => { // 直接调用has方法,无需实例化 if (!guild.permissions.has("MANAGE_GUILD")) return; // 你的后续业务逻辑... })
额外实用小技巧
- 一次性判断多个权限:
has方法支持传入数组// 同时检查管理服务器和踢人权限 if (!permsOnGuild.has(["MANAGE_GUILD", "KICK_MEMBERS"])) return; - 用权限常量替代字符串(更严谨,避免拼写错误)
if (!permsOnGuild.has(Permissions.FLAGS.MANAGE_GUILD)) return;
内容的提问来源于stack exchange,提问作者HeaveN.ejs
相关产品推荐
相关产品推荐

