88 lines
3.5 KiB
C#
88 lines
3.5 KiB
C#
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<JarLib> Libs { get; }
|
||
|
||
private IOPath GetJarFilePath(Artifact artifact)
|
||
{
|
||
string relativePath;
|
||
if (!string.IsNullOrEmpty(artifact.path))
|
||
relativePath = artifact.path;
|
||
else if (!string.IsNullOrEmpty(artifact.url))
|
||
relativePath = artifact.url.AsSpan().After("://").After('/').ToString();
|
||
else throw new ArgumentException("Artifact must have a path or url");
|
||
|
||
return Path.Concat(PathHelper.GetLibrariesDir(), relativePath);
|
||
}
|
||
|
||
public Libraries(GameVersionDescriptor descriptor)
|
||
{
|
||
List<JarLib> libs = new();
|
||
HashSet<string> 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;
|
||
|
||
libs.Add(new NativeLib(l.name, GetJarFilePath(artifact), 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;
|
||
|
||
libs.Add(new JarLib(l.name, GetJarFilePath(artifact), artifact));
|
||
}
|
||
}
|
||
|
||
Libs = libs;
|
||
}
|
||
} |