【问题标题】:How can I work around a possible "wait_for" event error with my discord bot?如何解决我的不和谐机器人可能出现的“wait_for”事件错误?
【发布时间】:2021-04-30 18:27:44
【问题描述】:

我有一个事件等待消息下的反应。但是,如果一旦这个事件被丢弃,机器人就会失败,然后如果你点击反应,机器人就没有反应,因为他无法捕捉到这个反应。有没有另一种方法可以让机器人继续运行? 我不喜欢使用timeout 事件或asyncio.sleep,因为输入应该来自用户。这可能吗? 到目前为止我的代码没有解决方法:

            try:
                reaction, user = await self.bot.wait_for('reaction_add', timeout=43200)
                while user == self.bot.user:
                    reaction, user = await self.bot.wait_for('reaction_add', timeout=43200)
                if str(reaction.emoji) == "⏯":
                    await ctx.send("**Your next question will appear in `6` seconds.**", delete_after=5)
                    await intense.delete()
            except asyncio.TimeoutError:
                await ctx.send("**Really?! I though `12 hours` would be enough..."
                               "Your next question will come in about `6` seconds.**", delete_after=5)

            await asyncio.sleep(6)

【问题讨论】:

    标签: python discord discord.py


    【解决方案1】:

    下面我添加了两个示例并对现有代码进行了调整以使其更简洁。除非机器人添加的消息被删除,否则它不会失败,否则它会起作用。我还添加了一个检查功能以提供帮助,但您可以将其更改为您想要的任何内容。包含一个真正的循环,因此它会一直等待输入。

    message = await ctx.send("Test reactions")
    
    back = '⬅️'
    forward= '⏯'
    
    await message.add_reaction(back)
    await message.add_reaction(forward)
    
        def check(reaction, user):
            return user == ctx.author and str(reaction.emoji) in [back, forward]
            
            member = ctx.author
            while True:
                try:
                    reaction, user = await client.wait_for("reaction_add", check=check)
    
                    if str(reaction.emoji) == back:
                        await ctx.send('Going back')
    
                    if str(reaction.emoji) == forward:
                        await ctx.send('Going forward')
    

    您的其他解决方案只是使用 on_reaction_add 事件,但我不建议您这样做,除非您的机器人很小,并且没有人介意如果他们发送了您在代码中输入的表情符号,是否总是会发送消息。

    到目前为止,这是一种更简单的方法,但与 wait_for 相比,可能不会期望得到最好的结果,但希望这也能有所帮助。

    @client.event
    async def on_reaction_add(reaction, user):
    
            if reaction.emoji == '⬅️':
                await ctx.send('Going back')
    
    
            if reaction.emoji == '⏯':
                await ctx.send('Going back')
    
    

    问题在于,它始终处于活动状态并等待添加这些反应,这可能会导致机器人间歇性减速,或者人们可能会意外对表情符号做出反应并弄乱命令,因为他们不应该这样做除非调用了原始命令,否则能够使用这些命令。

    【讨论】:

      【解决方案2】:

      我相信raw_reaction_add 应该在这种情况下工作。每次用户都会与它引发事件的消息反应进行交互

      【讨论】:

      • 但是这个事件不是靠固定的消息和固定的渠道来得到这个反应吗?
      猜你喜欢
      • 1970-01-01
      • 2021-04-27
      • 2021-11-03
      • 2021-09-22
      • 2022-01-19
      • 1970-01-01
      • 2021-05-21
      • 2020-08-29
      • 1970-01-01
      相关资源
      最近更新 更多