我的"Kick"命令有一个问题,它将返回一个错误.也许问题不在于代码,而在于角色设置的discord. 简而言之,使用此命令,用户可以踢自己,也可以踢具有相同角色的成员(例如,版主).我希望它在试图踢我自己或一个同样角色的人时抛出一个错误.以下是我的代码:

from __future__ import annotations

from typing import Optional
from .. import Plugin
from core import Bot
from discord import app_commands, Interaction, Member


def can_moderate():
    async def predicate(interaction: Interaction):
        target: Member = interaction.namespace.member or interaction.namespace.target
        if not target: return True
        assert interaction.guild is not None and isinstance(interaction.user, Member)

        if (
            target.top_role.position > interaction.user.top_role.position
            or target.guild_permissions.kick_members
            or target.guild_permissions.ban_members
            or target.guild_permissions.administrator
            or target.guild_permissions.manage_guild
        ):
            raise app_commands.CheckFailure(f"You can't kick **{target}**")
        return True
    
    return app_commands.check(predicate)


class Moderation(Plugin):
    def __init__(self, bot: Bot) -> None:
        self.bot = bot

    @app_commands.command(name = "kick", description = "Kick a member")
    @app_commands.default_permissions(kick_members = True)
    @app_commands.describe(member = "Select a member", reason = "Specify a reason for the kick")
    async def kick_command(self, interaction: Interaction, member: Member, reason: Optional[str]):
        if not reason: reason = "not specified"
        try:
            await member.kick(reason = reason)
        except:
            await self.bot.error(f"I'm sorry, but I can't kick **{member}**", interaction)
        else:
            await self.bot.success(f"**{member}** has been kicked ? from the server.", interaction)


async def setup(bot: Bot):
    await bot.add_cog(Moderation(bot))

预先感谢您的帮助,❤️!

试图改变条件,大概是这样的:

        if (
            target.top_role.position >= interaction.user.top_role.position
            or target.guild_permissions.kick_members
            or target.guild_permissions.ban_members
            or target.guild_permissions.administrator
            or target.guild_permissions.manage_guild
            or target.id == interaction.user.id
        ):
            raise app_commands.CheckFailure(f"You can't kick **{target}**")
        return True

推荐答案

而不是使它成为一个函数并使事情变得过于复杂,您只需在踢成员之前做一些判断.

由于您仅将其设置为kick函数,因此我们可以简单地将其添加到命令中,因为这不会有什么不同.

New code:

async def kick(self, interaction: Interaction, member: Member, reason: str = None):

if member.top_role <= interaction.author.top_role or member.id == interaction.author.id or member.id == interaction.me.id: # Add more checks here
    return # Your message here

如果需要,可以添加更多条件,但请记住格式.

Python相关问答推荐

用Python获取HTML Span类中的数据

将HTML输出转换为表格中的问题

列表上值总和最多为K(以O(log n))的最大元素数

删除最后一个pip安装的包

NP.round解算数据后NP.unique

用NumPy优化a[i] = a[i-1]*b[i] + c[i]的迭代计算

django禁止直接分配到多对多集合的前端.使用user.set()

无法定位元素错误404

OR—Tools CP SAT条件约束

用渐近模计算含符号的矩阵乘法

如何使用SentenceTransformers创建矢量嵌入?

将scipy. sparse矩阵直接保存为常规txt文件

将标签移动到matplotlib饼图中楔形块的开始处

在pandas/python中计数嵌套类别

从列表中获取n个元素,其中list [i][0]== value''

交替字符串位置的正则表达式

不允许 Select 北极滚动?

为什么dict. items()可以快速查找?

多个矩阵的张量积

设置索引值每隔17行左右更改的索引