【问题标题】:Is there a way to use an async check function for discord.py wait_for?有没有办法为 discord.py wait_for 使用异步检查功能?
【发布时间】:2021-02-16 13:42:48
【问题描述】:

我想要一个方法来改变

async def check(reaction, user):
   await x
   return y

await self.bot.wait_for('reaction_add', check=check)

这会产生一条错误消息,指出未等待检查功能:

discord.ext.commands.errors.CommandInvokeError: Command raised an exception: ExtensionFailed: Extension 'cogs.boost' raised an error: SyntaxError: 'await' outside async function 

如果我将代码更改为:

async def check(reaction, user):
   await x
   return y
await self.bot.wait_for('reaction_add', check=await check)

我收到以下错误消息:

TypeError: object function can't be used in 'await' expression

有什么办法可以有异步检查功能吗?谢谢!当前帮助命令到自定义命令,在我的机器人中使用 discord.py

【问题讨论】:

  • check 用于discord 1.5.1

标签: python bots discord.py


【解决方案1】:

试试这个:

import asyncio
@...
async def your_command(ctx, ...):

    async def run():
        # you can use await there
        return ...


    def check(msg):
        result = asyncio.create_task(run()) # run the async function
        return resul

    ctx = client.wait_for("message", check=check)

还有一个例子:

import asyncio

@client.command()
async def test(ctx):

    async def run(msg):
        await msg.send("This message is not yours!", hidden=True)
        return


    def check(msg):

        if msg.author.id == ctx.author.id:
            return True
        else:
            asyncio.create_task(run(msg))
            return False

    ctx = await client.wait_for("raw_reaction_add", check=check)

    ...

【讨论】:

    【解决方案2】:

    通过深入研究代码(在 discord.py 1.5.1 上),似乎没有办法使用协程作为您的检查功能。可能存在一种 hacky 解决方法,但这不是最佳实践,并且会导致比通过实施它解决的问题更多的问题。如果你想使用check,只需编写一个同步版本的执行检查的函数,并确保它尽可能高效以防止阻塞。

    【讨论】:

      猜你喜欢
      • 2020-12-06
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多