i have a problem. I want to make a task for my giveaway-bot for checking if a giveaway ended. So I created a task for doing it and it runs many lines of code and everything is working. But I noticed that my code is pretty slow. Can anyone help me and say what I can improve and how to speed this up?
I use aiomysql for connecting to my mariadb database and time.time() for checking the code speed.
Sorry if I'm making something wrong, I'm new on this site, feel free to comment if you need anything from me. :)
My Discord-py task:
@tasks.loop(minutes=5.5)
async def end_check(self):
await self.client.wait_until_ready()
start = time.time()
mydb = await getConnection()
mycursor = await mydb.cursor()
current = datetime.now().timestamp()
current = str(current).split(".")
# get the main giveaway-data
await mycursor.execute("SELECT guild_id, channel_id, message_id, gw_req FROM guild_giveaways WHERE end_date < %s", (current[0],))
in_database = mycursor.fetchall()
for entry in in_database:
guild = self.client.get_guild(int(entry[0]))
channel = guild.get_channel(int(entry[1]))
message = await channel.fetch_message(int(entry[2]))
emb = message.embeds[0].description.split("**")
creator_id = emb[7].replace("<@", "").replace(">", "").replace("!", "")
count = 0
gwrole = None
users = []
async for user in message.reactions[0].users():
if guild.get_member(int(user.id)) is None:
continue
if user.bot:
continue
# check if a user has the role/s from the database
bypass_status = False
await mycursor.execute("SELECT bypass_role_id FROM guild_role_settings WHERE guild_id = %s AND bypass_role_id IS NOT NULL", (guild.id,))
role_exist = await mycursor.fetchone()
if role_exist:
rolelist = role_exist[0].split(" ")
for role1 in rolelist:
role = guild.get_role(int(role1))
if role in user.roles:
bypass_status = True
break
if "no_nitro" in entry[3].lower():
if user.avatar_url is not None and bypass_status is False:
if "gif" in str(user.avatar_url):
continue
if user.premium_since is not None and bypass_status is False:
continue
elif "msg" in entry[3].lower():
msg = entry[3].replace("MSG: ", "")
# get the required message count to participate
await mycursor.execute("SELECT message_count FROM guild_message_count WHERE guild_id = %s AND user_id = %s", (guild.id, user.id))
data = await mycursor.fetchone()
if data:
if int(data[0]) < int(msg) and bypass_status is False:
continue
else:
if bypass_status is False:
continue
elif "voicetime" in entry[3].lower():
seconds = entry[3].replace("VOICETIME: ", "")
# get the right voice_time to participate
await mycursor.execute("SELECT voice_time FROM guild_voice_time WHERE guild_id = %s AND user_id = %s", (guild.id, user.id))
data = await mycursor.fetchone()
if data:
if int(data[0]) < int(seconds) and bypass_status is False:
continue
else:
if bypass_status is False:
continue
elif "role_id" in entry[3].lower():
roleid = entry[3].replace("ROLE_ID: ", "")
role = guild.get_role(int(roleid))
if role not in user.roles and bypass_status is False:
continue
elif "mitglied" in entry[3].lower():
reqtime = entry[3].replace("MITGLIED:", "")
if time.time() - user.joined_at.timestamp() < int(reqtime) and bypass_status is False:
continue
if int(user.id) == int(creator_id):
continue
await mycursor.execute("SELECT ignore_role_id FROM guild_role_settings WHERE guild_id = %s", (guild.id,))
find_data = await mycursor.fetchone()
if find_data:
if find_data[0] is not None and len(find_data[0]) >= 3:
rolelist = find_data[0].split(" ")
for role1 in rolelist:
role = guild.get_role(int(role1))
if role in user.roles:
continue
users.append(user)
count += 1
if int(count) < int(emb[5]):
winners = random.sample(users, k=int(count))
if count <= 0:
await mycursor.close()
mydb.close()
return await message.reply(f"`` › **Zu wenig Teilnehmer:** Ich konnte nur `{count}` Gewinner ziehen, {emb[7]}! <:AmongUs:774306215848181760>")
zuwenig = True
else:
zuwenig = False
winners = random.sample(users, k=int(emb[5]))
status = True
# check if server bot private messages are enabled
await mycursor.execute("SELECT dm_status FROM guild_misc_settings WHERE guild_id = %s", (entry[0],))
myresult = await mycursor.fetchone()
if myresult:
if myresult[0] == "False":
status = False
role_status = False
# check if the winner should receive a role
await mycursor.execute("SELECT win_role_id FROM guild_role_settings WHERE guild_id = %s", (entry[0],))
myresult = await mycursor.fetchone()
if myresult:
if myresult[0] is not None:
gwrole = guild.get_role(int(myresult[0]))
if gwrole is not None:
role_status = True
for winner in winners:
if status is True:
try:
done = discord.Embed(title="<a:COOL:805075050368598036> › **GEWINNSPIEL GEWONNEN!** <a:COOL:805075050368598036>",
description="`` › Lade den Bot **[hier](https://bl4cklist.de/invites/gift-bot)** ein.\n\n"
f"<a:gift:843914342835421185> › Du hast bei dem Gewinnspiel auf **[{guild.name}]({message.jump_url})** gewonnen!\n"
f"<a:love:855117868256198767> › Ein Teammitglied wird sich **demnächst** bei dir melden.",
color=0x778beb)
done.set_image(url="https://i.imgur.com/fBsIE3R.png")
await winner.send(content="Du hast bei einem Gewinnspiel **GEWONNEN!!** <a:blobbeers:862780904112128051>", embed=done)
except discord.Forbidden:
pass
if role_status is True:
try:
await winner.add_roles(gwrole, reason="Gewinnspiel gewonnen!")
except discord.Forbidden:
pass
database_winners = " ".join([str(winner.id) for winner in winners])
winners = ", ".join([winner.mention for winner in winners])
if winners.count(",") >= 1:
winnersdesc = f"{winners} haben **{message.embeds[0].title}** gewonnen! <a:love:855117868256198767>"
else:
winnersdesc = f"{winners} hat **{message.embeds[0].title}** gewonnen! <a:love:855117868256198767>"
embed = discord.Embed(title=message.embeds[0].title,
description="`` › Lade den Bot **[hier](https://bl4cklist.de/invites/gift-bot)** ein.\n\n"
"<a:trophy:867917461377404949> **__Gewinnspiel - Gewinner__**\n"
f"<:arrow2:868989719319564359> Gewinner: {winners}\n"
f"<:arrow2:868989719319564359> Erstellt von {emb[7]}\n⠀⠀",
color=0xff4d4d)
embed.set_footer(text=f"{self.client.user.name} - Bot", icon_url=str(self.client.user.avatar_url))
embed.timestamp = datetime.now()
embed.set_thumbnail(url=message.embeds[0].thumbnail.url)
if zuwenig is False:
await message.edit(content=":name_badge: **GEWINNSPIEL VORBEI!** :name_badge:", embed=embed)
else:
await message.edit(content=f"`` › **Zu wenig Teilnehmer:** Ich konnte nur `{count}` Gewinner ziehen! <:whut:848347703217487912>", embed=embed)
await mycursor.execute("INSERT INTO guild_finished_giveaways (guild_id, channel_id, message_id, winner_id) VALUES (%s, %s, %s, %s)", (entry[0], entry[1], entry[2], database_winners))
await mycursor.execute("SELECT COUNT(*) FROM guild_finished_giveaways WHERE guild_id = %s", (entry[0],))
gcount = await mycursor.fetchone()
count2 = '{:,}'.format(int(gcount[0])).replace(",", ".")
count1 = '{:,}'.format(int(count)).replace(',', '.')
await message.reply(content=f"<a:blobbeers:862780904112128051> **Herzlichen Glückwunsch**, {winnersdesc}\n"
f"› Es gab `{count1}` **gültige** Teilnehmer. Dieses Gewinnspiel war das `{count2}`. auf dem Server. <a:PETTHEPEEPO:772189322392371201>")
if status is True:
try:
done = discord.Embed(
title="<a:Info:810178313733013504> › **GEWINNSPIEL VORBEI!**",
description="`` › Lade den Bot **[hier](https://bl4cklist.de/invites/gift-bot)** ein.\n\n"
f"`✅` › Das Gewinnspiel auf **[{guild.name}]({message.jump_url})** ist vorbei!\n"
f"`` › Da du das Event gestartet hast, habe ich **dich informiert.**\n\n"
f"`` › **Zahle das Gewinnspiel** selbst aus, oder kümmere dich\n"
f"`` › darum, dass es die zuständige Person erledigt.",
color=0xffa502)
done.set_image(url="https://i.imgur.com/fBsIE3R.png")
creator = guild.get_member(int(creator_id))
await creator.send(content="Ein Gewinnspiel ist **VORBEI!**", embed=done)
except discord.Forbidden:
pass
await mycursor.execute("DELETE FROM guild_giveaways WHERE guild_id = %s AND channel_id = %s AND message_id = %s", (entry[0], entry[1], entry[2]))
await mydb.commit()
mydb.close()
await mycursor.close()
print(f"EndTask: {time.time() - start}")