using System.IO; namespace DorkNet.Launcher.Backend; /// Local dev-time overrides that bypass the GitHub-backed /// manifest + releases fetches. Set via environment variables before /// launching dorknet.exe: /// /// /// DORKNET_LOCAL_MANIFEST = full path to a /// versions.json file. When set + exists, /// reads it from disk and /// skips the GitHub round-trip. /// DORKNET_LOCAL_RELEASES = path to a directory whose /// children are {version_key}/server/ and /// {version_key}/patcher/. When the launcher would normally /// download a server / patcher zip, it points at these in-place /// instead — no copying, no markers, just read the dir. /// /// /// Both overrides are no-ops when the env var is unset or the /// path doesn't exist on disk, so they're safe to leave set /// permanently in a dev profile. public static class LocalOverrides { public const string ManifestEnvVar = "DORKNET_LOCAL_MANIFEST"; public const string ReleasesEnvVar = "DORKNET_LOCAL_RELEASES"; /// Returns the configured manifest path if the env var is /// set AND the file exists; null otherwise. Caller decides whether /// to fall back to the network. public static string? GetLocalManifestPath() { var path = Environment.GetEnvironmentVariable(ManifestEnvVar); if (string.IsNullOrEmpty(path)) return null; return File.Exists(path) ? path : null; } /// Returns the configured releases-root if the env var is /// set AND the directory exists; null otherwise. public static string? GetLocalReleasesRoot() { var path = Environment.GetEnvironmentVariable(ReleasesEnvVar); if (string.IsNullOrEmpty(path)) return null; return Directory.Exists(path) ? path : null; } /// Returns the local server-dir for /// if the releases-root override is set and the subfolder exists. /// Convention: {root}/{version_key}/server/. public static string? GetLocalServerDir(string versionKey) { var root = GetLocalReleasesRoot(); if (root is null) return null; var dir = Path.Combine(root, versionKey, "server"); return Directory.Exists(dir) ? dir : null; } /// Same as but for the /// client patcher. Convention: {root}/{version_key}/patcher/. public static string? GetLocalPatcherDir(string versionKey) { var root = GetLocalReleasesRoot(); if (root is null) return null; var dir = Path.Combine(root, versionKey, "patcher"); return Directory.Exists(dir) ? dir : null; } /// Single-line description of what overrides are active, /// for surfacing in the Settings view. Empty string if none. public static string DescribeActive() { var parts = new List(); var m = GetLocalManifestPath(); if (m is not null) parts.Add($"manifest -> {m}"); var r = GetLocalReleasesRoot(); if (r is not null) parts.Add($"releases -> {r}"); return string.Join("\n", parts); } }