using DTLib.Extensions; using Mlaumcherb.Client.Avalonia.холопы; namespace Mlaumcherb.Client.Avalonia.классы; public class Libraries { private static readonly string[] enabled_features = []; public record JarLib(string name, IOPath jarFilePath, Artifact artifact); public record NativeLib(string name, IOPath jarFilePath, Artifact artifact, Extract? extractionOptions) : JarLib(name, jarFilePath, artifact); public IReadOnlyCollection Libs { get; } public Libraries(GameVersionDescriptor descriptor) { List libs = new(); HashSet libHashes = new(); foreach (var l in descriptor.libraries) { if (l.rules != null && !Rules.Check(l.rules, enabled_features)) continue; if (l.natives != null) { string? nativesKey; if (OperatingSystem.IsWindows()) nativesKey = l.natives.windows; else if (OperatingSystem.IsLinux()) nativesKey = l.natives.linux; else if (OperatingSystem.IsMacOS()) nativesKey = l.natives.osx; else throw new PlatformNotSupportedException(); if(nativesKey is null) throw new Exception($"nativesKey for '{l.name}' is null"); // example: "natives-windows-${arch}" if (nativesKey.Contains('$')) { var span = nativesKey.AsSpan(); nativesKey = span.After("${").Before('}') switch { "arch" => span.Before("${").ToString() + PlatformHelper.GetArchOld(), _ => throw new Exception($"unknown placeholder in {nativesKey}") }; } Artifact artifact = null!; if(l.downloads.classifiers != null && !l.downloads.classifiers.TryGetValue(nativesKey, out artifact!)) throw new Exception($"can't find artifact for '{l.name}' with nativesKey '{nativesKey}'"); // skipping duplicates (WHO THE HELL CREATES THIS DISCRIPTORS AAAAAAAAA) if(!libHashes.Add(artifact.sha1)) continue; string urlTail = artifact.url.AsSpan().After("://").After('/').ToString(); IOPath jarFilePath = Path.Concat(PathHelper.GetLibrariesDir(), urlTail); libs.Add(new NativeLib(l.name, jarFilePath, artifact, l.extract)); } else { Artifact? artifact = l.downloads.artifact; if (artifact == null) throw new NullReferenceException($"artifact for '{l.name}' is null"); // skipping duplicates if(!libHashes.Add(artifact.sha1)) continue; string urlTail = artifact.url.AsSpan().After("://").After('/').ToString(); IOPath jarFilePath = Path.Concat(PathHelper.GetLibrariesDir(), urlTail); libs.Add(new JarLib(l.name, jarFilePath, artifact)); } } Libs = libs; } }