Discord.py: wait_for('reaction_add') ไม่ทำงานตามที่ตั้งใจ

ฉันกำลังพยายามสร้างบอทคำถามที่พบบ่อยบน discord.py และจนถึงตอนนี้ก็ดำเนินไปด้วยดี ฉันต้องการเพิ่มคุณสมบัติพิเศษที่เมื่อบอทตรวจพบคำถามที่พบบ่อย แทนที่จะส่งคำตอบโดยตรง บอทจะส่งข้อความแจ้งพร้อมปฏิกิริยาสองแบบ -- ยกนิ้วโป้งขึ้นและยกนิ้วโป้งลง -- และขึ้นอยู่กับปฏิกิริยาที่เลือก โดยผู้ใช้ บอทจะส่งคำตอบหรือลบข้อความแจ้ง

ตอนนี้เมื่อมีการถามคำถามที่พบบ่อย บอทจะตรวจจับและส่งข้อความถามว่าผู้ใช้ต้องการคำตอบหรือไม่และยังตอบสนองต่อคำถามนั้นด้วย ปัญหาคือข้อความแจ้งจะถูกลบทันทีที่บอทโต้ตอบกับอิโมจิ Thumbs-down เสร็จ ฉันต้องการให้ผู้ใช้โต้ตอบและดำเนินการตามนั้น

ผมทำอะไรผิดหรือเปล่า? กรุณาช่วย. ขอบคุณล่วงหน้า!

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


ปัญหาน่าจะอยู่ที่ฟังก์ชันตรวจสอบของคุณ เนื่องจากคุณไม่มีวงเล็บ

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 ซึ่งหมายความว่ามันสามารถโต้ตอบ ต่อปฏิกิริยาก่อนหน้านี้ (แม้ว่าคุณจะเคยดำเนินการนี้มาก่อน แต่เรากำลังพูดถึง async ที่นี่)

แก้ไข: ใส่วงเล็บดังนี้:

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