Discord.py: wait_for ('response_add') не работает должным образом

Я пытаюсь создать FAQ-бота на discord.py, и пока все идет хорошо. Я хотел добавить дополнительную функцию, при которой, когда бот обнаруживает FAQ, вместо прямой отправки ответа бот отправляет быстрое сообщение с двумя реакциями - большим пальцем вверх и большим пальцем вниз - и в зависимости от выбранной реакции. пользователем бот либо отправляет ответ, либо удаляет подсказку.

Теперь, когда запрашивается FAQ, бот обнаруживает его и отправляет запрос, спрашивая, хочет ли пользователь ответ, и даже реагирует на него. Проблема в том, что сообщение с подсказкой удаляется, как только бот заканчивает реагировать с помощью смайлика с опущенными пальцами. Я хочу, чтобы он дождался реакции пользователя и действовал соответственно.

Что я делаю неправильно? Пожалуйста помоги. Заранее спасибо!

@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('\N{THUMBS UP SIGN}')
            await botmessage.add_reaction('\N{THUMBS DOWN SIGN}')

            def checkUp(reaction, user):
                return user == message.author and str(reaction.emoji) == '\N{THUMBS UP SIGN}' or str(reaction.emoji) == '\N{THUMBS 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 == '\N{THUMBS UP SIGN}':
                    await botmessage.delete()
                    await message.channel.send(answer_text)

                elif reaction.emoji == '\N{THUMBS DOWN SIGN}':
                    await botmessage.delete()


person Vaibav79    schedule 27.06.2020    source источник


Ответы (1)


Проблема, скорее всего, кроется в вашей функции checkUp, поскольку вам не хватает круглых скобок.

user == message.author and str(reaction.emoji) == '\N{THUMBS UP SIGN}' or str(reaction.emoji) == '\N{THUMBS DOWN SIGN}'

Я не совсем уверен в поведении python по умолчанию при встрече с такой логической цепочкой, но, возможно, он помещает скобки как таковые:

(user == message.author and str(reaction.emoji) == '\N{THUMBS UP SIGN}') or (str(reaction.emoji) == '\N{THUMBS DOWN SIGN}')

Ты видишь проблему? Теперь, пока кто-то реагирует на сообщение "не нравится", проверка возвращает True. Это означает, что он может реагировать на свою предыдущую реакцию (хотя вы, возможно, уже выполняли это раньше, здесь мы говорим об асинхронном режиме).

Исправление: заключите круглые скобки как таковые:

user == message.author and (str(reaction.emoji) == '\N{THUMBS UP SIGN}' or str(reaction.emoji) == '\N{THUMBS DOWN SIGN}')
person chluebi    schedule 27.06.2020