From a535f4fb18d48eece1c83f6ed14297e8258a5ee9 Mon Sep 17 00:00:00 2001
From: Quaternions <krakow20@gmail.com>
Date: Thu, 3 Apr 2025 13:10:48 -0700
Subject: [PATCH] validator: use different endpoints to fill in the submission
 details

---
 validation/src/create.rs | 47 +++++++++++++++++++++++-----------------
 1 file changed, 27 insertions(+), 20 deletions(-)

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,