discord.py 如何使用 wait_for 等待作者消息?

Posted

技术标签:

【中文标题】discord.py 如何使用 wait_for 等待作者消息?【英文标题】:discord.py how to wait for author message using wait_for? 【发布时间】:2019-07-10 09:53:37 【问题描述】:

我正在发出等待用户回复机器人的命令,但我希望机器人只接受作者的回复。

@client.command(name='numgame',
            brief='Guess a number between 1 and 100',
            pass_context=True)
async def numgame(context):
number = random.randint(1,100)
guess = 4
while guess != 0:
    await context.send('Pick a number between 1 and 100')
    msg = await client.wait_for('message', check=check, timeout=30)
    attempt = int(msg.content)
    if attempt > number:
        await context.send(str(guess) + ' guesses left...')
        await asyncio.sleep(1)
        await context.send('Try going lower')
        await asyncio.sleep(1)
        guess -= 1
    elif attempt < number:
        await context.send(str(guess) + ' guesses left...')
        await asyncio.sleep(1)
        await context.send('Try going higher')
        await asyncio.sleep(1)
        guess -=1
    elif attempt == number:
        await context.send('You guessed it! Good job!')
        break

我的问题是任何人都可以响应“选择一个数字”,而我只希望启动命令的人能够响应。

我不太确定该尝试什么,但我认为这可能与争论有关。不过,我不知道从哪里开始,所以一个解决方案将不胜感激!非常感谢。

【问题讨论】:

我们能看到你的check吗?您需要在该函数中包含对作者的检查 @PatrickHaugh ,我编辑了我的帖子以显示整个命令。希望这会有所帮助。 您将check=check 传递给wait_forcheck 是什么? 哦,我使用的支票完全不相关。哈哈,那我怎么让它得到作者呢? 【参考方案1】:

您需要重写您的check,以便它知道作者是谁。一种方法是使用闭包。假设您有一张现有的支票

def check(message):
    return message.content == "Hello"

您可以将其替换为生成等效检查函数的函数,并将您要检查的作者注入其中

def check(author):
    def inner_check(message):
        return message.author == author and message.content == "Hello"
    return inner_check

然后您将通过使用适当的参数调用外部检查将内部检查传递给wait_for

msg = await client.wait_for('message', check=check(context.author), timeout=30)

为了您的检查,这将是

def check(author):
    def inner_check(message): 
        if message.author != author:
            return False
        try: 
            int(message.content) 
            return True 
        except ValueError: 
            return False
    return inner_check

【讨论】:

我现有的检查是:def check(message): try: int(message.content) return True except ValueError: return False 在这种情况下我应该如何合并闭包? 嘿,我知道这个答案已经 2 年了,但我试过了,得到了:discord.ext.commands.errors.CommandInvokeError: Command raised an exception: TypeError: rolecheck() takes 1 positional argument but 2 were given 没关系,我忘了传递自我,因为命令在齿轮中哈哈

以上是关于discord.py 如何使用 wait_for 等待作者消息?的主要内容,如果未能解决你的问题,请参考以下文章

discord.py wait_for message... 如何取消息内容和写消息的人?

Discord.py:wait_for('reaction_add') 未按预期工作

在 discord.py wait_for 上带有 check() 的 TypeError

discord.py wait_for('reaction_add') 与直接消息的功能不同

Discord.py 按钮交互消息删除

如何使用 discord.py 让 discord bot ping 用户 [关闭]