validator: allow create without valid metadata

This commit is contained in:
Quaternions 2025-04-11 13:24:19 -07:00
parent e8fb2d2f3a
commit d00fbf5fa8
Signed by: Quaternions
GPG Key ID: D0DF5964F79AC131
5 changed files with 50 additions and 20 deletions

@ -1,5 +1,5 @@
use crate::download::download_asset_version; use crate::download::download_asset_version;
use crate::rbx_util::{get_root_instance,get_mapinfo,read_dom,MapInfo,ReadDomError,GetRootInstanceError,ParseGameIDError}; use crate::rbx_util::{get_root_instance,get_mapinfo,read_dom,MapInfo,ReadDomError,GetRootInstanceError,GameID};
#[allow(dead_code)] #[allow(dead_code)]
#[derive(Debug)] #[derive(Debug)]
@ -9,7 +9,6 @@ pub enum Error{
Download(crate::download::Error), Download(crate::download::Error),
ModelFileDecode(ReadDomError), ModelFileDecode(ReadDomError),
GetRootInstance(GetRootInstanceError), GetRootInstance(GetRootInstanceError),
ParseGameID(ParseGameIDError),
} }
impl std::fmt::Display for Error{ impl std::fmt::Display for Error{
fn fmt(&self,f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{ fn fmt(&self,f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{
@ -24,10 +23,10 @@ pub struct CreateRequest{
} }
#[allow(nonstandard_style)] #[allow(nonstandard_style)]
pub struct CreateResult{ pub struct CreateResult{
pub AssetOwner:i64, pub AssetOwner:u64,
pub DisplayName:String, pub DisplayName:Option<String>,
pub Creator:String, pub Creator:Option<String>,
pub GameID:i32, pub GameID:Option<GameID>,
pub AssetVersion:u64, pub AssetVersion:u64,
} }
impl crate::message_handler::MessageHandler{ impl crate::message_handler::MessageHandler{
@ -63,13 +62,11 @@ impl crate::message_handler::MessageHandler{
game_id, game_id,
}=get_mapinfo(&dom,model_instance); }=get_mapinfo(&dom,model_instance);
let game_id=game_id.map_err(Error::ParseGameID)?;
Ok(CreateResult{ Ok(CreateResult{
AssetOwner:user_id as i64, AssetOwner:user_id,
DisplayName:display_name.unwrap_or_default().to_owned(), DisplayName:display_name.ok().map(ToOwned::to_owned),
Creator:creator.unwrap_or_default().to_owned(), Creator:creator.ok().map(ToOwned::to_owned),
GameID:game_id as i32, GameID:game_id.ok(),
AssetVersion:asset_version, AssetVersion:asset_version,
}) })
} }

@ -24,10 +24,11 @@ impl crate::message_handler::MessageHandler{
// call create on api // call create on api
self.api.create_mapfix(submissions_api::types::CreateMapfixRequest{ self.api.create_mapfix(submissions_api::types::CreateMapfixRequest{
OperationID:create_info.OperationID, OperationID:create_info.OperationID,
AssetOwner:create_request.AssetOwner, AssetOwner:create_request.AssetOwner as i64,
DisplayName:create_request.DisplayName.as_str(), DisplayName:create_request.DisplayName.as_deref().unwrap_or_default(),
Creator:create_request.Creator.as_str(), Creator:create_request.Creator.as_deref().unwrap_or_default(),
GameID:create_request.GameID, // not great TODO: make this great
GameID:create_request.GameID.unwrap_or(crate::rbx_util::GameID::Bhop) as i32,
AssetID:create_info.ModelID, AssetID:create_info.ModelID,
AssetVersion:create_request.AssetVersion, AssetVersion:create_request.AssetVersion,
TargetAssetID:create_info.TargetAssetID, TargetAssetID:create_info.TargetAssetID,

@ -1,5 +1,6 @@
use crate::nats_types::CreateSubmissionRequest; use crate::nats_types::CreateSubmissionRequest;
use crate::create::CreateRequest; use crate::create::CreateRequest;
use crate::rbx_util::GameID;
#[allow(dead_code)] #[allow(dead_code)]
#[derive(Debug)] #[derive(Debug)]
@ -19,13 +20,29 @@ impl crate::message_handler::MessageHandler{
let create_request=self.create_inner(CreateRequest{ let create_request=self.create_inner(CreateRequest{
ModelID:create_info.ModelID, ModelID:create_info.ModelID,
}).await.map_err(Error::Create)?; }).await.map_err(Error::Create)?;
// grab values from submission form, otherwise try to fill blanks from map data
let display_name=if create_info.DisplayName.is_empty(){
create_request.DisplayName.as_deref().unwrap_or_default()
}else{
create_info.DisplayName.as_str()
};
let creator=if create_info.Creator.is_empty(){
create_request.Creator.as_deref().unwrap_or_default()
}else{
create_info.Creator.as_str()
};
let game_id=create_info.GameID.try_into().ok().or(create_request.GameID).unwrap_or(GameID::Bhop);
// call create on api // call create on api
self.api.create_submission(submissions_api::types::CreateSubmissionRequest{ self.api.create_submission(submissions_api::types::CreateSubmissionRequest{
OperationID:create_info.OperationID, OperationID:create_info.OperationID,
AssetOwner:create_request.AssetOwner, AssetOwner:create_request.AssetOwner as i64,
DisplayName:create_request.DisplayName.as_str(), DisplayName:display_name,
Creator:create_request.Creator.as_str(), Creator:creator,
GameID:create_request.GameID, GameID:game_id as i32,
AssetID:create_info.ModelID, AssetID:create_info.ModelID,
AssetVersion:create_request.AssetVersion, AssetVersion:create_request.AssetVersion,
}).await.map_err(Error::ApiActionSubmissionCreate)?; }).await.map_err(Error::ApiActionSubmissionCreate)?;

@ -10,6 +10,9 @@ pub struct CreateSubmissionRequest{
// operation_id is passed back in the response message // operation_id is passed back in the response message
pub OperationID:i32, pub OperationID:i32,
pub ModelID:u64, pub ModelID:u64,
pub DisplayName:String,
pub Creator:String,
pub GameID:u32,
} }
#[allow(nonstandard_style)] #[allow(nonstandard_style)]

@ -70,6 +70,18 @@ impl std::str::FromStr for GameID{
return Err(ParseGameIDError); return Err(ParseGameIDError);
} }
} }
pub struct GameIDError;
impl TryFrom<u32> for GameID{
type Error=GameIDError;
fn try_from(value:u32)->Result<Self,Self::Error>{
match value{
1=>Ok(GameID::Bhop),
2=>Ok(GameID::Surf),
5=>Ok(GameID::FlyTrials),
_=>Err(GameIDError)
}
}
}
pub struct MapInfo<'a>{ pub struct MapInfo<'a>{
pub display_name:Result<&'a str,StringValueError>, pub display_name:Result<&'a str,StringValueError>,