【问题标题】:Discord.py , many users react at the same time, causing error so how to solve this problem?Discord.py ,很多用户同时反应,导致报错,如何解决这个问题?
【发布时间】:2020-10-14 01:52:48
【问题描述】:

我正在制作拍卖机器人。所以我添加了反应出价。当用户不同时做出反应时,它的效果很好。但是,当许多用户一次又一次地同时做出反应(垃圾邮件)时,系统无法赶上当前值,因此有时它会使用旧值。我怎么解决这个问题 ?或我如何制作队列反应事件

@bot.event
async def on_raw_reaction_add(payload):
        channel = bot.get_channel(payload.channel_id)
        user = bot.get_user(payload.user_id)
        try:
            msgMuzayede =await channel.fetch_message(payload.message_id)

        #Mesajımıza ulaştık buradan embed ettiğim price kısmını kullanalım
        #  
            fields = msgMuzayede.embeds
            embedMsg = fields[0]
            currentValue = embedMsg.fields[0].value
            bet = embedMsg.fields[1].value
            if user.bot == False and embedMsg.fields[5].name != "FINISHED":
                if embedMsg.fields[5].name == "FINISHED":
                #alert = await channel.send("Its Finished")
                #kullanıcın mesajını silme özelliği eklenmeli
                    m=await channel.send("It is finished!!!")
                    await m.delete(delay=15)
                    return
                
                elif payload.emoji.name =="2️⃣":
                    
                    embedMsg.set_field_at(0,name="Price",value=int(currentValue)+(int(bet)*2),inline=True)
                    embedMsg.set_field_at(3,name="Winner",value=user.mention,inline=True)
                    await msgMuzayede.edit(embed=embedMsg)
                elif payload.emoji.name =="3️⃣":
                    

                    embedMsg.set_field_at(0,name="Price",value=int(currentValue)+(int(bet)*3),inline=True)
                    embedMsg.set_field_at(3,name="Winner",value=user.mention,inline=True)
                    await msgMuzayede.edit(embed=embedMsg)
                elif payload.emoji.name =="4️⃣":
                    

                    embedMsg.set_field_at(0,name="Price",value=int(currentValue)+(int(bet)*4),inline=True)
                    embedMsg.set_field_at(3,name="Winner",value=user.mention,inline=True)
                    await msgMuzayede.edit(embed=embedMsg)
                elif payload.emoji.name =="5️⃣":
                    

                    embedMsg.set_field_at(0,name="Price",value=int(currentValue)+(int(bet)*5),inline=True)
                    embedMsg.set_field_at(3,name="Winner",value=user.mention,inline=True)
                    await msgMuzayede.edit(embed=embedMsg)
                elif payload.emoji.name =="6️⃣":
                    

                    embedMsg.set_field_at(0,name="Price",value=int(currentValue)+(int(bet)*6),inline=True)
                    embedMsg.set_field_at(3,name="Winner",value=user.mention,inline=True)
                    await msgMuzayede.edit(embed=embedMsg)
                elif payload.emoji.name =="7️⃣":
                    

                    embedMsg.set_field_at(0,name="Price",value=int(currentValue)+(int(bet)*7),inline=True)
                    embedMsg.set_field_at(3,name="Winner",value=user.mention,inline=True)
                    await msgMuzayede.edit(embed=embedMsg)
                elif payload.emoji.name =="8️⃣":
                    

                    embedMsg.set_field_at(0,name="Price",value=int(currentValue)+(int(bet)*8),inline=True)
                    embedMsg.set_field_at(3,name="Winner",value=user.mention,inline=True)
                    await msgMuzayede.edit(embed=embedMsg)
                elif payload.emoji.name =="9️⃣":
                    

                    embedMsg.set_field_at(0,name="Price",value=int(currentValue)+(int(bet)*9),inline=True)
                    embedMsg.set_field_at(3,name="Winner",value=user.mention,inline=True)
                    await msgMuzayede.edit(embed=embedMsg)
                elif payload.emoji.name =="????":
                    

                    embedMsg.set_field_at(0,name="Price",value=int(currentValue)+(int(bet)*10),inline=True)
                    embedMsg.set_field_at(3,name="Winner",value=user.mention,inline=True)
                    await msgMuzayede.edit(embed=embedMsg)
                elif payload.emoji.name =="????":
                    

                    embedMsg.set_field_at(0,name="Price",value=int(currentValue)+(int(bet)*100),inline=True)
                    embedMsg.set_field_at(3,name="Winner",value=user.mention,inline=True)
                    await msgMuzayede.edit(embed=embedMsg)
                elif payload.emoji.name =="????":
                    

                    embedMsg.set_field_at(0,name="Price",value=int(currentValue)+(int(bet)*1000),inline=True)
                    embedMsg.set_field_at(3,name="Winner",value=user.mention,inline=True)
                    await msgMuzayede.edit(embed=embedMsg)

            time.sleep(1)        
                    
        except Exception as e:
            print("react",e)   

【问题讨论】:

  • 在本地跟踪 currentValue(以及当前的获胜者)...无论您的拍卖是什么,而不是相信从嵌入的消息中读取它。
  • 我应该使用数据库吗?
  • 取决于您的应用程序的要求。对于初学者来说,可能只是一个全局变量。
  • 我想,当我使用局部变量或数据库时会发生什么? on_raw_reaction_add() 函数。是异步的,所以当触发这个功能太多时,它可能会同时工作。由于它是异步运行的,因此它会在一个操作结束之前启动另一个进程。新进程可能会在其他进程更改其值之前使用旧值。
  • 我只是想为异步函数创建队列,但是在这里询问如何做到这一点

标签: python discord python-asyncio discord.py


【解决方案1】:

感谢没有帮助的人。

你可以像这样使用 bot.wait_for:

async def reaction_control(message):
     while( True):  #Your condition
          def check (reaction,user):
            return reaction.emoji == "?"
          try:
            reaction,user = await bot.wait_for("reaction_add",timeout=0.1,check=check)     
          except asyncio.TimeoutError:
            pass
          else:

            #Your Code

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    相关资源
    最近更新 更多