import PathBuf

This commit is contained in:
Quaternions 2024-03-08 09:55:17 -08:00
parent 4199d41d3f
commit dc9fd2c442

View File

@ -1,4 +1,4 @@
use std::io::{Read, Seek}; use std::{io::{Read, Seek}, path::PathBuf};
use clap::{Args, Parser, Subcommand}; use clap::{Args, Parser, Subcommand};
use anyhow::Result as AResult; use anyhow::Result as AResult;
@ -7,7 +7,7 @@ use anyhow::Result as AResult;
#[command(propagate_version = true)] #[command(propagate_version = true)]
struct Cli { struct Cli {
#[arg(long)] #[arg(long)]
path:Option<std::path::PathBuf>, path:Option<PathBuf>,
#[command(subcommand)] #[command(subcommand)]
command: Commands, command: Commands,
} }
@ -32,7 +32,7 @@ enum Commands {
#[derive(Args)] #[derive(Args)]
struct PathBufList { struct PathBufList {
paths:Vec<std::path::PathBuf> paths:Vec<PathBuf>
} }
#[derive(Args)] #[derive(Args)]
@ -342,7 +342,7 @@ SurfaceAppearance.NormalMap
SurfaceAppearance.RoughnessMap SurfaceAppearance.RoughnessMap
SurfaceAppearance.TexturePack SurfaceAppearance.TexturePack
*/ */
fn download_textures(paths: Vec<std::path::PathBuf>) -> AResult<()>{ fn download_textures(paths: Vec<PathBuf>) -> AResult<()>{
println!("download_textures paths:{:?}",paths); println!("download_textures paths:{:?}",paths);
let header=format!("Cookie: .ROBLOSECURITY={}",std::env::var("RBXCOOKIE")?); let header=format!("Cookie: .ROBLOSECURITY={}",std::env::var("RBXCOOKIE")?);
let shared_args=&[ let shared_args=&[
@ -387,7 +387,7 @@ fn download_textures(paths: Vec<std::path::PathBuf>) -> AResult<()>{
} }
Ok(()) Ok(())
} }
fn download_meshes(paths: Vec<std::path::PathBuf>) -> AResult<()>{ fn download_meshes(paths: Vec<PathBuf>) -> AResult<()>{
println!("download_meshes paths:{:?}",paths); println!("download_meshes paths:{:?}",paths);
let header=format!("Cookie: .ROBLOSECURITY={}",std::env::var("RBXCOOKIE")?); let header=format!("Cookie: .ROBLOSECURITY={}",std::env::var("RBXCOOKIE")?);
let shared_args=&[ let shared_args=&[
@ -476,7 +476,7 @@ fn convert(file_thing:std::fs::DirEntry) -> AResult<()>{
)?; )?;
//write dds //write dds
let mut dest=std::path::PathBuf::from("textures/dds"); let mut dest=PathBuf::from("textures/dds");
dest.push(file_thing.file_name()); dest.push(file_thing.file_name());
dest.set_extension("dds"); dest.set_extension("dds");
let mut writer = std::io::BufWriter::new(std::fs::File::create(dest)?); let mut writer = std::io::BufWriter::new(std::fs::File::create(dest)?);
@ -484,14 +484,14 @@ fn convert(file_thing:std::fs::DirEntry) -> AResult<()>{
if let Some(mut extracted)=extracted_input{ if let Some(mut extracted)=extracted_input{
//write extracted to processed //write extracted to processed
let mut dest=std::path::PathBuf::from("textures/processed"); let mut dest=PathBuf::from("textures/processed");
dest.push(file_thing.file_name()); dest.push(file_thing.file_name());
std::fs::write(dest, &mut extracted)?; std::fs::write(dest, &mut extracted)?;
//delete ugly gzip file //delete ugly gzip file
std::fs::remove_file(file_thing.path())?; std::fs::remove_file(file_thing.path())?;
}else{ }else{
//move file to processed //move file to processed
let mut dest=std::path::PathBuf::from("textures/processed"); let mut dest=PathBuf::from("textures/processed");
dest.push(file_thing.file_name()); dest.push(file_thing.file_name());
std::fs::rename(file_thing.path(), dest)?; std::fs::rename(file_thing.path(), dest)?;
} }
@ -575,12 +575,12 @@ fn scan() -> AResult<()>{
} }
} }
let mut dest=match fail_type { let mut dest=match fail_type {
Scan::Passed => std::path::PathBuf::from("maps/processed"), Scan::Passed => PathBuf::from("maps/processed"),
Scan::Blocked => { Scan::Blocked => {
println!("{:?} - {} {} not allowed.",file_thing.file_name(),fail_count,if fail_count==1 {"script"}else{"scripts"}); println!("{:?} - {} {} not allowed.",file_thing.file_name(),fail_count,if fail_count==1 {"script"}else{"scripts"});
std::path::PathBuf::from("maps/blocked") PathBuf::from("maps/blocked")
} }
Scan::Flagged => std::path::PathBuf::from("maps/flagged") Scan::Flagged => PathBuf::from("maps/flagged")
}; };
dest.push(file_thing.file_name()); dest.push(file_thing.file_name());
std::fs::rename(file_thing.path(), dest)?; std::fs::rename(file_thing.path(), dest)?;
@ -589,7 +589,7 @@ fn scan() -> AResult<()>{
Ok(()) Ok(())
} }
fn extract(paths: Vec<std::path::PathBuf>) -> AResult<()>{ fn extract(paths: Vec<PathBuf>) -> AResult<()>{
let mut id = 0; let mut id = 0;
//Construct allowed scripts //Construct allowed scripts
let mut script_set = std::collections::HashSet::<String>::new(); let mut script_set = std::collections::HashSet::<String>::new();
@ -664,7 +664,7 @@ fn replace() -> AResult<()>{
if any_failed { if any_failed {
println!("One or more scripts failed to replace."); println!("One or more scripts failed to replace.");
}else{ }else{
let mut dest=std::path::PathBuf::from("maps/unprocessed"); let mut dest=PathBuf::from("maps/unprocessed");
dest.push(file_thing.file_name()); dest.push(file_thing.file_name());
let output = std::io::BufWriter::new(std::fs::File::open(dest)?); let output = std::io::BufWriter::new(std::fs::File::open(dest)?);
//write workspace:GetChildren()[1] //write workspace:GetChildren()[1]
@ -740,7 +740,7 @@ fn upload() -> AResult<()>{
match status.code() { match status.code() {
Some(0)=>{ Some(0)=>{
//move file //move file
let mut dest=std::path::PathBuf::from("maps/uploaded"); let mut dest=PathBuf::from("maps/uploaded");
dest.push(file_thing.file_name()); dest.push(file_thing.file_name());
std::fs::rename(file_thing.path(), dest)?; std::fs::rename(file_thing.path(), dest)?;
} }
@ -761,7 +761,7 @@ fn upload() -> AResult<()>{
//print output //print output
println!("{}", std::str::from_utf8(output.stdout.as_slice())?); println!("{}", std::str::from_utf8(output.stdout.as_slice())?);
//move file //move file
let mut dest=std::path::PathBuf::from("maps/uploaded"); let mut dest=PathBuf::from("maps/uploaded");
dest.push(file_thing.file_name()); dest.push(file_thing.file_name());
std::fs::rename(file_thing.path(), dest)?; std::fs::rename(file_thing.path(), dest)?;
} }
@ -948,11 +948,11 @@ fn interactive() -> AResult<()>{
Interactive::Passed => { Interactive::Passed => {
println!("map={:?} passed with {} {}",file_thing.file_name(),script_count,if script_count==1 {"script"}else{"scripts"}); println!("map={:?} passed with {} {}",file_thing.file_name(),script_count,if script_count==1 {"script"}else{"scripts"});
if replace_count==0{ if replace_count==0{
std::path::PathBuf::from("maps/passed") PathBuf::from("maps/passed")
}else{ }else{
//create new file //create new file
println!("{} {} replaced - generating new file...",replace_count,if replace_count==1 {"script was"}else{"scripts were"}); println!("{} {} replaced - generating new file...",replace_count,if replace_count==1 {"script was"}else{"scripts were"});
let mut dest=std::path::PathBuf::from("maps/passed"); let mut dest=PathBuf::from("maps/passed");
dest.push(file_thing.file_name()); dest.push(file_thing.file_name());
let output = std::io::BufWriter::new(std::fs::File::create(dest)?); let output = std::io::BufWriter::new(std::fs::File::create(dest)?);
//write workspace:GetChildren()[1] //write workspace:GetChildren()[1]
@ -962,16 +962,16 @@ fn interactive() -> AResult<()>{
} }
rbx_binary::to_writer(output, &dom, &[workspace_children[0]])?; rbx_binary::to_writer(output, &dom, &[workspace_children[0]])?;
//move original to processed folder //move original to processed folder
std::path::PathBuf::from("maps/unaltered") PathBuf::from("maps/unaltered")
} }
},//write map into maps/processed },//write map into maps/processed
Interactive::Blocked => { Interactive::Blocked => {
println!("map={:?} blocked with {}/{} {} blocked",file_thing.file_name(),block_count,script_count,if script_count==1 {"script"}else{"scripts"}); println!("map={:?} blocked with {}/{} {} blocked",file_thing.file_name(),block_count,script_count,if script_count==1 {"script"}else{"scripts"});
std::path::PathBuf::from("maps/blocked") PathBuf::from("maps/blocked")
},//write map into maps/blocked },//write map into maps/blocked
Interactive::Flagged => { Interactive::Flagged => {
println!("map={:?} flagged",file_thing.file_name()); println!("map={:?} flagged",file_thing.file_name());
std::path::PathBuf::from("maps/flagged") PathBuf::from("maps/flagged")
},//write map into maps/flagged },//write map into maps/flagged
}; };
dest.push(file_thing.file_name()); dest.push(file_thing.file_name());
@ -994,7 +994,7 @@ fn unzip_all()->AResult<()>{
//read the entire thing to the end so that I can clone the data and write a png to processed images //read the entire thing to the end so that I can clone the data and write a png to processed images
readable.read_to_end(&mut extracted)?; readable.read_to_end(&mut extracted)?;
//write extracted //write extracted
let mut dest=std::path::PathBuf::from("maps/unzipped"); let mut dest=PathBuf::from("maps/unzipped");
dest.push(file_thing.file_name()); dest.push(file_thing.file_name());
std::fs::write(dest, &mut extracted)?; std::fs::write(dest, &mut extracted)?;
//delete ugly gzip file //delete ugly gzip file
@ -1034,7 +1034,7 @@ fn write_attributes() -> AResult<()>{
} }
} }
let mut dest={ let mut dest={
let mut dest=std::path::PathBuf::from("maps/attributes"); let mut dest=PathBuf::from("maps/attributes");
dest.push(file_thing.file_name()); dest.push(file_thing.file_name());
let output = std::io::BufWriter::new(std::fs::File::create(dest)?); let output = std::io::BufWriter::new(std::fs::File::create(dest)?);
//write workspace:GetChildren()[1] //write workspace:GetChildren()[1]
@ -1044,7 +1044,7 @@ fn write_attributes() -> AResult<()>{
} }
rbx_binary::to_writer(output, &dom, &[workspace_children[0]])?; rbx_binary::to_writer(output, &dom, &[workspace_children[0]])?;
//move original to processed folder //move original to processed folder
std::path::PathBuf::from("maps/unaltered") PathBuf::from("maps/unaltered")
}; };
dest.push(file_thing.file_name()); dest.push(file_thing.file_name());
std::fs::rename(file_thing.path(), dest)?; std::fs::rename(file_thing.path(), dest)?;
@ -1108,7 +1108,7 @@ fn recursive_vmt_loader<F:Fn(String)->AResult<Option<Vec<u8>>>>(find_stuff:&F,ma
match get_some_texture(material)?{ match get_some_texture(material)?{
VMTContent::VMT(s)=>recursive_vmt_loader(find_stuff,get_vmt(find_stuff,s)?), VMTContent::VMT(s)=>recursive_vmt_loader(find_stuff,get_vmt(find_stuff,s)?),
VMTContent::VTF(s)=>{ VMTContent::VTF(s)=>{
let mut texture_file_name=std::path::PathBuf::from("materials"); let mut texture_file_name=PathBuf::from("materials");
texture_file_name.push(s); texture_file_name.push(s);
texture_file_name.set_extension("vtf"); texture_file_name.set_extension("vtf");
find_stuff(texture_file_name.into_os_string().into_string().unwrap()) find_stuff(texture_file_name.into_os_string().into_string().unwrap())
@ -1126,13 +1126,13 @@ fn recursive_vmt_loader<F:Fn(String)->AResult<Option<Vec<u8>>>>(find_stuff:&F,ma
} }
} }
fn extract_textures(paths:Vec<std::path::PathBuf>,vpk_paths:Vec<std::path::PathBuf>)->AResult<()>{ fn extract_textures(paths:Vec<PathBuf>,vpk_paths:Vec<PathBuf>)->AResult<()>{
let vpk_list:Vec<vpk::VPK>=vpk_paths.into_iter().map(|vpk_path|vpk::VPK::read(&vpk_path).expect("vpk file does not exist")).collect(); let vpk_list:Vec<vpk::VPK>=vpk_paths.into_iter().map(|vpk_path|vpk::VPK::read(&vpk_path).expect("vpk file does not exist")).collect();
for path in paths{ for path in paths{
let mut deduplicate=std::collections::HashSet::new(); let mut deduplicate=std::collections::HashSet::new();
let bsp=vbsp::Bsp::read(std::fs::read(path)?.as_ref())?; let bsp=vbsp::Bsp::read(std::fs::read(path)?.as_ref())?;
for texture in bsp.textures(){ for texture in bsp.textures(){
deduplicate.insert(std::path::PathBuf::from(texture.name())); deduplicate.insert(PathBuf::from(texture.name()));
} }
//dedupe prop models //dedupe prop models
let mut model_dedupe=std::collections::HashSet::new(); let mut model_dedupe=std::collections::HashSet::new();
@ -1143,8 +1143,8 @@ fn extract_textures(paths:Vec<std::path::PathBuf>,vpk_paths:Vec<std::path::PathB
//grab texture names from props //grab texture names from props
for model_name in model_dedupe{ for model_name in model_dedupe{
//.mdl, .vvd, .dx90.vtx //.mdl, .vvd, .dx90.vtx
let mut path=std::path::PathBuf::from(model_name); let mut path=PathBuf::from(model_name);
let file_name=std::path::PathBuf::from(path.file_stem().unwrap()); let file_name=PathBuf::from(path.file_stem().unwrap());
path.pop(); path.pop();
path.push(file_name); path.push(file_name);
let mut vvd_path=path.clone(); let mut vvd_path=path.clone();
@ -1158,7 +1158,7 @@ fn extract_textures(paths:Vec<std::path::PathBuf>,vpk_paths:Vec<std::path::PathB
let model=vmdl::Model::from_parts(mdl,vtx,vvd); let model=vmdl::Model::from_parts(mdl,vtx,vvd);
for texture in model.textures(){ for texture in model.textures(){
for search_path in &texture.search_paths{ for search_path in &texture.search_paths{
let mut path=std::path::PathBuf::from(search_path.as_str()); let mut path=PathBuf::from(search_path.as_str());
path.push(texture.name.as_str()); path.push(texture.name.as_str());
deduplicate.insert(path); deduplicate.insert(path);
} }
@ -1195,7 +1195,7 @@ fn extract_textures(paths:Vec<std::path::PathBuf>,vpk_paths:Vec<std::path::PathB
)?; )?;
//write dds //write dds
let mut dest=std::path::PathBuf::from("textures/dds"); let mut dest=PathBuf::from("textures/dds");
dest.push(write_file_name); dest.push(write_file_name);
dest.set_extension("dds"); dest.set_extension("dds");
std::fs::create_dir_all(dest.parent().unwrap())?; std::fs::create_dir_all(dest.parent().unwrap())?;
@ -1221,12 +1221,12 @@ fn extract_textures(paths:Vec<std::path::PathBuf>,vpk_paths:Vec<std::path::PathB
Ok::<Option<Vec<u8>>,anyhow::Error>(None) Ok::<Option<Vec<u8>>,anyhow::Error>(None)
}; };
let loader=|texture_name:String|{ let loader=|texture_name:String|{
let mut texture_file_name=std::path::PathBuf::from("materials"); let mut texture_file_name=PathBuf::from("materials");
//lower case //lower case
let texture_file_name_lowercase=texture_name.to_lowercase(); let texture_file_name_lowercase=texture_name.to_lowercase();
texture_file_name.push(texture_file_name_lowercase.clone()); texture_file_name.push(texture_file_name_lowercase.clone());
//remove stem and search for both vtf and vmt files //remove stem and search for both vtf and vmt files
let stem=std::path::PathBuf::from(texture_file_name.file_stem().unwrap()); let stem=PathBuf::from(texture_file_name.file_stem().unwrap());
texture_file_name.pop(); texture_file_name.pop();
texture_file_name.push(stem); texture_file_name.push(stem);
//somehow search for both files //somehow search for both files
@ -1260,7 +1260,7 @@ fn extract_textures(paths:Vec<std::path::PathBuf>,vpk_paths:Vec<std::path::PathB
Ok(()) Ok(())
} }
fn vpk_contents(vpk_path:std::path::PathBuf)->AResult<()>{ fn vpk_contents(vpk_path:PathBuf)->AResult<()>{
let vpk_index=vpk::VPK::read(&vpk_path)?; let vpk_index=vpk::VPK::read(&vpk_path)?;
for (label,entry) in vpk_index.tree.into_iter(){ for (label,entry) in vpk_index.tree.into_iter(){
println!("vpk label={} entry={:?}",label,entry); println!("vpk label={} entry={:?}",label,entry);
@ -1268,7 +1268,7 @@ fn vpk_contents(vpk_path:std::path::PathBuf)->AResult<()>{
Ok(()) Ok(())
} }
fn bsp_contents(path:std::path::PathBuf)->AResult<()>{ fn bsp_contents(path:PathBuf)->AResult<()>{
let bsp=vbsp::Bsp::read(std::fs::read(path)?.as_ref())?; let bsp=vbsp::Bsp::read(std::fs::read(path)?.as_ref())?;
for file_name in bsp.pack.into_zip().into_inner().unwrap().file_names(){ for file_name in bsp.pack.into_zip().into_inner().unwrap().file_names(){
println!("file_name={:?}",file_name); println!("file_name={:?}",file_name);