VaultSmpInstaller/ViewModels/ProfileWindow2ViewModel.cs

95 lines
4.0 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 : ViewModelBase
{
public Interaction<ProfileWindow2ViewModel, ProfileWindow2ViewModel.InstanceInfo?> ShowProfileSelectionDialog { get; }
public ReactiveCommand<Unit, ProfileWindow2ViewModel.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: case InstanceType.Overwolf:
foreach (var directory in Directory.EnumerateDirectories(instancesDir))
{
if (!File.Exists(Path.Combine(directory, "minecraftinstance.json"))) continue;
var instanceConfig = JsonNode.Parse(File.ReadAllText(Path.Combine(directory, "minecraftinstance.json")))!.AsObject();
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, Overwolf
}
public record InstanceInfo(String InstanceName, String InstancePath, String MinecraftPath, String ModsPath, String ConfigPath, String ScriptsPath);
}