【问题标题】:discord py - error handling with on_command_errordiscord py - 使用 on_command_error 进行错误处理
【发布时间】:2021-05-28 03:27:05
【问题描述】:

我需要有关 discord.py 中错误处理的帮助。如果我的机器人没有足够的权限来执行命令,或者我的机器人在他需要的权限方面失败了(原因是权限不足),我想向服务器所有者发送一条私人消息。

现在我搜索了很多,但找不到一个很好的例子来说明这一点。我知道如何给所有者发私信,但是“isinstance”这个东西让我很困惑,我以前从来没有用过。但这是一个重要的功能,我很想集成。

【问题讨论】:

    标签: python python-3.x error-handling discord.py


    【解决方案1】:

    前言:由于您在谈论错误处理,我假设该成员正在尝试使用命令,但机器人没有足够的权限来正确执行命令的函数体。

    示例解决方案

    @commands.command(name="kick")
    @commands.has_permissions(kick_members=True)
    async def kick(ctx, members, *, reason=None):
        await member.kick(reason=reason)
    
    @kick.error
    async def kick_error(error, ctx):
        if isinstance(error, commands.MissingPermissions):
            owner = ctx.guild.owner
            direct_message = await owner.create_dm()
            await direct_message.send("Missing Permissions")
    

    详情

    isinstance() 函数是一个 Python 内置函数,它接受两个参数,objectclassinfo。该函数返回object 参数是否是classinfo 的实例。在这种情况下,由于 bot 没有足够的权限而导致的错误会引发 discord.ext.commands.MissingPermissions 错误。

    本例中的isinstance() 函数检查引发的异常是否为commands.MissingPermissions 的实例。如果异常是discord.ext.commands.MissingPermissions 错误,则isinstance() 将返回True

    if 子句的代码更容易理解。公会的所有者(作为discord.Member 对象)存储为discord.Guild 对象的属性;在这种情况下,ctx.guild.owner。由于该对象是discord.Member 对象,因此可以调用create_dm() 类方法来创建私人私信通道。在该频道中发送消息。

    【讨论】:

    • 如何向所有者发送机器人所需的权限?因为我想为每个命令使用它。
    • 由于kick_error 是在机器人没有踢成员 权限(kick_members)时引发的,所以您可以简单地将其添加到发送的字符串中。这可以在任何必要的地方进行。
    猜你喜欢
    • 2021-06-14
    • 2021-04-25
    • 2017-07-29
    • 1970-01-01
    • 2021-04-25
    • 2011-09-18
    • 1970-01-01
    • 2021-09-06
    • 2014-02-17
    相关资源
    最近更新 更多