如何在我的 clearall 命令中使用 wait_for? (不和谐.py)

时间:2021-02-26 22:02:32

标签: python discord.py

我正在创建一个 clearall 命令来清除该频道中的所有消息,我希望它有一个是和否选项,但我对 wait_for 不是很熟悉。任何人都可以将其合并到 clearall 命令代码中吗?

@client.command
@commands.has_guild_permissions(administrator=True)
async def clearall(ctx):
    await ctx.channel.purge(limit=99999999)
    await ctx.send("All messages cleared.")

2 个答案:

答案 0 :(得分:1)

为了使用 wait_for,您必须传递 3 个参数。第一个参数是 event。根据 API 参考:

<块引用>
  • event – 要等待的事件名称,类似于事件引用,但没有 on_ 前缀。

第二个参数是 check 函数。再次根据 API 参考:

<块引用>
  • check – 检查要等待什么的谓词。参数必须满足正在等待的事件的参数。

最后一个参数是 timeout

<块引用>
  • timeout – 在超时和引发 asyncio.TimeoutError 之前等待的秒数。

因此,要等待 yesno 响应,您可以:

@client.command()
@commands.has_guild_permissions(administrator=True)
async def clearall(ctx):
    await ctx.send('Do you want to remove messages?')
    try:
        await client.wait_for('message', check=lambda m: m.content.lower()=='yes' and m.author==ctx.author, timeout=60.0)
    except asyncio.TimeoutError:
        await ctx.send('Timeout error')
    await ctx.channel.purge(limit=99999999)
    await ctx.send("All messages cleared.")

使用此代码,如果您键入 yes,它将清除所有消息。如果您输入的不是 yes,则不会执行任何操作。

如果您希望它在输入不是 yes 时执行某些操作,例如取消,您也可以这样做。

@client.command()
@commands.has_guild_permissions(administrator=True)
async def clearall(ctx):
    await ctx.send('Do you want to remove messages?(yes/no)')
    try:
        respond = await client.wait_for('message', timeout=60.0)
    except asyncio.TimeoutError:
        await ctx.send('Timeout error')
    if respond.content.lower() == 'yes' and respond.author==ctx.author:
        await ctx.send('done')
        await ctx.send("All messages cleared.")
    else:
        await ctx.send('canceled')

因此,如果您输入 yes 以外的其他内容,它将取消删除过程。

参考

答案 1 :(得分:0)

试试这个:

@client.command()
async def clearall(ctx):
    await ctx.send('Would you like to clear all messages in this channel?')
    def check(m):
        return m.channel == ctx.channel and m.author == ctx.author
    try:
        message = await client.wait_for('message', timeout=5.0, check=check)
    except asyncio.TimeoutError:
        await ctx.send('Input not received in time')
    else:
        if 'yes' in message.content.lower():
            await ctx.channel.purge(limit=99999999)
        else:
            return

timeout=5.0 用于限制命令等待下一条消息的时间 - 在本例中为 5 秒。您可以将其修改为您自己的时间值。在此示例中,如果用户在 5 秒内没有响应,则机器人将打印出 Input not received in time