fn class_is_a(class: &str, superclass: &str) -> bool { if class==superclass { return true } let class_descriptor=rbx_reflection_database::get().classes.get(class); if let Some(descriptor) = &class_descriptor { if let Some(class_super) = &descriptor.superclass { return class_is_a(&class_super, superclass) } } return false } fn get_scripts(dom:rbx_dom_weak::WeakDom) -> Vec{ let mut scripts = std::vec::Vec::::new(); let (_,mut instances) = dom.into_raw(); for (_,instance) in instances.drain() { if class_is_a(instance.class.as_str(), "LuaSourceContainer") { scripts.push(instance); } } scripts } fn main() -> Result<(), Box> { // Using buffered I/O is recommended with rbx_binary let input = std::io::BufReader::new(std::fs::File::open("map.rbxm")?); let dom = rbx_binary::from_reader(input)?; //Construct allowed scripts let mut allowed = std::collections::HashSet::::new(); for entry in std::fs::read_dir("allowed")? { allowed.insert(std::fs::read_to_string(entry?.path())?); } let scripts = get_scripts(dom); //check scribb let mut any_failed=false; for script in scripts.iter() { if let Some(rbx_dom_weak::types::Variant::String(s)) = script.properties.get("Source") { if allowed.contains(s) { println!("pass"); }else{ println!("fail"); any_failed=true; std::fs::write(format!("blocked/{}.lua",i),s)?; } }else{ println!("failed to get source"); any_failed=true; } }else{ println!("failed to deref script"); any_failed=true; } } if any_failed { println!("One or more scripts are not allowed."); return Ok(())//everything is not ok but idk how to return an error LMAO } println!("All scripts passed!"); // std::process::Command::new("rbxcompiler") // .arg("--compile=false") // .arg("--group=6980477") // .arg("--asset=5692139100") // .arg("--input=map.rbxm") // .spawn()?; Ok(()) }