95 lines
3.9 KiB
C#
95 lines
3.9 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:
|
|
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
|
|
}
|
|
|
|
public record InstanceInfo(String InstanceName, String InstancePath, String MinecraftPath, String ModsPath, String ConfigPath, String ScriptsPath);
|
|
} |