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

Posted

技术标签:

【中文标题】Discord.py:wait_for(\'reaction_add\') 未按预期工作【英文标题】:Discord.py: wait_for('reaction_add') not working as intendedDiscord.py:wait_for('reaction_add') 未按预期工作 【发布时间】:2020-10-17 22:00:32 【问题描述】:

我正在尝试在 discord.py 上制作一个常见问题解答机器人,到目前为止进展顺利。我想添加一个额外功能,当机器人检测到常见问题解答时,机器人不会直接发送答案,而是会发送一条提示消息,其中包含两个反应——竖起大拇指和不喜欢——并取决于所选的反应由用户,机器人要么发送答案,要么删除提示消息。

现在,当询问常见问题解答时,机器人会检测到它并发送提示,询问用户是否想要答案,甚至对其做出反应。问题是,一旦机器人完成对拇指向下表情符号的反应,提示消息就会被删除。我希望它等待用户做出反应并相应地继续。

我做错了什么?请帮忙。提前致谢!

@bot.event
async def on_message(message):
    await bot.process_commands(message)
    
    if (message.author.bot):
        return        

    if(isQuestion(message.content)):
        (answer_text, question_text) = answer_question(message.content)

        if answer_text:
            botmessage = await message.channel.send(f"""Do you want the answer to: question_text ?""")
            
            await botmessage.add_reaction('\NTHUMBS UP SIGN')
            await botmessage.add_reaction('\NTHUMBS DOWN SIGN')

            def checkUp(reaction, user):
                return user == message.author and str(reaction.emoji) == '\NTHUMBS UP SIGN' or str(reaction.emoji) == '\NTHUMBS DOWN SIGN'

            try:
                reaction, user = await bot.wait_for('reaction_add', timeout=60.0, check=checkUp)
            except asyncio.TimeoutError:
                await botmessage.delete()
            else:
                print(reaction.emoji)
                if reaction.emoji == '\NTHUMBS UP SIGN':
                    await botmessage.delete()
                    await message.channel.send(answer_text)

                elif reaction.emoji == '\NTHUMBS DOWN SIGN':
                    await botmessage.delete()

【问题讨论】:

【参考方案1】:

问题很可能在于您的“checkUp”函数,因为您缺少括号。

user == message.author and str(reaction.emoji) == '\NTHUMBS UP SIGN' or str(reaction.emoji) == '\NTHUMBS DOWN SIGN'

当遇到这样的布尔链时,我不确定python的默认行为,但它可能是这样放置括号的:

(user == message.author and str(reaction.emoji) == '\NTHUMBS UP SIGN') or (str(reaction.emoji) == '\NTHUMBS DOWN SIGN')

你看到问题了吗?现在,只要某人对消息做出反应,检查就会返回 True。这意味着它可以对自己之前的反应做出反应(尽管您之前可能已经执行过此操作,但我们在这里讨论的是异步)。

修复: 像这样放括号:

user == message.author and (str(reaction.emoji) == '\NTHUMBS UP SIGN' or str(reaction.emoji) == '\NTHUMBS DOWN SIGN')

【讨论】:

以上是关于Discord.py:wait_for('reaction_add') 未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

Discord.py 按钮交互消息删除

discord.py和discord.py的区别[voice]