discord.ext.commands.errors.MissingRequiredArgument:公会是缺少的必需参数

时间:2020-02-21 01:10:53

标签: discord.py discord.py-rewrite

我想创建一个命令来设置所有文本通道的权限,但是我很难创建该命令

我已经尝试了很多次,但是我不记得我必须做什么 请帮助我,我需要一个代码

我的代码:

@bot.command()
async def close_all(ctx, *, guild: discord.Guild):
    for chan in guild.channels:
      await guild.channels.set_permissions(ctx.guild.default_role, send_messages=False)

错误: guild is a required argument that is missing.

2 个答案:

答案 0 :(得分:1)

尝试

@bot.command()
async def close_all(ctx):
    for chan in ctx.guild.channels:
      await chan.set_permissions(ctx.guild.default_role, send_messages=False)

看着你得到的错误,在我看来,你好像没有传递公会对象。另外,您的for循环实际上并没有使用它的索引,除非确保它运行一定的次数。

只要您要更改的公会权限是您要向其中发送此消息的公会的权限,这应该可以工作。

答案 1 :(得分:1)

您现在正在做的是要求公会作为命令的参数,所以机器人实际上正在寻找的是消息

close_all <guild>

guild: discord.Guild是公会的Converter,因此应以某种方式将字符串转换为公会对象。由于这实际上是不可能的,因此您的命令将无法正常工作。

简便的解决方案:只需始终使用已发送邮件的公会即可

@bot.command()
async def close_all(ctx):
    for chan in ctx.guild.channels:
        await guild.channels.set_permissions(ctx.guild.default_role, send_messages=False)

更灵活的解决方案:一个额外的参数传递给该函数,该参数是应在其中执行命令的行会的ID

@bot.command()
async def close_all(ctx, guild_id: int):
    # finding the guild according to the id passed
    guild = discord.utils.find(lambda g: g.id == guild_id, ctx.bot.guilds)
    for chan in guild.channels:
        await guild.channels.set_permissions(ctx.guild.default_role, send_messages=False)