Use timestamps in file names to fix caching issue

late-submissions
Elnu 2 years ago
parent c10853f5d1
commit fcb7dda20d

@ -74,6 +74,7 @@ pub async fn submit(ctx: Context<'_>, submission: serenity::Attachment) -> Resul
let challenge_number = get_challenge_number(); let challenge_number = get_challenge_number();
let submission_images_dir = get_submission_images_dir(); let submission_images_dir = get_submission_images_dir();
let timestamp = std::time::SystemTime::now().duration_since(std::time::UNIX_EPOCH).unwrap().as_millis();
// Ensure that submission_images_dir exists // Ensure that submission_images_dir exists
let path = Path::new(&submission_images_dir); let path = Path::new(&submission_images_dir);
@ -115,7 +116,7 @@ pub async fn submit(ctx: Context<'_>, submission: serenity::Attachment) -> Resul
i + 1, i + 1,
slugify(&author.name), slugify(&author.name),
author.discriminator, author.discriminator,
images.len() + 1, timestamp,
extension extension
); );
images.push(file_name.clone().into()); images.push(file_name.clone().into());
@ -154,15 +155,11 @@ pub async fn submit(ctx: Context<'_>, submission: serenity::Attachment) -> Resul
} }
requires_rebuild = true; requires_rebuild = true;
let file_name = format!( let file_name = format!(
"{}-{}-{}{}.{}", "{}-{}-{}-{}.{}",
submission_data.len() + 1, submission_data.len() + 1,
slugify(&author.name), slugify(&author.name),
author.discriminator, author.discriminator,
if images.len() == 0 { timestamp,
String::from("")
} else {
format!("-{}", images.len() + 1)
},
extension extension
); );
images.push(file_name.clone().into()); images.push(file_name.clone().into());
@ -204,7 +201,6 @@ pub async fn submit(ctx: Context<'_>, submission: serenity::Attachment) -> Resul
Some(data["invite"].as_str().unwrap()) Some(data["invite"].as_str().unwrap())
} else { } else {
None }; None };
let timestamp = std::time::SystemTime::now().duration_since(std::time::UNIX_EPOCH).unwrap().as_millis();
for image in submitted_images.iter() { for image in submitted_images.iter() {
for (other_guild_id, data) in guild_data.iter() { for (other_guild_id, data) in guild_data.iter() {
let here = other_guild_id.eq(&ctx.guild_id().unwrap().as_u64().to_string()); let here = other_guild_id.eq(&ctx.guild_id().unwrap().as_u64().to_string());
@ -374,43 +370,6 @@ pub async fn imagedelete(ctx: Context<'_>, number: i32) -> Result<(), Error> {
submission_data.remove(i); submission_data.remove(i);
} else { } else {
images.remove(index); images.remove(index);
// One must rename all of the submitted images to prevent overwrites.
// Consider the following scenario:
// The submissions are ["bob-1234.png", "bob-1234-2.png"]
// Bob uses the command imageDelete 1
// The submissions become ["bob-1234-2.png"]
// Bob makes a second submission
// The submissions become ["bob-1234-2.png", "bob-1234-2.png"]
// The original bob-1234-2.png gets overwriten,
// and both submissions end up pointing to the same image.
// In order to prevent this, images need to be renamed according to their index.
for (j, image) in images.iter_mut().enumerate() {
let old = image.as_str().unwrap();
let from = format!("{}/{}", submission_images_dir, old);
let author = ctx.author();
let new = format!(
"{}-{}-{}{}.{}",
i + 1,
slugify(&author.name),
author.discriminator,
if j == 0 {
String::from("")
} else {
format!("-{}", j + 1)
},
Path::new(old).extension().unwrap().to_str().unwrap()
);
let to = format!("{}/{}", submission_images_dir, new);
if old.eq(&new) {
// TODO: This could be made more efficient by
// automatically starting iteration just after deleted image
// since only images with later indexes will be affected
continue;
}
fs_extra::file::move_file(from, to, &fs_extra::file::CopyOptions::default())
.unwrap();
*image = new.into();
}
submission["images"] = images.into(); submission["images"] = images.into();
} }
set_submission_data(submission_data); set_submission_data(submission_data);

Loading…
Cancel
Save