Discord.py: wait_for('reaction_add') tidak berfungsi sebagaimana mestinya

Saya mencoba membuat bot FAQ di discord.py dan sejauh ini berjalan baik. Saya ingin menambahkan fitur tambahan di mana ketika FAQ terdeteksi oleh bot, alih-alih langsung mengirimkan jawabannya, bot mengirimkan pesan cepat dengan dua reaksi -- suka dan tidak suka -- dan bergantung pada reaksi yang dipilih oleh pengguna, bot mengirimkan jawaban atau menghapus pesan prompt.

Sekarang ketika FAQ ditanyakan, bot mendeteksinya dan mengirimkan prompt menanyakan apakah pengguna menginginkan jawabannya dan bahkan bereaksi terhadapnya. Masalahnya adalah, pesan prompt akan dihapus segera setelah bot selesai bereaksi dengan emoji Jempol ke bawah. Saya ingin menunggu pengguna bereaksi dan melanjutkan.

Apa yang saya lakukan salah? Tolong bantu. Terima kasih sebelumnya!

@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 sumber


Jawaban (1)


Masalahnya kemungkinan besar terletak pada fungsi checkUp Anda, karena Anda kehilangan tanda kurung.

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

Saya tidak begitu yakin tentang perilaku default python ketika menghadapi rantai boolean seperti ini, tetapi mungkin ia memberi tanda kurung seperti ini:

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

Apakah kamu melihat masalahnya? Kini selama seseorang bereaksi dengan tidak menyukai pesan tersebut, pemeriksaan akan mengembalikan True. Artinya, ia dapat bereaksi terhadap reaksi sebelumnya (walaupun Anda mungkin pernah mengeksekusi ini sebelumnya, kita membicarakan tentang async di sini).

Perbaikan: Beri tanda kurung seperti ini:

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