forked from MarseyWorld/MarseyWorld
allow changing hat name
parent
58627a4b4d
commit
d14208afdc
|
@ -23,7 +23,7 @@ marseyaward_title_regex = re.compile("( *<img[^>]+>)+", flags=re.A)
|
|||
|
||||
emoji_name_regex = re.compile("[a-z0-9]{1,30}", flags=re.A)
|
||||
tags_regex = re.compile("[a-z0-9: ]{1,200}", flags=re.A)
|
||||
hat_regex = re.compile("[\w\-() ,]{1,50}", flags=re.A)
|
||||
hat_name_regex = re.compile("[\w\-() ,]{1,50}", flags=re.A)
|
||||
description_regex = re.compile("[^<>&\n\t]{1,300}", flags=re.A)
|
||||
|
||||
badge_name_regex = re.compile(r"[^\/.]+", flags=re.A)
|
||||
|
|
|
@ -313,7 +313,7 @@ def submit_hat(v):
|
|||
if not file or not file.content_type.startswith('image/'):
|
||||
abort(400, "You need to submit an image!")
|
||||
|
||||
if not hat_regex.fullmatch(name):
|
||||
if not hat_name_regex.fullmatch(name):
|
||||
abort(400, "Invalid name!")
|
||||
|
||||
existing = g.db.query(HatDef.name).filter_by(name=name).one_or_none()
|
||||
|
@ -360,7 +360,7 @@ def approve_hat(v, name):
|
|||
|
||||
new_name = request.values.get('name').strip()
|
||||
if not new_name: abort(400, "You need to include a name!")
|
||||
if not hat_regex.fullmatch(new_name): abort(400, "Invalid name!")
|
||||
if not hat_name_regex.fullmatch(new_name): abort(400, "Invalid name!")
|
||||
if not description_regex.fullmatch(description): abort(400, "Invalid description!")
|
||||
|
||||
try:
|
||||
|
@ -558,48 +558,76 @@ def update_hats(v):
|
|||
@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400, key_func=get_ID)
|
||||
@admin_level_required(PERMS['UPDATE_ASSETS'])
|
||||
def update_hat(v):
|
||||
file = request.files["image"]
|
||||
name = request.values.get('name', '').strip()
|
||||
|
||||
if g.is_tor:
|
||||
abort(400, "Image uploads are not allowed through TOR!")
|
||||
file = request.files["image"]
|
||||
new_name = request.values.get('new_name', '').strip()
|
||||
|
||||
if not file or not file.content_type.startswith('image/'):
|
||||
abort(400, "You need to submit an image!")
|
||||
|
||||
if not hat_regex.fullmatch(name):
|
||||
abort(400, "Invalid name!")
|
||||
|
||||
existing = g.db.query(HatDef.name).filter_by(name=name).one_or_none()
|
||||
existing = g.db.query(HatDef).filter_by(name=name).one_or_none()
|
||||
if not existing:
|
||||
abort(400, "A hat with this name doesn't exist!")
|
||||
|
||||
highquality = f"/asset_submissions/hats/{name}"
|
||||
file.save(highquality)
|
||||
process_image(highquality, v) #to ensure not malware
|
||||
updated = False
|
||||
|
||||
with Image.open(highquality) as i:
|
||||
if i.width > 100 or i.height > 130:
|
||||
os.remove(highquality)
|
||||
abort(400, "Images must be 100x130")
|
||||
if new_name and existing.name != new_name:
|
||||
if not hat_name_regex.fullmatch(new_name):
|
||||
abort(400, "Invalid new name!")
|
||||
|
||||
format = i.format.lower()
|
||||
new_path = f'/asset_submissions/hats/original/{name}.{format}'
|
||||
old_path = f"files/assets/images/hats/{existing.name}.webp"
|
||||
new_path = f"files/assets/images/hats/{new_name}.webp"
|
||||
rename(old_path, new_path)
|
||||
|
||||
for x in IMAGE_FORMATS:
|
||||
if path.isfile(f'/asset_submissions/hats/original/{name}.{x}'):
|
||||
os.remove(f'/asset_submissions/hats/original/{name}.{x}')
|
||||
for x in IMAGE_FORMATS:
|
||||
original_old_path = f'/asset_submissions/hats/original/{existing.name}.{x}'
|
||||
original_new_path = f'/asset_submissions/hats/original/{new_name}.{x}'
|
||||
if path.isfile(original_old_path):
|
||||
rename(original_old_path, original_new_path)
|
||||
|
||||
rename(highquality, new_path)
|
||||
existing.name = new_name
|
||||
updated = True
|
||||
name = existing.name
|
||||
|
||||
if file:
|
||||
if g.is_tor:
|
||||
abort(400, "Image uploads are not allowed through TOR!")
|
||||
if not file.content_type.startswith('image/'):
|
||||
abort(400, "You need to submit an image!")
|
||||
|
||||
highquality = f"/asset_submissions/hats/{name}"
|
||||
file.save(highquality)
|
||||
process_image(highquality, v) #to ensure not malware
|
||||
|
||||
with Image.open(highquality) as i:
|
||||
if i.width > 100 or i.height > 130:
|
||||
os.remove(highquality)
|
||||
abort(400, "Images must be 100x130")
|
||||
format = i.format.lower()
|
||||
|
||||
new_path = f'/asset_submissions/hats/original/{name}.{format}'
|
||||
|
||||
for x in IMAGE_FORMATS:
|
||||
if path.isfile(f'/asset_submissions/hats/original/{name}.{x}'):
|
||||
os.remove(f'/asset_submissions/hats/original/{name}.{x}')
|
||||
|
||||
rename(highquality, new_path)
|
||||
|
||||
filename = f"files/assets/images/hats/{name}.webp"
|
||||
copyfile(new_path, filename)
|
||||
process_image(filename, v, resize=100)
|
||||
purge_files_in_cloudflare_cache([f"{SITE_FULL_IMAGES}/i/hats/{name}.webp", f"{SITE_FULL_IMAGES}/asset_submissions/hats/original/{name}.{format}"])
|
||||
updated = True
|
||||
|
||||
|
||||
if not updated:
|
||||
abort(400, "You need to actually update something!")
|
||||
|
||||
g.db.add(existing)
|
||||
|
||||
filename = f"files/assets/images/hats/{name}.webp"
|
||||
copyfile(new_path, filename)
|
||||
process_image(filename, v, resize=100)
|
||||
purge_files_in_cloudflare_cache([f"{SITE_FULL_IMAGES}/i/hats/{name}.webp", f"{SITE_FULL_IMAGES}/asset_submissions/hats/original/{name}.{format}"])
|
||||
ma = ModAction(
|
||||
kind="update_hat",
|
||||
user_id=v.id,
|
||||
_note=f'<a href="{SITE_FULL_IMAGES}/i/hats/{name}.webp">{name}</a>'
|
||||
)
|
||||
g.db.add(ma)
|
||||
|
||||
return {"message": f"'{name}' updated successfully!"}
|
||||
|
|
|
@ -48,10 +48,12 @@
|
|||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<label class="mt-3" for="new_name">New Name</label>
|
||||
<input autocomplete="off" type="text" id="new_name" class="form-control" name="new_name" maxlength="30" placeholder="Optional">
|
||||
|
||||
{% if type == "Emoji" %}
|
||||
<label class="mt-3" for="tags">Additional Tags</label>
|
||||
<input autocomplete="off" type="text" id="name" class="form-control" name="tags" maxlength="200" placeholder="Optional">
|
||||
|
||||
|
|
Loading…
Reference in New Issue