diff --git a/validation/src/create.rs b/validation/src/create.rs index 76c4a05..747a824 100644 --- a/validation/src/create.rs +++ b/validation/src/create.rs @@ -5,8 +5,11 @@ use crate::rbx_util::{get_mapinfo,read_dom,MapInfo,ReadDomError,GetMapInfoError, pub enum Error{ ModelVersionsPage(rbx_asset::cookie::PageError), EmptyVersionsPage, - WrongCreatorType, + CreatorTypeMustBeUser(rbx_asset::cookie::CreatorType), + ModelDetails(rbx_asset::cookie::GetError), + ModelInfoDownload(rbx_asset::cookie::GetAssetV2Error), ModelFileDownload(rbx_asset::cookie::GetError), + NoLocations, ModelFileDecode(ReadDomError), GetMapInfo(GetMapInfoError), ParseGameID(ParseGameIDError), @@ -32,28 +35,32 @@ pub struct CreateResult{ } impl crate::message_handler::MessageHandler{ pub async fn create_inner(&self,create_info:CreateRequest)->Result<CreateResult,Error>{ - // discover the latest asset version - let asset_versions_page=self.cookie_context.get_asset_versions_page(rbx_asset::cookie::AssetVersionsPageRequest{ - asset_id:create_info.ModelID, - cursor:None - }).await.map_err(Error::ModelVersionsPage)?; + // 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) + }; - // grab version info - let first_version=asset_versions_page.data.first().ok_or(Error::EmptyVersionsPage)?; + // 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)?; - if first_version.creatorType!=rbx_asset::cookie::CreatorType::User{ - return Err(Error::WrongCreatorType); + 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)); } - let asset_creator_id=first_version.creatorTargetId; - let asset_version=first_version.assetVersionNumber; - - // download the map model version - let model_data=self.cookie_context.get_asset(rbx_asset::cookie::GetAssetRequest{ - asset_id:create_info.ModelID, - version:Some(asset_version), - }).await.map_err(Error::ModelFileDownload)?; - // decode dom (slow!) let dom=read_dom(&mut std::io::Cursor::new(model_data)).map_err(Error::ModelFileDecode)?; @@ -67,7 +74,7 @@ impl crate::message_handler::MessageHandler{ let game_id=game_id.map_err(Error::ParseGameID)?; Ok(CreateResult{ - AssetOwner:asset_creator_id as i64, + AssetOwner:details.Creator.Id as i64, DisplayName:display_name.unwrap_or_default().to_owned(), Creator:creator.unwrap_or_default().to_owned(), GameID:game_id as i32,