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 ShowProfileSelectionDialog { get; } public ReactiveCommand 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 Instances { get; } public List InstanceNames { get; } public InstanceInfo? SelectedInstance { get; set; } = null; public Boolean IsInstanceSelected => SelectedInstance != null; public ProfileWindow2ViewModel(InstanceType launcherType, string instancesDir) { Instances = new Dictionary(); 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); }