diff --git a/src/main.rs b/src/main.rs index 77b004d..bcffc4f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -58,6 +58,8 @@ enum ReviewError{ WriteCurrent(std::io::Error), ActionIO(std::io::Error), ReadCurrent(std::io::Error), + DeduplicateModified(submissions_api::types::SingleItemError), + UploadModified(submissions_api::Error), } struct ReviewConfig{ @@ -103,6 +105,46 @@ async fn review(config:ReviewConfig)->Result<(),ReviewError>{ break; } } + // default to_script_id is from from_script_id (only changed for replace policy) + let mut to_script_id=None; + // interpret action + let reviewed_policy=match script_action{ + ScriptActionParseResult::Pass=>{ + //if current.lua was updated, create an allowed and replace file and set script_action to replace(new_id) + let modified_source=tokio::fs::read_to_string("current.lua").await.map_err(ReviewError::ReadCurrent)?; + if modified_source==source{ + submissions_api::types::Policy::Allowed + }else{ + // compute hash + let mut hasher=siphasher::sip::SipHasher::new(); + std::hash::Hasher::write(&mut hasher,source.as_bytes()); + let hash=std::hash::Hasher::finish(&hasher); + + // check if modified script already exists + let maybe_script_response=api.get_script_from_hash(submissions_api::types::HashRequest{ + hash:format!("{:016x}",hash).as_str(), + }).await.map_err(ReviewError::DeduplicateModified)?; + + // write to_script_id, uploading modified script if necessary + to_script_id=Some(match maybe_script_response{ + Some(script_response)=>script_response.ID, + None=>api.create_script(submissions_api::types::CreateScriptRequest{ + Name:script_response.Name.as_str(), + Source:modified_source.as_str(), + SubmissionID:Some(script_response.SubmissionID), + }).await.map_err(ReviewError::UploadModified)?.ID + }); + + // use replace policy + submissions_api::types::Policy::Replace + } + }, + ScriptActionParseResult::Block=>submissions_api::types::Policy::Blocked, + ScriptActionParseResult::Exit=>break, + ScriptActionParseResult::Delete=>submissions_api::types::Policy::Delete, + }; + + // update policy } Ok(())