diff --git a/Cargo.lock b/Cargo.lock index 581b9c9..5461169 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1297,9 +1297,9 @@ dependencies = [ [[package]] name = "rbx_asset" -version = "0.3.4" +version = "0.4.0-pre1" source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/" -checksum = "681587db1bd628a7a9344c12008e65e11a10159831e00dcc85c089682cfcf2fb" +checksum = "f042d87222a98142ec25d3b191bbd5377e52c75184bd367da3423a26b72e0c17" dependencies = [ "chrono", "flate2", diff --git a/validation/Cargo.toml b/validation/Cargo.toml index d7231d9..cce1307 100644 --- a/validation/Cargo.toml +++ b/validation/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" submissions-api = { path = "api", features = ["internal"], default-features = false, registry = "strafesnet" } async-nats = "0.40.0" futures = "0.3.31" -rbx_asset = { version = "0.3.4", registry = "strafesnet" } +rbx_asset = { version = "0.4.0-pre1", registry = "strafesnet" } rbx_binary = { version = "0.7.4", registry = "strafesnet"} rbx_dom_weak = { version = "2.9.0", registry = "strafesnet"} rbx_reflection_database = { version = "0.2.12", registry = "strafesnet"} diff --git a/validation/src/create.rs b/validation/src/create.rs index 354f8ef..31a57bd 100644 --- a/validation/src/create.rs +++ b/validation/src/create.rs @@ -3,13 +3,11 @@ use crate::rbx_util::{get_mapinfo,read_dom,MapInfo,ReadDomError,GetMapInfoError, #[allow(dead_code)] #[derive(Debug)] pub enum Error{ - ModelVersionsPage(rbx_asset::cookie::PageError), - EmptyVersionsPage, - CreatorTypeMustBeUser(rbx_asset::cookie::CreatorType), - ModelDetails(rbx_asset::cookie::GetError), - ModelInfoDownload(rbx_asset::cookie::GetAssetV2Error), - ModelFileDownload(rbx_asset::cookie::GetError), - NoLocations, + CreatorTypeMustBeUser, + ModelInfoDownload(rbx_asset::cloud::GetError), + ModelFileDownload(rbx_asset::cloud::GetError), + ParseUserID(core::num::ParseIntError), + ParseModelVersion(core::num::ParseIntError), ModelFileDecode(ReadDomError), GetMapInfo(GetMapInfoError), ParseGameID(ParseGameIDError), @@ -35,31 +33,26 @@ pub struct CreateResult{ } impl crate::message_handler::MessageHandler{ pub async fn create_inner(&self,create_info:CreateRequest)->Result<CreateResult,Error>{ - // discover asset creator - let creator_fut=async{ - self.cookie_context.get_asset_details( - rbx_asset::cookie::GetAssetDetailsRequest{asset_id:create_info.ModelID} - ).await.map_err(Error::ModelDetails) + // discover asset creator and latest version + let info=self.cloud_context.get_asset_info( + rbx_asset::cloud::GetAssetLatestRequest{asset_id:create_info.ModelID} + ).await.map_err(Error::ModelInfoDownload)?; + + // reject models created by a group + let rbx_asset::cloud::Creator::userId(user_id_string)=info.creationContext.creator else{ + return Err(Error::CreatorTypeMustBeUser); }; + // parse user string and model version string + let user_id:u64=user_id_string.parse().map_err(Error::ParseUserID)?; + let asset_version=info.revisionId.parse().map_err(Error::ParseModelVersion)?; + // download the map model - let asset_fut=async{ - let asset_info=self.cookie_context.get_asset_v2(rbx_asset::cookie::GetAssetRequest{ - asset_id:create_info.ModelID, - version:None, - }).await.map_err(Error::ModelInfoDownload)?; + let model_data=self.cloud_context.get_asset_version(rbx_asset::cloud::GetAssetVersionRequest{ + asset_id:create_info.ModelID, + version:asset_version, + }).await.map_err(Error::ModelFileDownload)?; - let location=asset_info.info.locations.first().ok_or(Error::NoLocations)?; - let data=self.cookie_context.get_asset_v2_download(location).await.map_err(Error::ModelFileDownload)?; - - Ok((asset_info.version,data)) - }; - - let (details,(asset_version,model_data))=tokio::try_join!(creator_fut,asset_fut)?; - - if details.Creator.CreatorType!=rbx_asset::cookie::CreatorType::User{ - return Err(Error::CreatorTypeMustBeUser(details.Creator.CreatorType)); - } // decode dom (slow!) let dom=read_dom(std::io::Cursor::new(model_data)).map_err(Error::ModelFileDecode)?; @@ -74,7 +67,7 @@ impl crate::message_handler::MessageHandler{ let game_id=game_id.map_err(Error::ParseGameID)?; Ok(CreateResult{ - AssetOwner:details.Creator.Id as i64, + AssetOwner:user_id as i64, DisplayName:display_name.unwrap_or_default().to_owned(), Creator:creator.unwrap_or_default().to_owned(), GameID:game_id as i32, diff --git a/validation/src/main.rs b/validation/src/main.rs index 5e59e43..00fb7f3 100644 --- a/validation/src/main.rs +++ b/validation/src/main.rs @@ -42,9 +42,12 @@ async fn main()->Result<(),StartupError>{ Err(e)=>Err(e).expect("ROBLOX_GROUP_ID env required"), }; - // talk to roblox through STRAFESNET_CI2 account + // create / upload models through STRAFESNET_CI2 account let cookie=std::env::var("RBXCOOKIE").expect("RBXCOOKIE env required"); - let cookie_context=rbx_asset::cookie::CookieContext::new(rbx_asset::cookie::Cookie::new(cookie)); + let cookie_context=rbx_asset::cookie::Context::new(rbx_asset::cookie::Cookie::new(cookie)); + // download models through cloud api + let api_key=std::env::var("RBX_API_KEY").expect("RBX_API_KEY env required"); + let cloud_context=rbx_asset::cloud::Context::new(rbx_asset::cloud::ApiKey::new(api_key)); // maps-service api let api_host_internal=std::env::var("API_HOST_INTERNAL").expect("API_HOST_INTERNAL env required"); @@ -81,7 +84,7 @@ async fn main()->Result<(),StartupError>{ consumer.messages().await.map_err(StartupError::NatsStream) }; - let message_handler=message_handler::MessageHandler::new(cookie_context,group_id,api); + let message_handler=message_handler::MessageHandler::new(cloud_context,cookie_context,group_id,api); // Create a signal listener for SIGTERM let mut sig_term=tokio::signal::unix::signal(tokio::signal::unix::SignalKind::terminate()).expect("Failed to create SIGTERM signal listener"); diff --git a/validation/src/message_handler.rs b/validation/src/message_handler.rs index fe79ee5..43a6a6d 100644 --- a/validation/src/message_handler.rs +++ b/validation/src/message_handler.rs @@ -26,18 +26,21 @@ fn from_slice<'a,T:serde::de::Deserialize<'a>>(slice:&'a [u8])->Result<T,HandleM } pub struct MessageHandler{ - pub(crate) cookie_context:rbx_asset::cookie::CookieContext, + pub(crate) cloud_context:rbx_asset::cloud::Context, + pub(crate) cookie_context:rbx_asset::cookie::Context, pub(crate) group_id:Option<u64>, pub(crate) api:submissions_api::internal::Context, } impl MessageHandler{ pub fn new( - cookie_context:rbx_asset::cookie::CookieContext, + cloud_context:rbx_asset::cloud::Context, + cookie_context:rbx_asset::cookie::Context, group_id:Option<u64>, api:submissions_api::internal::Context, )->Self{ Self{ + cloud_context, cookie_context, group_id, api, diff --git a/validation/src/upload_mapfix.rs b/validation/src/upload_mapfix.rs index 78108a4..9eeee25 100644 --- a/validation/src/upload_mapfix.rs +++ b/validation/src/upload_mapfix.rs @@ -3,7 +3,7 @@ use crate::nats_types::UploadMapfixRequest; #[allow(dead_code)] #[derive(Debug)] pub enum Error{ - Get(rbx_asset::cookie::GetError), + Get(rbx_asset::cloud::GetError), Json(serde_json::Error), Upload(rbx_asset::cookie::UploadError), ApiActionMapfixUploaded(submissions_api::Error), @@ -18,9 +18,9 @@ impl std::error::Error for Error{} impl crate::message_handler::MessageHandler{ pub async fn upload_mapfix(&self,upload_info:UploadMapfixRequest)->Result<(),Error>{ // download the map model version - let model_data=self.cookie_context.get_asset(rbx_asset::cookie::GetAssetRequest{ + let model_data=self.cloud_context.get_asset_version(rbx_asset::cloud::GetAssetVersionRequest{ asset_id:upload_info.ModelID, - version:Some(upload_info.ModelVersion), + version:upload_info.ModelVersion, }).await.map_err(Error::Get)?; // upload the map to the strafesnet group diff --git a/validation/src/upload_submission.rs b/validation/src/upload_submission.rs index ef8618a..4c55c6f 100644 --- a/validation/src/upload_submission.rs +++ b/validation/src/upload_submission.rs @@ -3,7 +3,7 @@ use crate::nats_types::UploadSubmissionRequest; #[allow(dead_code)] #[derive(Debug)] pub enum Error{ - Get(rbx_asset::cookie::GetError), + Get(rbx_asset::cloud::GetError), Json(serde_json::Error), Create(rbx_asset::cookie::CreateError), SystemTime(std::time::SystemTimeError), @@ -19,9 +19,9 @@ impl std::error::Error for Error{} impl crate::message_handler::MessageHandler{ pub async fn upload_submission(&self,upload_info:UploadSubmissionRequest)->Result<(),Error>{ // download the map model version - let model_data=self.cookie_context.get_asset(rbx_asset::cookie::GetAssetRequest{ + let model_data=self.cloud_context.get_asset_version(rbx_asset::cloud::GetAssetVersionRequest{ asset_id:upload_info.ModelID, - version:Some(upload_info.ModelVersion), + version:upload_info.ModelVersion, }).await.map_err(Error::Get)?; // upload the map to the strafesnet group diff --git a/validation/src/validator.rs b/validation/src/validator.rs index 29e1ff1..c0599f2 100644 --- a/validation/src/validator.rs +++ b/validation/src/validator.rs @@ -36,7 +36,7 @@ pub enum Error{ ScriptFlaggedIllegalKeyword(String), ScriptBlocked(Option<submissions_api::types::ScriptID>), ScriptNotYetReviewed(Option<submissions_api::types::ScriptID>), - ModelFileDownload(rbx_asset::cookie::GetError), + ModelFileDownload(rbx_asset::cloud::GetError), ModelFileDecode(ReadDomError), ApiGetScriptPolicyFromHash(submissions_api::types::SingleItemError), ApiGetScript(submissions_api::Error), @@ -90,9 +90,9 @@ impl From<crate::nats_types::ValidateSubmissionRequest> for ValidateRequest{ impl crate::message_handler::MessageHandler{ pub async fn validate_inner(&self,validate_info:ValidateRequest)->Result<(),Error>{ // download map - let data=self.cookie_context.get_asset(rbx_asset::cookie::GetAssetRequest{ + let data=self.cloud_context.get_asset_version(rbx_asset::cloud::GetAssetVersionRequest{ asset_id:validate_info.ModelID, - version:Some(validate_info.ModelVersion), + version:validate_info.ModelVersion, }).await.map_err(Error::ModelFileDownload)?; // decode dom (slow!)