parent
8638330d34
commit
a535f4fb18
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user