From 1976ce8dc8a19991662792b4822073c27d414389 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 10 Jun 2025 16:01:14 -0700 Subject: [PATCH 01/21] command --- src/main.rs | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/main.rs b/src/main.rs index 1027d6c..8675356 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,12 +15,20 @@ struct Cli{ #[derive(Subcommand)] enum Commands{ + Release(ReleaseCommand), RepairDuplicates(RepairDuplicatesCommand), RepairPolicies(RepairPoliciesCommand), Review(ReviewCommand), UploadScripts(UploadScriptsCommand), } +#[derive(Args)] +struct ReleaseCommand{ + #[arg(long)] + session_id_file:PathBuf, + #[arg(long)] + api_url:String, +} #[derive(Args)] struct RepairDuplicatesCommand{ #[arg(long)] @@ -54,6 +62,10 @@ struct UploadScriptsCommand{ async fn main(){ let cli=Cli::parse(); match cli.command{ + Commands::Release(command)=>release(ReleaseConfig{ + session_id:std::fs::read_to_string(command.session_id_file).unwrap(), + api_url:command.api_url, + }).await.unwrap(), Commands::RepairDuplicates(command)=>repair_duplicates(RepairDuplicatesConfig{ session_id:std::fs::read_to_string(command.session_id_file).unwrap(), api_url:command.api_url, @@ -577,3 +589,23 @@ async fn repair_duplicates(config:RepairDuplicatesConfig)->Result<(),RepairDupli Ok(()) } + +#[allow(dead_code)] +#[derive(Debug)] +enum ReleaseError{ + Cookie(submissions_api::CookieError), + Reqwest(submissions_api::ReqwestError), + GetScripts(submissions_api::Error), + DeleteScript(submissions_api::Error), +} + +struct ReleaseConfig{ + session_id:String, + api_url:String, +} +async fn release(config:ReleaseConfig)->Result<(),ReleaseError>{ + let cookie=submissions_api::Cookie::new(&config.session_id).map_err(ReleaseError::Cookie)?; + let api=&submissions_api::external::Context::new(config.api_url,cookie).map_err(ReleaseError::Reqwest)?; + + Ok(()) +} -- 2.49.1 From 3486b48446638f557241b9ddeb8b8ee4d5b5be38 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 10 Jun 2025 17:02:39 -0700 Subject: [PATCH 02/21] update deps --- src/main.rs | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/main.rs b/src/main.rs index 8675356..14fbecc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -115,13 +115,13 @@ enum ReviewError{ Cookie(submissions_api::CookieError), Reqwest(submissions_api::ReqwestError), GetPolicies(submissions_api::Error), - GetScriptFromHash(submissions_api::types::SingleItemError), + GetScriptFromHash(submissions_api::types::ScriptSingleItemError), NoScript, WriteCurrent(std::io::Error), ActionIO(std::io::Error), PurgeScript(submissions_api::Error), ReadCurrent(std::io::Error), - DeduplicateModified(submissions_api::types::SingleItemError), + DeduplicateModified(submissions_api::types::ScriptSingleItemError), UploadModified(submissions_api::Error), UpdateScriptPolicy(submissions_api::Error), } @@ -248,10 +248,10 @@ enum ScriptUploadError{ AllowedMap(GetMapError), ReplaceMap(GetMapError), BlockedSet(std::io::Error), - GetOrCreate(GOCError), - GetOrCreatePolicyReplace(GOCError), - GetOrCreatePolicyAllowed(GOCError), - GetOrCreatePolicyBlocked(GOCError), + GetOrCreate(GOCScriptError), + GetOrCreatePolicyReplace(GOCScriptPolicyError), + GetOrCreatePolicyAllowed(GOCScriptPolicyError), + GetOrCreatePolicyBlocked(GOCScriptPolicyError), } fn read_dir_stream(dir:tokio::fs::ReadDir)->impl futures::stream::Stream>{ @@ -330,10 +330,11 @@ fn hash_format(hash:u64)->String{ format!("{:016x}",hash) } -type GOCError=submissions_api::types::SingleItemError; -type GOCResult=Result; +type GOCScriptError=submissions_api::types::ScriptSingleItemError; +type GOCScriptPolicyError=submissions_api::types::ScriptPolicySingleItemError; +type GOCScriptResult=Result; -async fn get_or_create_script(api:&submissions_api::external::Context,source:&str)->GOCResult{ +async fn get_or_create_script(api:&submissions_api::external::Context,source:&str)->GOCScriptResult{ let script_response=api.get_script_from_hash(submissions_api::types::HashRequest{ hash:hash_format(hash_source(source)).as_str(), }).await?; @@ -345,7 +346,7 @@ async fn get_or_create_script(api:&submissions_api::external::Context,source:&st Source:source, ResourceType:submissions_api::types::ResourceType::Unknown, ResourceID:None, - }).await.map_err(GOCError::Other)?.ScriptID + }).await.map_err(GOCScriptError::Other)?.ScriptID }) } @@ -353,7 +354,7 @@ async fn check_or_create_script_poicy( api:&submissions_api::external::Context, hash:&str, script_policy:submissions_api::types::CreateScriptPolicyRequest, -)->Result<(),GOCError>{ +)->Result<(),GOCScriptPolicyError>{ let script_policy_result=api.get_script_policy_from_hash(submissions_api::types::HashRequest{ hash, }).await?; @@ -367,7 +368,7 @@ async fn check_or_create_script_poicy( }, None=>{ // create a new policy - api.create_script_policy(script_policy).await.map_err(GOCError::Other)?; + api.create_script_policy(script_policy).await.map_err(GOCScriptPolicyError::Other)?; } } @@ -476,7 +477,7 @@ enum RepairPoliciesError{ Cookie(submissions_api::CookieError), Reqwest(submissions_api::ReqwestError), GetPolicies(submissions_api::Error), - GetScripts(submissions_api::types::SingleItemError), + GetScripts(submissions_api::types::ScriptSingleItemError), UpdateScriptPolicy(submissions_api::Error), } @@ -595,8 +596,7 @@ async fn repair_duplicates(config:RepairDuplicatesConfig)->Result<(),RepairDupli enum ReleaseError{ Cookie(submissions_api::CookieError), Reqwest(submissions_api::ReqwestError), - GetScripts(submissions_api::Error), - DeleteScript(submissions_api::Error), + GetMaps(submissions_api::Error), } struct ReleaseConfig{ -- 2.49.1 From d4dfc9bfb7764254e01322fc704817f665c8f206 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 10 Jun 2025 18:39:31 -0700 Subject: [PATCH 03/21] there is code --- Cargo.lock | 162 +++++++++++++++++++++++++++++++++++++++++++++++++++- Cargo.toml | 3 +- src/main.rs | 118 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 280 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index dbbb8ce..8c6106e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,21 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "anstream" version = "0.6.19" @@ -133,6 +148,21 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chrono" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link", +] + [[package]] name = "clap" version = "4.5.39" @@ -534,6 +564,30 @@ dependencies = [ "windows-registry", ] +[[package]] +name = "iana-time-zone" +version = "0.1.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "icu_collections" version = "2.0.0" @@ -762,6 +816,15 @@ dependencies = [ "tempfile", ] +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + [[package]] name = "object" version = "0.36.7" @@ -860,6 +923,15 @@ dependencies = [ "zerovec", ] +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + [[package]] name = "proc-macro2" version = "1.0.95" @@ -884,6 +956,35 @@ version = "5.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" +[[package]] +name = "rand" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.3", +] + [[package]] name = "reqwest" version = "0.12.19" @@ -946,6 +1047,7 @@ version = "1.0.0" dependencies = [ "clap", "futures", + "rand", "siphasher", "submissions-api", "tokio", @@ -1153,10 +1255,11 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "submissions-api" -version = "0.7.2" +version = "0.8.0-pre2" source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/" -checksum = "f0a098bbc31ecadff0237a2979cda54b2369c76e3a1ce7b86ff4643bfbf4822f" +checksum = "c33bc203b99fae6e917f7f3407c6811f2dd05f21a6744deb1f0992e5cfbfe79e" dependencies = [ + "chrono", "reqwest", "serde", "serde_json", @@ -1521,6 +1624,41 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "windows-link" version = "0.1.1" @@ -1677,6 +1815,26 @@ dependencies = [ "synstructure", ] +[[package]] +name = "zerocopy" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "zerofrom" version = "0.1.6" diff --git a/Cargo.toml b/Cargo.toml index 95d6e97..12e4766 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,8 +8,9 @@ edition = "2021" [dependencies] clap = { version = "4.4.2", features = ["derive"] } futures = "0.3.31" +rand = "0.9.1" siphasher = "1.0.1" -submissions-api = { version = "0.7.2", registry = "strafesnet" } +submissions-api = { version = "0.8.0-pre2", registry = "strafesnet" } tokio = { version = "1.42.0", features = ["fs", "macros", "rt-multi-thread"] } [profile.release] diff --git a/src/main.rs b/src/main.rs index 14fbecc..1c0af77 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,8 @@ use clap::{Args,Parser,Subcommand}; use futures::{StreamExt,TryStreamExt}; +use rand::seq::SliceRandom; use std::path::PathBuf; +use std::collections::HashMap; const READ_CONCURRENCY:usize=16; const REMOTE_CONCURRENCY:usize=16; @@ -597,6 +599,7 @@ enum ReleaseError{ Cookie(submissions_api::CookieError), Reqwest(submissions_api::ReqwestError), GetMaps(submissions_api::Error), + Release(submissions_api::Error), } struct ReleaseConfig{ @@ -607,5 +610,120 @@ async fn release(config:ReleaseConfig)->Result<(),ReleaseError>{ let cookie=submissions_api::Cookie::new(&config.session_id).map_err(ReleaseError::Cookie)?; let api=&submissions_api::external::Context::new(config.api_url,cookie).map_err(ReleaseError::Reqwest)?; + const LIMIT:u32=100; + const ONE_HOUR:i64=60*60; + const ONE_DAY:i64=24*ONE_HOUR; + const ONE_WEEK:i64=7*ONE_DAY; + const FRIDAY:i64=2*ONE_DAY; + const PEAK_HOURS:i64=-7*ONE_HOUR; + + // determine maps ready to be released + let mut submissions_pending_release=HashMap::new(); + { + let mut page=1; + loop{ + let submissions=api.get_submissions(submissions_api::types::GetSubmissionsRequest{ + Page:page, + Limit:LIMIT, + DisplayName:None, + Creator:None, + GameID:None, + Sort:None, + Submitter:None, + AssetID:None, + UploadedAssetID:None, + StatusID:Some(submissions_api::types::SubmissionStatus::Uploaded), + }).await.map_err(ReleaseError::GetMaps)?; + let len=submissions.len(); + for submission in submissions{ + submissions_pending_release.entry(submission.GameID).or_insert(Vec::new()).push(submission); + } + if len{ + // round to friday + (date+ONE_WEEK>>1-FRIDAY)/ONE_WEEK*ONE_WEEK+FRIDAY+PEAK_HOURS + // add a week + +ONE_WEEK + }, + // find soonest friday + None=>((now-FRIDAY) as u64).next_multiple_of(ONE_WEEK as u64) as i64+FRIDAY+PEAK_HOURS + }; + + (game,start_date,pending) + }) + }; + + let mut rng=rand::rng(); + + for (game,start_date,mut pending) in it{ + // shuffle maps + pending.shuffle(&mut rng); + // schedule one per week + let release_infos=pending.iter().enumerate().map(|(i,submission)|{ + submissions_api::types::ReleaseInfo{ + Date:std::time::UNIX_EPOCH.checked_add(std::time::Duration::from_secs(( + start_date+i as i64*ONE_WEEK + ) as u64)).unwrap().into(), + SubmissionID:submissions_api::types::SubmissionID(submission.ID), + } + }); + + // ask to confirm schedule + // send it + api.release_submissions(submissions_api::types::ReleaseRequest{ + release_infos + }).await.map_err(ReleaseError::Release)?; + } + Ok(()) } -- 2.49.1 From 5a3b13a9f5edbfec4a20347832dbf00bbc2eba75 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 10 Jun 2025 18:44:58 -0700 Subject: [PATCH 04/21] confirm --- src/main.rs | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 1c0af77..ff11429 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,7 @@ use clap::{Args,Parser,Subcommand}; use futures::{StreamExt,TryStreamExt}; use rand::seq::SliceRandom; +use std::io::Write; use std::path::PathBuf; use std::collections::HashMap; @@ -599,6 +600,7 @@ enum ReleaseError{ Cookie(submissions_api::CookieError), Reqwest(submissions_api::ReqwestError), GetMaps(submissions_api::Error), + Io(std::io::Error), Release(submissions_api::Error), } @@ -708,17 +710,35 @@ async fn release(config:ReleaseConfig)->Result<(),ReleaseError>{ for (game,start_date,mut pending) in it{ // shuffle maps pending.shuffle(&mut rng); + // schedule one per week - let release_infos=pending.iter().enumerate().map(|(i,submission)|{ + let release_infos=pending.iter().enumerate().map(|(i,submission)| submissions_api::types::ReleaseInfo{ Date:std::time::UNIX_EPOCH.checked_add(std::time::Duration::from_secs(( start_date+i as i64*ONE_WEEK ) as u64)).unwrap().into(), SubmissionID:submissions_api::types::SubmissionID(submission.ID), } - }); + ); // ask to confirm schedule + for map in release_infos.clone(){ + println!("Schedule {:?} at {}",map.SubmissionID,map.Date); + } + + print!("Accept this schedule? [y/N]:"); + std::io::stdout().flush().map_err(ReleaseError::Io)?; + + let mut input=String::new(); + std::io::stdin().read_line(&mut input).map_err(ReleaseError::Io)?; + match input.trim(){ + "y"|"Y"=>(), + _=>{ + println!("Quitting."); + return Ok(()); + }, + } + // send it api.release_submissions(submissions_api::types::ReleaseRequest{ release_infos -- 2.49.1 From 41cdf26fdf4cfc426a85e12c1d92814475f5487d Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 10 Jun 2025 18:46:17 -0700 Subject: [PATCH 05/21] thanks rust compiler --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index ff11429..8a60e57 100644 --- a/src/main.rs +++ b/src/main.rs @@ -693,7 +693,7 @@ async fn release(config:ReleaseConfig)->Result<(),ReleaseError>{ let start_date=match latest_date.get(&game){ Some(&date)=>{ // round to friday - (date+ONE_WEEK>>1-FRIDAY)/ONE_WEEK*ONE_WEEK+FRIDAY+PEAK_HOURS + (date+(ONE_WEEK>>1)-FRIDAY)/ONE_WEEK*ONE_WEEK+FRIDAY+PEAK_HOURS // add a week +ONE_WEEK }, -- 2.49.1 From 16a70d91581bae30ccb8750d0cc5b620f6418971 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 10 Jun 2025 18:46:48 -0700 Subject: [PATCH 06/21] bhop --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 8a60e57..0c621e4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -726,7 +726,7 @@ async fn release(config:ReleaseConfig)->Result<(),ReleaseError>{ println!("Schedule {:?} at {}",map.SubmissionID,map.Date); } - print!("Accept this schedule? [y/N]:"); + print!("Accept this {game:?} release schedule? [y/N]:"); std::io::stdout().flush().map_err(ReleaseError::Io)?; let mut input=String::new(); -- 2.49.1 From 7c787421afd4d95659db49abcc8c5efd9dfd811a Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 10 Jun 2025 18:49:45 -0700 Subject: [PATCH 07/21] progress --- src/main.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main.rs b/src/main.rs index 0c621e4..2fa410a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -622,6 +622,7 @@ async fn release(config:ReleaseConfig)->Result<(),ReleaseError>{ // determine maps ready to be released let mut submissions_pending_release=HashMap::new(); { + println!("Downloading submissions..."); let mut page=1; loop{ let submissions=api.get_submissions(submissions_api::types::GetSubmissionsRequest{ @@ -656,6 +657,7 @@ async fn release(config:ReleaseConfig)->Result<(),ReleaseError>{ // determine the most recent map release date // if it's in the past, generate a Friday 10AM timestamp instead let it={ + println!("Downloading latest map release date..."); let mut latest_date=HashMap::new(); let mut page=1; loop{ -- 2.49.1 From 3e9f00eca9df2bbcb5e5ad17bedde62a37247074 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 10 Jun 2025 18:50:16 -0700 Subject: [PATCH 08/21] error --- src/main.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 2fa410a..4261e1e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -599,6 +599,7 @@ async fn repair_duplicates(config:RepairDuplicatesConfig)->Result<(),RepairDupli enum ReleaseError{ Cookie(submissions_api::CookieError), Reqwest(submissions_api::ReqwestError), + GetSubmissions(submissions_api::Error), GetMaps(submissions_api::Error), Io(std::io::Error), Release(submissions_api::Error), @@ -636,7 +637,7 @@ async fn release(config:ReleaseConfig)->Result<(),ReleaseError>{ AssetID:None, UploadedAssetID:None, StatusID:Some(submissions_api::types::SubmissionStatus::Uploaded), - }).await.map_err(ReleaseError::GetMaps)?; + }).await.map_err(ReleaseError::GetSubmissions)?; let len=submissions.len(); for submission in submissions{ submissions_pending_release.entry(submission.GameID).or_insert(Vec::new()).push(submission); -- 2.49.1 From 6467e4bc90c60872a2b62cdee421b89af425e678 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 10 Jun 2025 18:55:59 -0700 Subject: [PATCH 09/21] update dep --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- src/main.rs | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8c6106e..4d829e6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1255,9 +1255,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "submissions-api" -version = "0.8.0-pre2" +version = "0.8.0-pre3" source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/" -checksum = "c33bc203b99fae6e917f7f3407c6811f2dd05f21a6744deb1f0992e5cfbfe79e" +checksum = "14223246a9c3513ea6aabbe8887cb68963ee210d4a8b4ba69c1ad49b3dca02a9" dependencies = [ "chrono", "reqwest", diff --git a/Cargo.toml b/Cargo.toml index 12e4766..f98d07c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ clap = { version = "4.4.2", features = ["derive"] } futures = "0.3.31" rand = "0.9.1" siphasher = "1.0.1" -submissions-api = { version = "0.8.0-pre2", registry = "strafesnet" } +submissions-api = { version = "0.8.0-pre3", registry = "strafesnet" } tokio = { version = "1.42.0", features = ["fs", "macros", "rt-multi-thread"] } [profile.release] diff --git a/src/main.rs b/src/main.rs index 4261e1e..832cfc1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -638,8 +638,8 @@ async fn release(config:ReleaseConfig)->Result<(),ReleaseError>{ UploadedAssetID:None, StatusID:Some(submissions_api::types::SubmissionStatus::Uploaded), }).await.map_err(ReleaseError::GetSubmissions)?; - let len=submissions.len(); - for submission in submissions{ + let len=submissions.Submissions.len(); + for submission in submissions.Submissions{ submissions_pending_release.entry(submission.GameID).or_insert(Vec::new()).push(submission); } if len Date: Tue, 10 Jun 2025 18:58:50 -0700 Subject: [PATCH 10/21] update dep --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4d829e6..d53fd19 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1255,9 +1255,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "submissions-api" -version = "0.8.0-pre3" +version = "0.8.0-pre4" source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/" -checksum = "14223246a9c3513ea6aabbe8887cb68963ee210d4a8b4ba69c1ad49b3dca02a9" +checksum = "b2c8194860f654fa08ec64cafc133eb4e01e9371715e1badad6ec37796abadc1" dependencies = [ "chrono", "reqwest", diff --git a/Cargo.toml b/Cargo.toml index f98d07c..6e8b43f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ clap = { version = "4.4.2", features = ["derive"] } futures = "0.3.31" rand = "0.9.1" siphasher = "1.0.1" -submissions-api = { version = "0.8.0-pre3", registry = "strafesnet" } +submissions-api = { version = "0.8.0-pre4", registry = "strafesnet" } tokio = { version = "1.42.0", features = ["fs", "macros", "rt-multi-thread"] } [profile.release] -- 2.49.1 From fac9a2dc247eb9d929c6aecba0a80603c2caf31a Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 10 Jun 2025 19:13:37 -0700 Subject: [PATCH 11/21] msgs --- src/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 832cfc1..56e20fb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -623,7 +623,7 @@ async fn release(config:ReleaseConfig)->Result<(),ReleaseError>{ // determine maps ready to be released let mut submissions_pending_release=HashMap::new(); { - println!("Downloading submissions..."); + println!("Downloading submissions pending release..."); let mut page=1; loop{ let submissions=api.get_submissions(submissions_api::types::GetSubmissionsRequest{ @@ -658,7 +658,7 @@ async fn release(config:ReleaseConfig)->Result<(),ReleaseError>{ // determine the most recent map release date // if it's in the past, generate a Friday 10AM timestamp instead let it={ - println!("Downloading latest map release date..."); + println!("Determining release dates..."); let mut latest_date=HashMap::new(); let mut page=1; loop{ -- 2.49.1 From 7caa55129ee67cd216756fcd43f0c14932a37bc6 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 10 Jun 2025 19:55:30 -0700 Subject: [PATCH 12/21] use BTreeMap for consistent order --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- src/main.rs | 5 ++--- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d53fd19..8937605 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1255,9 +1255,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "submissions-api" -version = "0.8.0-pre4" +version = "0.8.0-pre5" source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/" -checksum = "b2c8194860f654fa08ec64cafc133eb4e01e9371715e1badad6ec37796abadc1" +checksum = "dd70887bbae8ecea987f4334c6f97e78ed59b264f8957c2279348925de1be130" dependencies = [ "chrono", "reqwest", diff --git a/Cargo.toml b/Cargo.toml index 6e8b43f..588c545 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ clap = { version = "4.4.2", features = ["derive"] } futures = "0.3.31" rand = "0.9.1" siphasher = "1.0.1" -submissions-api = { version = "0.8.0-pre4", registry = "strafesnet" } +submissions-api = { version = "0.8.0-pre5", registry = "strafesnet" } tokio = { version = "1.42.0", features = ["fs", "macros", "rt-multi-thread"] } [profile.release] diff --git a/src/main.rs b/src/main.rs index 56e20fb..5326a3a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,7 +3,6 @@ use futures::{StreamExt,TryStreamExt}; use rand::seq::SliceRandom; use std::io::Write; use std::path::PathBuf; -use std::collections::HashMap; const READ_CONCURRENCY:usize=16; const REMOTE_CONCURRENCY:usize=16; @@ -621,7 +620,7 @@ async fn release(config:ReleaseConfig)->Result<(),ReleaseError>{ const PEAK_HOURS:i64=-7*ONE_HOUR; // determine maps ready to be released - let mut submissions_pending_release=HashMap::new(); + let mut submissions_pending_release=std::collections::BTreeMap::new(); { println!("Downloading submissions pending release..."); let mut page=1; @@ -659,7 +658,7 @@ async fn release(config:ReleaseConfig)->Result<(),ReleaseError>{ // if it's in the past, generate a Friday 10AM timestamp instead let it={ println!("Determining release dates..."); - let mut latest_date=HashMap::new(); + let mut latest_date=std::collections::HashMap::new(); let mut page=1; loop{ let maps=api.get_maps(submissions_api::types::GetMapsRequest{ -- 2.49.1 From e08ab4f779983283f75d207ad79d34cda4365ba3 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 10 Jun 2025 20:09:29 -0700 Subject: [PATCH 13/21] update dep --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8937605..9279ad1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1255,9 +1255,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "submissions-api" -version = "0.8.0-pre5" +version = "0.8.0-pre6" source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/" -checksum = "dd70887bbae8ecea987f4334c6f97e78ed59b264f8957c2279348925de1be130" +checksum = "cc1a50db52b42ac2a5f680e6e258b2f45189325629994cf46329c2472192753c" dependencies = [ "chrono", "reqwest", diff --git a/Cargo.toml b/Cargo.toml index 588c545..846bdaf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ clap = { version = "4.4.2", features = ["derive"] } futures = "0.3.31" rand = "0.9.1" siphasher = "1.0.1" -submissions-api = { version = "0.8.0-pre5", registry = "strafesnet" } +submissions-api = { version = "0.8.0-pre6", registry = "strafesnet" } tokio = { version = "1.42.0", features = ["fs", "macros", "rt-multi-thread"] } [profile.release] -- 2.49.1 From c8614cac018922437da58b17b5fc9577698c5b13 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 10 Jun 2025 21:13:46 -0700 Subject: [PATCH 14/21] update dep --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- src/main.rs | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9279ad1..8ecf320 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1255,9 +1255,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "submissions-api" -version = "0.8.0-pre6" +version = "0.8.0" source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/" -checksum = "cc1a50db52b42ac2a5f680e6e258b2f45189325629994cf46329c2472192753c" +checksum = "3d4896b5e0cbabfc167898d90ac563664f13fb9103fc7942de674ba44f47b8e3" dependencies = [ "chrono", "reqwest", diff --git a/Cargo.toml b/Cargo.toml index 846bdaf..8b20461 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ clap = { version = "4.4.2", features = ["derive"] } futures = "0.3.31" rand = "0.9.1" siphasher = "1.0.1" -submissions-api = { version = "0.8.0-pre6", registry = "strafesnet" } +submissions-api = { version = "0.8.0", registry = "strafesnet" } tokio = { version = "1.42.0", features = ["fs", "macros", "rt-multi-thread"] } [profile.release] diff --git a/src/main.rs b/src/main.rs index 5326a3a..05eb900 100644 --- a/src/main.rs +++ b/src/main.rs @@ -714,17 +714,17 @@ async fn release(config:ReleaseConfig)->Result<(),ReleaseError>{ pending.shuffle(&mut rng); // schedule one per week - let release_infos=pending.iter().enumerate().map(|(i,submission)| + let schedule:&Vec<_>=&pending.iter().enumerate().map(|(i,submission)| submissions_api::types::ReleaseInfo{ Date:std::time::UNIX_EPOCH.checked_add(std::time::Duration::from_secs(( start_date+i as i64*ONE_WEEK ) as u64)).unwrap().into(), SubmissionID:submissions_api::types::SubmissionID(submission.ID), } - ); + ).collect(); // ask to confirm schedule - for map in release_infos.clone(){ + for map in schedule{ println!("Schedule {:?} at {}",map.SubmissionID,map.Date); } @@ -743,7 +743,7 @@ async fn release(config:ReleaseConfig)->Result<(),ReleaseError>{ // send it api.release_submissions(submissions_api::types::ReleaseRequest{ - release_infos + schedule, }).await.map_err(ReleaseError::Release)?; } -- 2.49.1 From e7d5d51543c68644ce41c15cec94fcd5484796cf Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 10 Jun 2025 21:20:04 -0700 Subject: [PATCH 15/21] tweaks --- src/main.rs | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/main.rs b/src/main.rs index 05eb900..d6a5486 100644 --- a/src/main.rs +++ b/src/main.rs @@ -657,7 +657,7 @@ async fn release(config:ReleaseConfig)->Result<(),ReleaseError>{ // determine the most recent map release date // if it's in the past, generate a Friday 10AM timestamp instead let it={ - println!("Determining release dates..."); + println!("Determining recent release dates..."); let mut latest_date=std::collections::HashMap::new(); let mut page=1; loop{ @@ -714,21 +714,19 @@ async fn release(config:ReleaseConfig)->Result<(),ReleaseError>{ pending.shuffle(&mut rng); // schedule one per week - let schedule:&Vec<_>=&pending.iter().enumerate().map(|(i,submission)| + let schedule:&Vec<_>=&pending.into_iter().enumerate().map(|(i,submission)|{ + let release_date=std::time::UNIX_EPOCH.checked_add(std::time::Duration::from_secs(( + start_date+i as i64*ONE_WEEK + ) as u64)).unwrap().into(); + println!("Schedule submissions/{:?} {} at {}",submission.ID,submission.DisplayName,release_date); submissions_api::types::ReleaseInfo{ - Date:std::time::UNIX_EPOCH.checked_add(std::time::Duration::from_secs(( - start_date+i as i64*ONE_WEEK - ) as u64)).unwrap().into(), + Date:release_date, SubmissionID:submissions_api::types::SubmissionID(submission.ID), } - ).collect(); + }).collect(); // ask to confirm schedule - for map in schedule{ - println!("Schedule {:?} at {}",map.SubmissionID,map.Date); - } - - print!("Accept this {game:?} release schedule? [y/N]:"); + print!("Accept this {game:?} release schedule? [y/N]: "); std::io::stdout().flush().map_err(ReleaseError::Io)?; let mut input=String::new(); -- 2.49.1 From c83672dd4f3e09239711b5c2600f09fef78d2baf Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 10 Jun 2025 21:21:35 -0700 Subject: [PATCH 16/21] unchecked --- src/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index d6a5486..245e0b7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -715,9 +715,9 @@ async fn release(config:ReleaseConfig)->Result<(),ReleaseError>{ // schedule one per week let schedule:&Vec<_>=&pending.into_iter().enumerate().map(|(i,submission)|{ - let release_date=std::time::UNIX_EPOCH.checked_add(std::time::Duration::from_secs(( + let release_date=(std::time::UNIX_EPOCH+std::time::Duration::from_secs(( start_date+i as i64*ONE_WEEK - ) as u64)).unwrap().into(); + ) as u64)).into(); println!("Schedule submissions/{:?} {} at {}",submission.ID,submission.DisplayName,release_date); submissions_api::types::ReleaseInfo{ Date:release_date, -- 2.49.1 From 8c97138909845aae1c3f932fea6e894b477ced07 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 10 Jun 2025 21:27:15 -0700 Subject: [PATCH 17/21] most --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 245e0b7..4e5d9c1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -657,7 +657,7 @@ async fn release(config:ReleaseConfig)->Result<(),ReleaseError>{ // determine the most recent map release date // if it's in the past, generate a Friday 10AM timestamp instead let it={ - println!("Determining recent release dates..."); + println!("Determining most recent release dates..."); let mut latest_date=std::collections::HashMap::new(); let mut page=1; loop{ -- 2.49.1 From b4b985773153a8b187d54c18c617d175332c5333 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 10 Jun 2025 22:05:08 -0700 Subject: [PATCH 18/21] update dep --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- src/main.rs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8ecf320..de3c780 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1255,9 +1255,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "submissions-api" -version = "0.8.0" +version = "0.8.1" source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/" -checksum = "3d4896b5e0cbabfc167898d90ac563664f13fb9103fc7942de674ba44f47b8e3" +checksum = "a08deea49e9e34f2f2f23219f4a565681b4c1ae46f8012496d9a8fe10897efd3" dependencies = [ "chrono", "reqwest", diff --git a/Cargo.toml b/Cargo.toml index 8b20461..421aa19 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ clap = { version = "4.4.2", features = ["derive"] } futures = "0.3.31" rand = "0.9.1" siphasher = "1.0.1" -submissions-api = { version = "0.8.0", registry = "strafesnet" } +submissions-api = { version = "0.8.1", registry = "strafesnet" } tokio = { version = "1.42.0", features = ["fs", "macros", "rt-multi-thread"] } [profile.release] diff --git a/src/main.rs b/src/main.rs index 4e5d9c1..263d387 100644 --- a/src/main.rs +++ b/src/main.rs @@ -721,7 +721,7 @@ async fn release(config:ReleaseConfig)->Result<(),ReleaseError>{ println!("Schedule submissions/{:?} {} at {}",submission.ID,submission.DisplayName,release_date); submissions_api::types::ReleaseInfo{ Date:release_date, - SubmissionID:submissions_api::types::SubmissionID(submission.ID), + SubmissionID:submission.ID, } }).collect(); -- 2.49.1 From 5b036e73d5dea8ed1197aa2ff7ed299f501f4f47 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 10 Jun 2025 22:06:41 -0700 Subject: [PATCH 19/21] prints with SubmissionID --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 263d387..ee6dddd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -718,7 +718,7 @@ async fn release(config:ReleaseConfig)->Result<(),ReleaseError>{ let release_date=(std::time::UNIX_EPOCH+std::time::Duration::from_secs(( start_date+i as i64*ONE_WEEK ) as u64)).into(); - println!("Schedule submissions/{:?} {} at {}",submission.ID,submission.DisplayName,release_date); + println!("Schedule {:?} {} at {}",submission.ID,submission.DisplayName,release_date); submissions_api::types::ReleaseInfo{ Date:release_date, SubmissionID:submission.ID, -- 2.49.1 From e655e5b918974c27857285c3964393a8c66fdb3b Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 10 Jun 2025 22:07:06 -0700 Subject: [PATCH 20/21] rreview v1.1.0 --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index de3c780..7672f63 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1043,7 +1043,7 @@ dependencies = [ [[package]] name = "rreview" -version = "1.0.0" +version = "1.1.0" dependencies = [ "clap", "futures", diff --git a/Cargo.toml b/Cargo.toml index 421aa19..f83cfbd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rreview" -version = "1.0.0" +version = "1.1.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html -- 2.49.1 From 54865c03e253a2c1de39efe549227a66229cc37a Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 10 Jun 2025 22:07:35 -0700 Subject: [PATCH 21/21] for game --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index ee6dddd..f6995c8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -726,7 +726,7 @@ async fn release(config:ReleaseConfig)->Result<(),ReleaseError>{ }).collect(); // ask to confirm schedule - print!("Accept this {game:?} release schedule? [y/N]: "); + print!("Accept this release schedule for {game:?}? [y/N]: "); std::io::stdout().flush().map_err(ReleaseError::Io)?; let mut input=String::new(); -- 2.49.1