aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Chris <[email protected]>2021-04-22 21:02:31 +0100
committerGravatar Chris <[email protected]>2021-04-22 21:02:31 +0100
commit9b9ab546090dc2513ac00f6b476b8b494eb5428a (patch)
tree6a651d168769edcbdf653fbf0b527bd962a993ee
parentFix captitilization in docstring (diff)
Escape invalid filename chars before saving.
This would cause an issue with the embed not embedding the image due to a filename mismatch. This has been implemented by escaping all invalid filename characters before saving the file.
-rw-r--r--bot/exts/evergreen/profile_pic_modification/pfp_modify.py40
1 files changed, 24 insertions, 16 deletions
diff --git a/bot/exts/evergreen/profile_pic_modification/pfp_modify.py b/bot/exts/evergreen/profile_pic_modification/pfp_modify.py
index 77c937de..f6b1d394 100644
--- a/bot/exts/evergreen/profile_pic_modification/pfp_modify.py
+++ b/bot/exts/evergreen/profile_pic_modification/pfp_modify.py
@@ -1,7 +1,9 @@
import asyncio
import json
import logging
+import string
import typing as t
+import unicodedata
from concurrent.futures import ThreadPoolExecutor
import discord
@@ -36,6 +38,23 @@ async def in_executor(func: t.Callable, *args) -> t.Any:
return await loop.run_in_executor(_EXECUTOR, func, *args)
+def file_safe_name(effect: str, display_name: str) -> str:
+ """Returns a file safe filename based on the given effect and display name."""
+ valid_filename_chars = f"-_.() {string.ascii_letters}{string.digits}"
+
+ file_name = FILENAME_STRING.format(effect=effect, author=display_name)
+
+ # Replace spaces
+ file_name = file_name.replace(" ", "_")
+
+ # Normalize unicode characters
+ cleaned_filename = unicodedata.normalize('NFKD', file_name).encode('ASCII', 'ignore').decode()
+
+ # Remove invalid filename characters
+ cleaned_filename = ''.join(c for c in cleaned_filename if c in valid_filename_chars)
+ return cleaned_filename
+
+
class PfpModify(commands.Cog):
"""Various commands for users to change their own profile picture."""
@@ -76,10 +95,7 @@ class PfpModify(commands.Cog):
return
image_bytes = await member.avatar_url.read()
- file_name = FILENAME_STRING.format(
- effect="eightbit_avatar",
- author=member.display_name
- )
+ file_name = file_safe_name("eightbit_avatar", member.display_name)
file = await in_executor(
PfpEffects.apply_effect,
@@ -135,10 +151,7 @@ class PfpModify(commands.Cog):
ctx.send = send_message # Reassigns ctx.send
image_bytes = await member.avatar_url_as(size=256).read()
- file_name = FILENAME_STRING.format(
- effect="easterified_avatar",
- author=member.display_name
- )
+ file_name = file_safe_name("easterified_avatar", member.display_name)
file = await in_executor(
PfpEffects.apply_effect,
@@ -167,10 +180,7 @@ class PfpModify(commands.Cog):
) -> None:
"""Gets and sends the image in an embed. Used by the pride commands."""
async with ctx.typing():
- file_name = FILENAME_STRING.format(
- effect="pride_avatar",
- author=ctx.author.display_name
- )
+ file_name = file_safe_name("pride_avatar", ctx.author.display_name)
file = await in_executor(
PfpEffects.apply_effect,
@@ -280,10 +290,8 @@ class PfpModify(commands.Cog):
async with ctx.typing():
image_bytes = await member.avatar_url.read()
- file_name = FILENAME_STRING.format(
- effect="spooky_avatar",
- author=member.display_name
- )
+ file_name = file_safe_name("spooky_avatar", member.display_name)
+
file = await in_executor(
PfpEffects.apply_effect,
image_bytes,