Skip to content

Instantly share code, notes, and snippets.

@Kanin
Created February 17, 2022 01:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Kanin/bdb85c2640f0eb750f063df7bbaf13c0 to your computer and use it in GitHub Desktop.
Save Kanin/bdb85c2640f0eb750f063df7bbaf13c0 to your computer and use it in GitHub Desktop.
@commands.command()
async def profile(self, ctx: Context, user: discord.Member = None):
user = user or ctx.author
canvas_size = (600, 600)
background = Editor(Canvas(canvas_size, color=(35, 35, 35)))
user_data = await self.bot.pool.fetchrow(
"""SELECT * FROM (
SELECT row_number() OVER (
ORDER BY text_xp + voice_xp DESC) AS rank, * FROM levels ORDER BY text_xp + voice_xp DESC)
AS _ WHERE user_id = $1""",
user.id
)
if not user_data:
return await ctx.reply(f"{user} does not have any data!")
#
# Logo
#
logo = Image.open("utils/assets/images/boobbotlogo.png")
logo = logo.resize((600, 600))
background.paste(logo, (0, 0))
#
# Film
#
film = generate_gradient((0, 0, 0, 0), (0, 0, 0, 200), 600, 600)
film = Editor(film)
background.paste(film, (0, 0))
#
# Avatar
#
avatar_url = user.avatar.with_format("png").with_size(128).url if user.avatar else user.default_avatar.url
avatarBytes = BytesIO(await (await self.bot.session.get(avatar_url)).read())
avatar = Editor(Image.open(avatarBytes)).rounded_corners(30, 0)
background.paste(avatar, (25, 25))
#
# Name
#
name_font_size = 60
name_font = ImageFont.truetype("utils/assets/fonts/default.ttf", size=name_font_size)
name_text = user.name
name_maxW = 412
while name_font.getsize(name_text)[0] > name_maxW:
name_font_size -= 1
name_font = ImageFont.truetype("utils/assets/fonts/default.ttf", name_font_size)
background.text(
(163, 45),
name_text,
font=name_font,
color=(255, 255, 255)
)
#
# Title
#
title_font_size = 30
title_font = ImageFont.truetype("utils/assets/fonts/default.ttf", size=title_font_size)
title_text = "Developer" if user.id == 173237945149423619 else "BETA"
title_maxW = 412
while title_font.getsize(title_text)[0] > title_maxW:
title_font_size -= 1
title_font = ImageFont.truetype("utils/assets/fonts/default.ttf", title_font_size)
title_textW, title_textH = title_font.getsize(title_text)
background.text(
(163, 143 - title_textH),
title_text,
font=title_font,
color=(255, 255, 255)
)
#
# Level
#
level, progress = get_level_from_xp(user_data["text_xp"] + user_data["voice_xp"], True)
next_xp = get_level_xp(level)
rank_bg = Editor(Image.new("RGBA", (128, 40), (230, 1, 231, 200)))
rank_font_size = 30
rank_font = ImageFont.truetype("utils/assets/fonts/default.ttf", size=rank_font_size)
rank_text = f"#{user_data['rank']}"
rank_textW, rank_textH = rank_font.getsize(rank_text)
rank_textH -= int(rank_textH*0.21)
rank_bg.text(
((128 - rank_textW) / 2, (40 - rank_textH) / 2),
rank_text,
font=rank_font,
color=(255, 255, 255)
)
rank_bg.rounded_corners(20, 0)
background.paste(rank_bg, (25, 178))
barWidth, barHeight = 274, 40
xpWidth = int(barWidth * (progress / next_xp))
bar_bg = Editor(Image.new("RGBA", (barWidth, barHeight), (66, 66, 66, 150)))
xp_bg = Editor(Image.new("RGBA", (xpWidth, barHeight), (230, 1, 231, 255)))
bar_bg.paste(xp_bg, (0, 0))
xp_font_size = 30
xp_font = ImageFont.truetype("utils/assets/fonts/default.ttf", size=xp_font_size)
if progress >= 1000:
progress = f"{progress / 1000:.1f}K"
if next_xp >= 1000:
next_xp = f"{next_xp / 1000:.1f}K"
xp_text = f"{progress}/{next_xp}"
xp_textW, xp_textH = xp_font.getsize(xp_text)
xp_textH -= int(xp_textH*0.21)
bar_bg.text(
((274 - xp_textW)/2, (40 - xp_textH)/2),
xp_text,
font=xp_font,
color=(255, 255, 255)
)
bar_bg.rounded_corners(20, 0)
background.paste(bar_bg, (163, 178))
level_bg = Editor(Image.new("RGBA", (128, 40), (230, 1, 231, 200)))
level_font_size = 30
level_font = ImageFont.truetype("utils/assets/fonts/default.ttf", size=level_font_size)
level_text = f"lvl {level}"
level_textW, level_textH = level_font.getsize(level_text)
level_textH -= int(level_textH*0.21)
level_bg.text(
((128 - level_textW)/2, (40 - level_textH)/2),
level_text,
font=level_font,
color=(255, 255, 255)
)
level_bg.rounded_corners(20, 0)
background.paste(level_bg, (447, 178))
background.rounded_corners(30, 0)
await ctx.reply(file=discord.File(fp=background.image_bytes, filename="Profile.png"))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment