diff --git a/src/commands/challenge.rs b/src/commands/challenge.rs index 945b075..84c90d0 100644 --- a/src/commands/challenge.rs +++ b/src/commands/challenge.rs @@ -149,11 +149,17 @@ pub async fn submit(ctx: Context<'_>, submission: serenity::Attachment) -> Resul break; } } + let username = if author.discriminator == 0 { // new usernames + author.name.clone() + } else { + format!("{}#{}", author.name, author.discriminator) + }; + let username = &username; if !existing_submitter { let mut submitter_data = Map::new(); submitter_data.insert( String::from("username"), - format!("{}#{}", author.name, author.discriminator).into(), + username.clone().into(), ); let mut images: Vec = Vec::new(); for (i, attachment) in attachments.iter().enumerate() { @@ -173,10 +179,9 @@ pub async fn submit(ctx: Context<'_>, submission: serenity::Attachment) -> Resul } requires_rebuild = true; let file_name = format!( - "{}-{}-{}-{}{}.{}", + "{}-{}-{}{}.{}", submission_data.len() + 1, slugify(&author.name), - author.discriminator, timestamp, if i == 0 { "".to_owned() @@ -256,7 +261,6 @@ pub async fn submit(ctx: Context<'_>, submission: serenity::Attachment) -> Resul channel .send_message(&ctx.serenity_context().http, |m| { m.embed(|e| { - let username = format!("{}#{}", author.name, author.discriminator); let domain = get_domain(); let n = get_challenge_number(); let mut description = format!( diff --git a/src/utils.rs b/src/utils.rs index bcae7f5..cc74f61 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -67,6 +67,10 @@ pub fn get_submission_data(challenge: i32) -> Vec { json } Err(ref e) if e.kind() == std::io::ErrorKind::NotFound => { + // Create parent directory if not exists + if let Some(parent_dir) = std::path::Path::new(&submission_data_path).parent() { + fs::create_dir_all(parent_dir).unwrap(); + } let mut file = File::create(&submission_data_path).unwrap(); file.write_all(b"[]").unwrap(); file.flush().unwrap(); @@ -371,7 +375,7 @@ pub async fn leaderboard(ctx: &Context<'_>) -> Result<(), Error> { let mut top_submitters: Vec<(&String, &u32)> = submission_counts.iter().collect(); top_submitters.sort_by(|a, b| b.1.cmp(a.1)); let mut leaderboard_html = String::from(""); - for (i, (id, count)) in top_submitters[0..LENGTH].iter().enumerate() { + for (i, (id, count)) in top_submitters[0..std::cmp::min(top_submitters.len(), LENGTH)].iter().enumerate() { let place = i + 1; let user = serenity::UserId(id.parse::().unwrap()) .to_user(&ctx.serenity_context().http) @@ -380,7 +384,12 @@ pub async fn leaderboard(ctx: &Context<'_>) -> Result<(), Error> { let profile = format!("https://discord.com/users/{id}"); let name = &user.name; let discriminator = user.discriminator; - leaderboard_html.push_str(&format!("", discriminator)); + leaderboard_html.push_str(&format!("")); } leaderboard_html.push_str("
{place} {name}#{:0>4}{count}
{place} {name}")); + // New usernames have #0000 discriminator + if discriminator != 0 { + leaderboard_html.push_str(&format!("#{:0>4}", discriminator)); + } + leaderboard_html.push_str(&format!("{count}
"); let mut file = std::fs::OpenOptions::new()