VaultSmpInstaller/ViewModels/ProfileWindow2ViewModel.cs
CanadianBacon 4663bbca87 1.0.1
Refactor, make safer, add some logging
2024-02-21 07:34:48 +01:00

100 lines
4.1 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reactive;
using System.Text.Json.Nodes;
using Avalonia.Media;
using ReactiveUI;
namespace VaultSmpInstaller.ViewModels;
public class ProfileWindow2ViewModel : ReactiveObject
{
public ReactiveCommand<Unit, InstanceInfo?> SelectProfileCommand { get; }
public static Brush Background => SolidColorBrush.Parse("#282A36");
public static Brush SecondaryBackground => SolidColorBrush.Parse("#44475A");
public static Brush ButtonBackground => SolidColorBrush.Parse("#6272A4");
public static Brush TextColor => SolidColorBrush.Parse("#F8F8F2");
public Dictionary<string, InstanceInfo> Instances { get; }
public List<string> InstanceNames { get; }
public InstanceInfo? SelectedInstance { get; set; } = null;
public Boolean IsInstanceSelected => SelectedInstance != null;
public ProfileWindow2ViewModel(InstanceType launcherType, string instancesDir)
{
Instances = new Dictionary<string, InstanceInfo>();
switch (launcherType)
{
case InstanceType.Prism:
foreach (var directory in Directory.EnumerateDirectories(instancesDir))
{
if (!File.Exists(Path.Combine(directory, "instance.cfg"))) continue;
foreach(String line in File.ReadLines(Path.Combine(directory, "instance.cfg")))
{
if (line.StartsWith("name"))
{
Instances.Add(line.Split('=', 2)[1],
new InstanceInfo(
line.Split('=', 2)[1],
directory,
Path.Combine(directory, "minecraft"),
Path.Combine(directory, "minecraft", "mods"),
Path.Combine(directory, "minecraft", "config"),
Path.Combine(directory, "minecraft", "scripts")
)
);
break;
}
}
}
break;
case InstanceType.Curseforge:
foreach (var directory in Directory.EnumerateDirectories(instancesDir))
{
string? instanceConfigName = null;
if (File.Exists(Path.Combine(directory, "minecraftinstance.json"))) instanceConfigName = "minecraftinstance.json";
if (File.Exists(Path.Combine(directory, "minecraftInstance.json"))) instanceConfigName = "minecraftInstance.json";
if (instanceConfigName == null) continue;
var instanceConfig = JsonNode.Parse(File.ReadAllText(Path.Combine(directory, instanceConfigName)))?.AsObject();
if(instanceConfig == null) continue;
if (!instanceConfig.TryGetPropertyValue("name", out var nameNode)) continue;
if (!nameNode!.AsValue().TryGetValue(out string? instanceName)) continue;
Instances.Add(instanceName,
new InstanceInfo(
instanceName,
directory,
directory,
Path.Combine(directory, "mods"),
Path.Combine(directory, "config"),
Path.Combine(directory, "scripts")
)
);
}
break;
default:
throw new ArgumentOutOfRangeException(nameof(launcherType), launcherType, null);
}
InstanceNames = Instances.Keys.ToList();
SelectProfileCommand = ReactiveCommand.Create(() => SelectedInstance);
}
public enum InstanceType
{
Prism, Curseforge
}
public record InstanceInfo(String InstanceName, String InstancePath, String MinecraftPath, String ModsPath, String ConfigPath, String ScriptsPath);
}