具有用户权限、客户端权限和限制的 Discord.js 命令处理程序

Posted

技术标签:

【中文标题】具有用户权限、客户端权限和限制的 Discord.js 命令处理程序【英文标题】:Discord.js command handler with user permission ,client permission and throttling 【发布时间】:2020-06-24 03:54:41 【问题描述】:

我如何检查用户权限、客户端权限、添加限制和在导出中定义参数,就像 commando 所做的那样

我的消息事件如下所示

client.on('message', async (message) => 

    if (message.author.bot) return;
    if (!message.guild) return;
    let prefix
    await db.collection('guilds').doc(message.guild.id).get().then((q) => 
        if (q.exists) 
            prefix = q.data().prefix || config1.prefix_mention;
         else 
            prefix = "." || config1.prefix_mention;
        
    )
    const prefixRegex = new RegExp(`^(<@!?$client.user.id>|$escapeRegex(prefix))\\s*`);
    if (!prefixRegex.test(message.content)) return;

    const [ matchedPrefix ] = message.content.match(prefixRegex);
    const args = message.content.slice(matchedPrefix.length).trim().split(/ +/g);

    const cmd = args.shift().toLowerCase();
    if (cmd.length === 0) return;

    let command = client.commands.get(cmd);
    if (!command) command = client.commands.get(client.aliases.get(cmd));
    if (!message.channel.permissionsFor(client.user).has("SEND_MESSAGES")) return;

    if (command)
        command.run(client, message, args, db);
)

我如何检查其他权限,例如示例

name: 'osu',
group: 'search',
memberName: 'osu',
description: 'Responds with information on an osu! user.',
clientPermissions: ["EMBED_LINKS","SEND_MESSAGES"],
userPermissions:['VIEW_CHANNEL'],
args: [
 
  key: 'user',
  prompt: 'What user would you like to get information on?',
  type: 'string'
 
],
async run(client ,message ,args) 
  //some code here

【问题讨论】:

【参考方案1】:

你可以得到client.user权限和message.member权限message.channel然后用has.检查一下

关于限流,可以使用cooldowns。这是很好的guide 使用方法。

const  Permissions  = require('discord.js');

if(command.clientPermissions.length > 0) 
    let clientChannelPermissions = message.channel.permissionsFor(message.guild.me);
    clientChannelPermissions = new Permissions(clientChannelPermissions.bitfield);
    if(!clientChannelPermissions.has(command.clientPermissions)) 
        let missingPermissions = command.clientPermissions.filter(perm => clientChannelPermissions.has(perm) === false).join(', ')
        return message.reply(`I can`t execute this command, missing permissions for $missingPermissions`)
    


if(command.userPermissions.length > 0) 
    let memberChannelPermissions = message.channel.permissionsFor(message.member);
    memberChannelPermissions = new Permissions(memberChannelPermissions.bitfield);
    if(!memberChannelPermissions.has(command.clientPermissions)) 
        let missingPermissions = command.clientPermissions.filter(perm => memberChannelPermissions.has(perm) === false).join(', ')
        return message.reply(`I can`t execute this command, you missing permissions for $missingPermissions`)
    

【讨论】:

检查参数怎么样 这个问题需要更详细的研究,命令args可以是用户、角色、频道、关键字,它们的顺序和严格遵守某些参数可以表示为ID、userTAG、提及,名字在某处也很重要。所以,我这里不能给你一些通用的简单的解决方案。 Uncaught Promise Rejection RangeError: 无效的权限字符串或数字。在行clientChannelPermissions = new Permissions(clientChannelPermissions); 我给的权限是clientPermissions:["EMBED_LINKS","SEND_MESSAGES"], @ETHYT 我正在添加一些修复,忘记返回对象的权限...

以上是关于具有用户权限、客户端权限和限制的 Discord.js 命令处理程序的主要内容,如果未能解决你的问题,请参考以下文章

我的 discord.py 机器人有啥方法可以检查用户是不是具有使用命令的特定权限?

检查 Discord bot 在服务器中是不是具有斜杠命令权限?

Discord按位权限计算器[关闭]

如何在 discord.js 中检查交互权限

JS Discord Bot - 创建具有特定权限的频道 ( v12+ )

限制 Confluence 6 WebDAV 客户端的写入权限