【发布时间】: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