Enhance profile card generation in default.py by setting default colors to ruby red, improving the stats area with a modern glass effect, and refining the level bar design with gradients and rounded corners for a more visually appealing layout.
Some checks are pending
Run pre-commit / Run pre-commit (push) Waiting to run
Some checks are pending
Run pre-commit / Run pre-commit (push) Waiting to run
This commit is contained in:
parent
fc0b4341d6
commit
6d9ac89123
2 changed files with 78 additions and 37 deletions
|
@ -146,9 +146,9 @@ def generate_default_profile(
|
||||||
Returns:
|
Returns:
|
||||||
t.Tuple[bytes, bool]: The generated full profile image as bytes, and whether the image is animated.
|
t.Tuple[bytes, bool]: The generated full profile image as bytes, and whether the image is animated.
|
||||||
"""
|
"""
|
||||||
user_color = user_color or base_color
|
user_color = user_color or (155, 17, 30) # Default to ruby red
|
||||||
stat_color = stat_color or base_color
|
stat_color = stat_color or (155, 17, 30) # Default to ruby red
|
||||||
level_bar_color = level_bar_color or base_color
|
level_bar_color = level_bar_color or (155, 17, 30) # Default to ruby red
|
||||||
|
|
||||||
if isinstance(background_bytes, str) and background_bytes.startswith("http"):
|
if isinstance(background_bytes, str) and background_bytes.startswith("http"):
|
||||||
log.debug("Background image is a URL, attempting to download")
|
log.debug("Background image is a URL, attempting to download")
|
||||||
|
@ -240,7 +240,7 @@ def generate_default_profile(
|
||||||
# Create the stats layer with glass effect
|
# Create the stats layer with glass effect
|
||||||
stats_layer = Image.new("RGBA", desired_card_size, (0, 0, 0, 0))
|
stats_layer = Image.new("RGBA", desired_card_size, (0, 0, 0, 0))
|
||||||
|
|
||||||
# Define the stats area (right side of the card)
|
# Define the stats area with a modern glass effect
|
||||||
stats_area = (
|
stats_area = (
|
||||||
400, # x1 - Start after profile picture
|
400, # x1 - Start after profile picture
|
||||||
20, # y1 - Start near top
|
20, # y1 - Start near top
|
||||||
|
@ -248,16 +248,34 @@ def generate_default_profile(
|
||||||
430 # y2 - End near bottom
|
430 # y2 - End near bottom
|
||||||
)
|
)
|
||||||
|
|
||||||
# Create glass effect for stats area
|
# Create a semi-transparent background for stats
|
||||||
stats_bg = card.crop(stats_area)
|
glass = Image.new("RGBA", desired_card_size, (0, 0, 0, 0))
|
||||||
if stats_bg.mode != "RGBA":
|
glass_draw = ImageDraw.Draw(glass)
|
||||||
stats_bg = stats_bg.convert("RGBA")
|
glass_draw.rounded_rectangle(stats_area, radius=20, fill=(255, 255, 255, 30))
|
||||||
glass_bg = imgtools.create_glass_effect(stats_bg, opacity=0.25, blur_radius=15)
|
|
||||||
|
|
||||||
# Add rounded corners to the glass effect
|
# Add a subtle gradient overlay
|
||||||
stats_mask = imgtools.get_rounded_corner_mask(glass_bg, radius=20)
|
gradient = Image.new("RGBA", desired_card_size, (0, 0, 0, 0))
|
||||||
glass_bg.putalpha(stats_mask)
|
gradient_draw = ImageDraw.Draw(gradient)
|
||||||
stats_layer.paste(glass_bg, stats_area, glass_bg)
|
for i in range(20):
|
||||||
|
opacity = int(255 * (1 - i/20))
|
||||||
|
gradient_draw.rounded_rectangle(
|
||||||
|
(stats_area[0], stats_area[1]+i, stats_area[2], stats_area[3]),
|
||||||
|
radius=20,
|
||||||
|
fill=(255, 255, 255, opacity)
|
||||||
|
)
|
||||||
|
|
||||||
|
# Composite the glass effect
|
||||||
|
stats_layer = Image.alpha_composite(stats_layer, glass)
|
||||||
|
stats_layer = Image.alpha_composite(stats_layer, gradient)
|
||||||
|
|
||||||
|
# Add a subtle border
|
||||||
|
border_draw = ImageDraw.Draw(stats_layer)
|
||||||
|
border_draw.rounded_rectangle(
|
||||||
|
stats_area,
|
||||||
|
radius=20,
|
||||||
|
outline=(255, 255, 255, 100),
|
||||||
|
width=2
|
||||||
|
)
|
||||||
|
|
||||||
# Draw stats with improved styling
|
# Draw stats with improved styling
|
||||||
draw = ImageDraw.Draw(stats_layer)
|
draw = ImageDraw.Draw(stats_layer)
|
||||||
|
@ -305,14 +323,31 @@ def generate_default_profile(
|
||||||
bar_height = 25
|
bar_height = 25
|
||||||
bar_y = stats_area[3] - 60
|
bar_y = stats_area[3] - 60
|
||||||
|
|
||||||
progress_bar = imgtools.make_progress_bar(
|
# Enhance the level bar with a modern design
|
||||||
bar_width,
|
bar_bg = Image.new("RGBA", (bar_width, bar_height), (0, 0, 0, 100))
|
||||||
bar_height,
|
bar_progress = Image.new("RGBA", (
|
||||||
progress,
|
int(bar_width * (current_xp - previous_xp) / (next_xp - previous_xp)),
|
||||||
color=level_bar_color,
|
bar_height
|
||||||
background_color=(100, 100, 100, 160)
|
), level_bar_color + (200,)) # Add alpha channel
|
||||||
|
|
||||||
|
# Add gradient to progress bar
|
||||||
|
gradient = Image.new("RGBA", bar_progress.size, (0, 0, 0, 0))
|
||||||
|
gradient_draw = ImageDraw.Draw(gradient)
|
||||||
|
for i in range(bar_height):
|
||||||
|
opacity = int(100 * (1 - i/bar_height))
|
||||||
|
gradient_draw.rectangle(
|
||||||
|
(0, i, bar_progress.width, i+1),
|
||||||
|
fill=(255, 255, 255, opacity)
|
||||||
)
|
)
|
||||||
stats_layer.paste(progress_bar, (start_x, bar_y), progress_bar)
|
bar_progress = Image.alpha_composite(bar_progress, gradient)
|
||||||
|
|
||||||
|
# Round the corners
|
||||||
|
bar_mask = Image.new("L", (bar_width, bar_height))
|
||||||
|
bar_mask_draw = ImageDraw.Draw(bar_mask)
|
||||||
|
bar_mask_draw.rounded_rectangle((0, 0, bar_width-1, bar_height-1), radius=bar_height//2, fill=255)
|
||||||
|
|
||||||
|
bar_bg.putalpha(bar_mask)
|
||||||
|
bar_progress.putalpha(bar_mask)
|
||||||
|
|
||||||
# XP text
|
# XP text
|
||||||
xp_font = ImageFont.truetype(str(font_path or imgtools.DEFAULT_FONT), 24)
|
xp_font = ImageFont.truetype(str(font_path or imgtools.DEFAULT_FONT), 24)
|
||||||
|
|
|
@ -165,27 +165,31 @@ class ProfileFormatting(MixinMeta):
|
||||||
pdata = conf.prestigedata[profile.prestige]
|
pdata = conf.prestigedata[profile.prestige]
|
||||||
|
|
||||||
if conf.use_embeds or self.db.force_embeds:
|
if conf.use_embeds or self.db.force_embeds:
|
||||||
txt = f"{level}|" + _("Level {}\n").format(humanize_number(profile.level))
|
|
||||||
if pdata:
|
|
||||||
txt += f"{trophy}|" + _("Prestige {}\n").format(
|
|
||||||
f"{humanize_number(profile.prestige)} {pdata.emoji_string}"
|
|
||||||
)
|
|
||||||
txt += f"{star}|{humanize_number(profile.stars)}" + _(" stars\n")
|
|
||||||
txt += f"{chat}|{humanize_number(profile.messages)}" + _(" messages sent\n")
|
|
||||||
txt += f"{mic}|{utils.humanize_delta(profile.voice)}" + _(" in voice\n")
|
|
||||||
progress_txt = f"{bulb}|{humanize_number(progress)}/{humanize_number(current_diff)}"
|
|
||||||
txt += progress_txt + _(" Exp ({} total)\n").format(humanize_number(current_xp))
|
|
||||||
if conf.showbal:
|
|
||||||
balance = await bank.get_balance(member)
|
|
||||||
creditname = await bank.get_currency_name(guild)
|
|
||||||
txt += f"{money}|{humanize_number(balance)} {creditname}\n"
|
|
||||||
color = member.color
|
|
||||||
if profile.statcolor:
|
if profile.statcolor:
|
||||||
color = discord.Color.from_rgb(*utils.string_to_rgb(profile.statcolor))
|
color = discord.Color.from_rgb(*utils.string_to_rgb(profile.statcolor))
|
||||||
elif profile.barcolor:
|
elif profile.barcolor:
|
||||||
color = discord.Color.from_rgb(*utils.string_to_rgb(profile.barcolor))
|
color = discord.Color.from_rgb(*utils.string_to_rgb(profile.barcolor))
|
||||||
elif profile.namecolor:
|
elif profile.namecolor:
|
||||||
color = discord.Color.from_rgb(*utils.string_to_rgb(profile.namecolor))
|
color = discord.Color.from_rgb(*utils.string_to_rgb(profile.namecolor))
|
||||||
|
else:
|
||||||
|
# Default to ruby color if no custom color is set
|
||||||
|
color = discord.Color.from_rgb(155, 17, 30) # Ruby red
|
||||||
|
|
||||||
|
# Create a cleaner layout with emojis and values aligned
|
||||||
|
txt = ""
|
||||||
|
txt += f"{level} **Level {humanize_number(profile.level)}**\n"
|
||||||
|
if pdata:
|
||||||
|
txt += f"{trophy} **Prestige {humanize_number(profile.prestige)}** {pdata.emoji_string}\n"
|
||||||
|
txt += f"{star} **{humanize_number(profile.stars)}** stars\n"
|
||||||
|
txt += f"{chat} **{humanize_number(profile.messages)}** messages sent\n"
|
||||||
|
txt += f"{mic} **{utils.humanize_delta(profile.voice)}** in voice\n"
|
||||||
|
progress_txt = f"{bulb} **{humanize_number(progress)}/{humanize_number(current_diff)}**"
|
||||||
|
txt += f"{progress_txt} XP (**{humanize_number(current_xp)}** total)\n"
|
||||||
|
if conf.showbal:
|
||||||
|
balance = await bank.get_balance(member)
|
||||||
|
creditname = await bank.get_currency_name(guild)
|
||||||
|
txt += f"{money} **{humanize_number(balance)}** {creditname}\n"
|
||||||
|
|
||||||
embed = discord.Embed(description=txt, color=color)
|
embed = discord.Embed(description=txt, color=color)
|
||||||
embed.set_author(
|
embed.set_author(
|
||||||
name=_("{}'s Profile").format(member.display_name if profile.show_displayname else member.name),
|
name=_("{}'s Profile").format(member.display_name if profile.show_displayname else member.name),
|
||||||
|
@ -197,7 +201,9 @@ class ProfileFormatting(MixinMeta):
|
||||||
),
|
),
|
||||||
icon_url=guild.icon,
|
icon_url=guild.icon,
|
||||||
)
|
)
|
||||||
embed.add_field(name=_("Progress"), value=box(bar, lang="python"), inline=False)
|
# Make the progress bar more visually appealing
|
||||||
|
bar = box(bar.replace("█", "■").replace("░", "□"), lang="")
|
||||||
|
embed.add_field(name=_("Level Progress"), value=bar, inline=False)
|
||||||
return embed
|
return embed
|
||||||
|
|
||||||
kwargs = {
|
kwargs = {
|
||||||
|
|
Loading…
Add table
Reference in a new issue