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; } /// Multi-line description of override state, for the /// Settings view. Shows env var values even when the path doesn't /// resolve, so the user can debug "I set DORKNET_LOCAL_RELEASES /// but it didn't work" without digging into File.Exists. public static string DescribeActive() { var parts = new List(); Describe(ManifestEnvVar, isDir: false, parts); Describe(ReleasesEnvVar, isDir: true, parts); return string.Join("\n", parts); } private static void Describe(string envVar, bool isDir, List parts) { var raw = Environment.GetEnvironmentVariable(envVar); if (string.IsNullOrEmpty(raw)) return; var exists = isDir ? Directory.Exists(raw) : File.Exists(raw); parts.Add(exists ? $"{envVar} -> {raw} [active]" : $"{envVar} -> {raw} [SET BUT NOT FOUND on disk]"); } }