public static void Create(ListView modsList, ListView patchesList) { // Save location for snapshot SaveFileDialog snapshot = new SaveFileDialog() { Title = "Save snapshot...", Filter = "Snapshot (*.06mm)|*.06mm", FileName = $"sonic06mm-snapshot-{DateTime.Now:ddMMyy}.06mm" }; if (snapshot.ShowDialog() == DialogResult.OK) { string architecture = "x86"; int gpuCount = 0; // Get application architecture if (IntPtr.Size == 4) { architecture = "x86"; } else if (IntPtr.Size == 8) { architecture = "x64"; } else { architecture = "Unknown"; } // Create snapshot using (StreamWriter sw = File.CreateText(snapshot.FileName)) { #if !DEBUG try { #endif sw.WriteLine($"Sonic '06 Mod Manager"); sw.WriteLine(DateTime.Now); sw.WriteLine("\nBuild:"); #if !DEBUG sw.WriteLine($"Type: Release"); #elif DEBUG sw.WriteLine($"Type: Debug"); #endif sw.WriteLine($"Version: {Program.VersionNumber}"); sw.WriteLine($"Architecture: {architecture}"); sw.WriteLine("\nSpecifications:"); // Get OS version sw.WriteLine($"OS: {new ComputerInfo().OSFullName}"); // Get CPU name ManagementObjectSearcher getCPU = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_Processor"); foreach (ManagementObject mo in getCPU.Get()) { sw.WriteLine($"CPU: {mo["Name"]}"); } // Format RAM as long to readable bytes sw.WriteLine($"RAM: {Literal.FormatBytes(new ManagementObjectSearcher("SELECT Capacity FROM Win32_PhysicalMemory").Get().Cast<ManagementObject>().Sum(x => Convert.ToInt64(x.Properties["Capacity"].Value)))}"); // Get GPU names ManagementObjectSearcher getGPU = new ManagementObjectSearcher("SELECT * FROM Win32_VideoController"); foreach (ManagementObject mo in getGPU.Get()) { foreach (PropertyData property in mo.Properties) { if (property.Name == "Description") { sw.WriteLine($"GPU #{gpuCount}: {property.Value}"); gpuCount++; } } } // Print list of checked mods if (modsList.CheckedItems.Count != 0) { sw.WriteLine("\nMods:"); // Writes the list in reverse so the mods list writes it in it's preferred order for (int i = modsList.Items.Count - 1; i >= 0; i--) { if (modsList.Items[i].Checked) // Get checked state // Write mod name by folder name to prevent duplicate mod names conflicting { sw.WriteLine(Path.GetFileName(Path.GetDirectoryName(modsList.Items[i].SubItems[6].Text))); } } } // Print list of checked patches if (patchesList.CheckedItems.Count != 0) { sw.WriteLine("\nPatches:"); // Writes in reverse so the patches list writes it in it's preferred order for (int i = patchesList.Items.Count - 1; i >= 0; i--) { if (patchesList.Items[i].Checked) // Get checked state // Write patch name by file name to prevent duplicate patch names conflicting { sw.WriteLine(Path.GetFileName(patchesList.Items[i].SubItems[5].Text)); } } } // Print list of current settings sw.WriteLine("\nSettings:"); foreach (SettingsPropertyValue property in Properties.Settings.Default.PropertyValues) { if (property.Name == "General_AccentColour") { Color colour = Properties.Settings.Default.General_AccentColour; sw.WriteLine($"{property.Name}: {colour.R}, {colour.G}, {colour.B}"); } else { sw.WriteLine($"{property.Name}: {property.PropertyValue}"); } } Console.WriteLine($"[{DateTime.Now:HH:mm:ss tt}] [Success] Created a snapshot"); #if !DEBUG } catch (Exception ex) { // Print exception if something failed sw.WriteLine($"\nExceptions:\n{ex}"); Console.WriteLine($"[{DateTime.Now:HH:mm:ss tt}] [Error] Failed to create snapshot...\n{ex}"); } #endif } } }