// Refresh both PackageList and DisplayedPackages private void Refresh() { Metadata metadata; // First remove all deleted packages and update package id's to match metadata foreach (var package in PackageList.ToList()) { if (!Directory.Exists($@"Packages\{package.path}")) { PackageList.Remove(package); List <DisplayedMetadata> temp = DisplayedPackages.ToList(); temp.RemoveAll(x => x.path == package.path); DisplayedPackages = new ObservableCollection <DisplayedMetadata>(temp); } if (File.Exists($@"Packages\{package.path}\Package.xml")) { try { using (FileStream streamWriter = File.Open($@"Packages\{package.path}\Package.xml", FileMode.Open)) { metadata = (Metadata)xsp.Deserialize(streamWriter); package.id = metadata.id; } } catch (Exception ex) { Console.WriteLine($"[ERROR] Invalid Package.xml for {package.path} ({ex.Message})"); } } } UpdateMetadata(); // Get all packages from Packages folder (Adding packages) foreach (var package in Directory.EnumerateDirectories("Packages")) { if (File.Exists($@"{package}\Package.xml")) { using (FileStream streamWriter = File.Open($@"{package}\Package.xml", FileMode.Open)) { metadata = (Metadata)xsp.Deserialize(streamWriter); // Add package to list if it doesn't exist if (!PackageList.ToList().Any(x => x.path == Path.GetFileName(package)) && !DisplayedPackages.ToList().Any(x => x.path == Path.GetFileName(package))) { // Add new package to both collections DisplayedMetadata dm = InitDisplayedMetadata(metadata); Package p = new Package(); p.enabled = false; p.id = metadata.id; p.path = Path.GetFileName(package); PackageList.Add(p); dm.enabled = false; dm.path = Path.GetFileName(package); DisplayedPackages.Add(dm); } } } // Create Package.xml else { Console.WriteLine($"[WARNING] No Package.xml found for {Path.GetFileName(package)}, creating a simple one..."); // Create metadata Metadata newMetadata = new Metadata(); newMetadata.name = Path.GetFileName(package); newMetadata.id = newMetadata.name.Replace(" ", "").ToLower(); List <string> dirFiles = Directory.GetFiles(package).ToList(); List <string> dirFolders = Directory.GetDirectories(package, "*", SearchOption.TopDirectoryOnly).ToList(); dirFiles = dirFiles.Concat(dirFolders).ToList(); if (dirFiles.Any(x => Path.GetFileName(x).Equals("Mod.xml")) && dirFiles.Any(x => Path.GetFileName(x).Equals("Data"))) { //If mod folder contains Data folder and mod.xml, import mod compendium mod.xml... string modXml = dirFiles.First(x => Path.GetFileName(x).Equals("Mod.xml")); using (FileStream streamWriter = File.Open(modXml, FileMode.Open)) { //Deserialize Mod.xml & Use metadata ModXmlMetadata m = (ModXmlMetadata)xsm.Deserialize(streamWriter); newMetadata.id = m.Author.ToLower().Replace(" ", "") + "." + m.Title.ToLower().Replace(" ", ""); newMetadata.author = m.Author; newMetadata.version = m.Version; newMetadata.link = m.Url; newMetadata.description = m.Description; } //Move files out of Data folder string dataDir = dirFiles.First(x => Path.GetFileName(x).Equals("Data")); if (Directory.Exists(dataDir)) { MoveDir(dataDir, Path.GetDirectoryName(dataDir)); } //Delete prebuild.bat if exists if (dirFiles.Any(x => Path.GetFileName(x).Equals("prebuild.bat"))) { File.Delete(dirFiles.First(x => Path.GetFileName(x).Equals("prebuild.bat"))); } //Make sure Data folder is gone if (Directory.Exists(dataDir)) { Directory.Delete(dataDir, true); } //Goodbye old friend File.Delete(modXml); } else { newMetadata.author = ""; newMetadata.version = ""; newMetadata.link = ""; newMetadata.description = ""; } using (FileStream streamWriter = File.Create($@"{package}\Package.xml")) { xsp.Serialize(streamWriter, newMetadata); } if (!PackageList.ToList().Any(x => x.path == Path.GetFileName(package)) && !DisplayedPackages.ToList().Any(x => x.path == Path.GetFileName(package))) { // Create package Package newPackage = new Package(); newPackage.enabled = false; newPackage.path = Path.GetFileName(package); newPackage.id = newMetadata.id; PackageList.Add(newPackage); // Create displayedmetadata DisplayedMetadata newDisplayedMetadata = InitDisplayedMetadata(newMetadata); newDisplayedMetadata.enabled = false; newDisplayedMetadata.path = newPackage.path; DisplayedPackages.Add(newDisplayedMetadata); } else { UpdateMetadata(); } } } // Update DisplayedPackages App.Current.Dispatcher.Invoke((Action) delegate { ModGrid.ItemsSource = DisplayedPackages; // Trigger select event to refresh description and Preview.png ModGrid.SetSelectedItem(ModGrid.GetSelectedItem()); }); Console.WriteLine($"[INFO] Refreshed!"); }
public MainWindow() { InitializeComponent(); DataContext = this; outputter.WriteEvent += consoleWriter_WriteEvent; outputter.WriteLineEvent += consoleWriter_WriteLineEvent; Console.SetOut(outputter); binMerger = new binMerge(); tblPatcher = new tblPatch(); pacUnpacker = new PacUnpacker(); DisplayedPackages = new ObservableCollection <DisplayedMetadata>(); PackageList = new ObservableCollection <Package>(); // Retrieve initial thumbnail from embedded resource Assembly asm = Assembly.GetExecutingAssembly(); Stream iconStream = asm.GetManifestResourceStream("AemulusModManager.Preview.png"); bitmap = new BitmapImage(); bitmap.BeginInit(); bitmap.StreamSource = iconStream; bitmap.EndInit(); Preview.Source = bitmap; // Initialize config config = new Config(); // Initialize xml serializers xs = new XmlSerializer(typeof(Config)); xsp = new XmlSerializer(typeof(Metadata)); xsm = new XmlSerializer(typeof(ModXmlMetadata)); Console.WriteLine("[INFO] Initializing packages from Config.xml"); // Load in Config if it exists if (File.Exists(@"Config.xml")) { try { using (FileStream streamWriter = File.Open(@"Config.xml", FileMode.Open)) { // Call the Deserialize method and cast to the object type. config = (Config)xs.Deserialize(streamWriter); reloadedPath = config.reloadedPath; p4gPath = config.exePath; modPath = config.modDir; emptySND = config.emptySND; // Compatibility with old Config.xml List <Package> temp = config.package.ToList(); foreach (var p in temp) { if (p.name != null && p.path == null) { p.path = p.name; p.name = null; } } PackageList = new ObservableCollection <Package>(temp); tbl = config.tbl; } } catch (Exception ex) { Console.WriteLine($"Invalid Config.xml ({ex.Message})"); } // Create displayed metadata from packages in PackageList and their respective Package.xml's foreach (var package in PackageList) { string xml = $@"Packages\{package.path}\Package.xml"; Metadata m; DisplayedMetadata dm = new DisplayedMetadata(); try { if (File.Exists(xml)) { m = new Metadata(); try { using (FileStream streamWriter = File.Open(xml, FileMode.Open)) { m = (Metadata)xsp.Deserialize(streamWriter); dm.name = m.name; dm.id = m.id; dm.author = m.author; dm.version = m.version; dm.link = m.link; dm.description = m.description; } } catch (Exception ex) { Console.WriteLine($"[ERROR] Invalid Package.xml for {package.path} ({ex.Message})"); } } dm.path = package.path; dm.enabled = package.enabled; DisplayedPackages.Add(dm); } catch (Exception ex) { Console.WriteLine($"[ERROR] Invalid Package.xml for package {package.id} ({ex.Message})"); continue; } } ModGrid.ItemsSource = DisplayedPackages; } if (modPath == null) { MergeButton.IsEnabled = false; } if (config.modDir != null) { modPath = config.modDir; } // Create Packages directory if it doesn't exist if (!Directory.Exists("Packages")) { Directory.CreateDirectory("Packages"); } if (!Directory.Exists("Original")) { Directory.CreateDirectory("Original"); } Refresh(); updateConfig(); // Check if Original Folder is unpacked if (!Directory.EnumerateFileSystemEntries("Original").Any()) { Console.WriteLine("[WARNING] Aemulus can't find your Vanilla files in the Original folder."); Console.WriteLine("Please click the Config button and select \"Unpack data00004.pac\" before building."); } }