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 recursive_collect_scripts(scripts: &mut std::vec::Vec,dom: &rbx_dom_weak::WeakDom, instance: &rbx_dom_weak::Instance){ for &referent in instance.children() { if let Some(c) = dom.get_by_ref(referent) { if class_is_a(c.class.as_str(), "LuaSourceContainer") { scripts.push(c.referent());//copy ref } recursive_collect_scripts(scripts,dom,c); } } } 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 mut scripts = std::vec::Vec::::new(); recursive_collect_scripts(&mut scripts, &dom, dom.root()); //check scribb let mut any_failed=false; for (i,&referent) in scripts.iter().enumerate() { if let Some(script) = dom.get_by_ref(referent) { 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(()) }