using System.IO.Compression; using MetaforceInstaller.Core.Models; namespace MetaforceInstaller.Core.Services; public class ZipScrapper { public static InstallationParts PeekFiles(ZipArchive archive) { return new InstallationParts { AndroidContentPath = DoesAndroidContentExists(archive), OculusClientPath = DoesOculusClientExists(archive), PicoClientPath = DoesPicoClientExists(archive), AndroidAdminPath = DoesAndroidAdminExists(archive), WindowsAdminPath = DoesPcAdminExists(archive), WindowsContentPath = DoesWindowsContentExists(archive), WindowsServerPath = DoesServerExists(archive), }; // Console.WriteLine($"Contents of {archive}:"); // Console.WriteLine("----------------------------------"); // // foreach (ZipArchiveEntry entry in archive.Entries) // { // // You can access properties like entry.Name, entry.FullName, entry.Length (uncompressed size), entry.CompressedLength // Console.WriteLine($"Entry: {entry.FullName}"); // Console.WriteLine($" Uncompressed Size: {entry.Length} bytes"); // Console.WriteLine($" Compressed Size: {entry.CompressedLength} bytes"); // Console.WriteLine("----------------------------------"); // } } public static string ExtractZip(ZipArchive archive, string outputPath, IProgress? progress = null) { var entries = archive.Entries.Where(e => !string.IsNullOrEmpty(e.Name)).ToList(); var totalEntries = entries.Count; var processedEntries = 0; foreach (var entry in entries) { var destinationPath = Path.Combine(outputPath, entry.FullName); var destinationDir = Path.GetDirectoryName(destinationPath); if (!string.IsNullOrEmpty(destinationDir)) { Directory.CreateDirectory(destinationDir); Console.WriteLine($"Extracting {entry.FullName} to {destinationPath}"); } entry.ExtractToFile(destinationPath, overwrite: true); processedEntries++; progress?.Report((double)processedEntries / totalEntries * 100); } return outputPath; } private static string? DoesPicoClientExists(ZipArchive archive) { var entry = archive.Entries.FirstOrDefault(entry => entry.Name.Contains("MetaforcePico") && entry.Name.EndsWith(".apk")); return entry?.FullName; } private static string? DoesOculusClientExists(ZipArchive archive) { var entry = archive.Entries.FirstOrDefault(entry => entry.Name.Contains("MetaforceOculus") && entry.Name.EndsWith(".apk")); return entry?.FullName; } private static string? DoesAndroidAdminExists(ZipArchive archive) { var entry = archive.Entries.FirstOrDefault(entry => entry.Name.Contains("MetaforceAdmin") && entry.Name.EndsWith(".apk")); return entry?.FullName; } private static string? DoesAndroidContentExists(ZipArchive archive) { var entry = archive.Entries.FirstOrDefault(entry => entry.Name.Contains("Content_Android") && entry.Name.EndsWith(".zip")); return entry?.FullName; } private static string? DoesWindowsContentExists(ZipArchive archive) { var entry = archive.Entries.FirstOrDefault(entry => entry.Name.Contains("Content_StandaloneWindows") && entry.Name.EndsWith(".zip")); return entry?.FullName; } private static string? DoesPcAdminExists(ZipArchive archive) { var entry = archive.Entries.FirstOrDefault(entry => entry.FullName.Contains("MetaforceAdminPC") && entry.Name.EndsWith(".exe") && !entry.Name.Contains("UnityCrashHandler") && !entry.Name.Contains("crashpad_handler")); return entry?.FullName; } private static string? DoesServerExists(ZipArchive archive) { var entry = archive.Entries.FirstOrDefault(entry => entry.FullName.Contains("MetaforceServer") && entry.Name.EndsWith(".exe") && !entry.Name.Contains("UnityCrashHandler") && !entry.Name.Contains("crashpad_handler")); return entry?.FullName; } }