Python 3.x discord py-消息删除性能低下(多台服务器)
我有个问题。我拥有一个全球聊天室,可以在100多台服务器上共享用户信息。所有邮件都有一个一次性代码,用于在每台服务器上删除此邮件 但是我的机器人需要2个多小时才能删除一条消息,如果有人用垃圾邮件侮辱我,这条消息真的很糟糕。所以我在问我如何加速我的代码,这样他就可以很快地从所有服务器上删除消息 “我的代码”是一个discord命令,用于删除bot所在的每台服务器上的特定消息(每条消息都包含一次性代码并保存在数据库中) 信息如何保存在数据库中的图片:Python 3.x discord py-消息删除性能低下(多台服务器),python-3.x,discord.py,mysql-python,Python 3.x,Discord.py,Mysql Python,我有个问题。我拥有一个全球聊天室,可以在100多台服务器上共享用户信息。所有邮件都有一个一次性代码,用于在每台服务器上删除此邮件 但是我的机器人需要2个多小时才能删除一条消息,如果有人用垃圾邮件侮辱我,这条消息真的很糟糕。所以我在问我如何加速我的代码,这样他就可以很快地从所有服务器上删除消息 “我的代码”是一个discord命令,用于删除bot所在的每台服务器上的特定消息(每条消息都包含一次性代码并保存在数据库中) 信息如何保存在数据库中的图片: messageID=来自消息作者的原始消息id。
messageID
=来自消息作者的原始消息id。
code
=每条消息的一次性代码。
ids
=包含相同一次性代码的所有其他邮件ID。
time
=此时删除该行,以从数据库中删除非常旧的消息,并将其清除
我的“服务器”表格如何保存在数据库中的图片:
guildID
=来自特定服务器的guildID。
channelID
=机器人发布消息的通道
这是我删除消息命令的代码:
@bot.command(aliases=["delmsg", "deletemessage", "msgdelete", "del"])
async def delete(ctx, code=None):
guild = bot.get_guild(616655040614236160)
member = guild.get_member(ctx.author.id)
role2 = guild.get_role(792894127972155393) # Admin
role3 = guild.get_role(792894172829974529) # Mod
if role2 in member.roles or role3 in member.roles:
mydb = mysql.connector.connect(
host="**",
user="**",
password="**",
database="global-bot"
)
mycursor = mydb.cursor()
mycursor.execute(
f"SELECT * FROM messeges WHERE code = '{code}'")
myresult3 = mycursor.fetchall()
if myresult3:
await ctx.message.delete()
await ctx.send('start deleting message..', delete_after=15)
mycursor.execute(f"SELECT * FROM servers") ##########
myresult = mycursor.fetchall()
ids = myresult3[0][2].split(" ")
for x in ids:
for server in myresult:
try:
x1 = [server]
channel = bot.get_channel(int(x1[0][1]))
msg = await channel.fetch_message(int(x))
await msg.delete()
except:
pass
for server in myresult:
try:
x1 = [server]
channel = bot.get_channel(int(x1[0][1]))
msg = await channel.fetch_message(myresult3[0][0])
await msg.delete()
except:
pass
channel2 = bot.get_channel(794269462848077845)
await ctx.send(f"message with code {code} was deleted", delete_after=15)
await channel2.send(embed=embed2)
sql = f"DELETE FROM messeges WHERE code = '{code}'" # This line here is to delete the row with the used code in the delete command, for let my bot regenerate it and use it in a different message sometime.
mycursor.execute(sql)
mydb.commit()
else:
await ctx.send(f"message with one-time code `{code}` could not be deleted! Maybe you had a typo or the code doesnt exist.", delete_after=15)
await ctx.message.delete()
else:
await ctx.send("not enough rights")
在查看代码一段时间后,我意识到这里的嵌套循环效率非常低:
for x in ids:
for server in myresult:
try:
x1 = [server]
channel = bot.get_channel(int(x1[0][1]))
msg = await channel.fetch_message(int(x))
await msg.delete()
except:
pass
这是因为程序在尝试将消息id与正确的服务器匹配时浪费了大量时间。我强烈建议你不要让程序这么做,而是在你的机器人发布外键并将其添加到数据库中时,将外键以公会id的形式存储在消息中
这将允许您删除嵌套循环,并且仅按消息id删除循环,因为您已经拥有每条消息的相应公会id。问题是机器人无法从服务器的所有fast中删除它吗?或者它会延迟&2小时后不会删除第一条消息bot无法从服务器的所有fast中删除它。您能用变量名更具描述性吗?例如,
x
和xx
是什么编辑了这个问题。看起来怎么样?我对感到困惑,当你的机器人发布并添加到数据库中时,你将外键以公会id的形式存储在消息中。
。这就是我将消息保存到表中的方式:所以我必须将Guidid作为列添加到消息数据库表中?然后呢?然后你把它合并到你的代码中。因此,您不必浪费大量时间尝试将消息id与正确的服务器匹配,只需循环浏览每条消息,使用数据库中的guildid从特定的guild中删除消息。这将删除嵌套循环。