CVR Manager 1.0.0
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace CVRManager.Services;
|
||||
|
||||
public static class MultiInstance
|
||||
{
|
||||
const int KeepLogs = 7;
|
||||
|
||||
static readonly Regex SingleInstanceLine = new(@"^single-instance[^\r\n]*(\r?\n|$)", RegexOptions.Multiline | RegexOptions.Compiled);
|
||||
|
||||
public static void Prepare(string gameDir, Action<string> log)
|
||||
{
|
||||
RemoveSingleInstanceFlag(gameDir, log);
|
||||
PruneMelonLoaderLogs(gameDir, log);
|
||||
}
|
||||
|
||||
static void RemoveSingleInstanceFlag(string gameDir, Action<string> log)
|
||||
{
|
||||
var boot = Path.Combine(gameDir, "ChilloutVR_Data", "boot.config");
|
||||
if (!File.Exists(boot)) return;
|
||||
var text = File.ReadAllText(boot);
|
||||
var cleaned = SingleInstanceLine.Replace(text, "");
|
||||
if (cleaned == text) return;
|
||||
File.WriteAllText(boot, cleaned, new UTF8Encoding(false));
|
||||
log("Removed 'single-instance' from boot.config so more than one instance can run.");
|
||||
}
|
||||
|
||||
static void PruneMelonLoaderLogs(string gameDir, Action<string> log)
|
||||
{
|
||||
var logs = Path.Combine(gameDir, "MelonLoader", "Logs");
|
||||
if (!Directory.Exists(logs)) return;
|
||||
var files = new DirectoryInfo(logs).GetFiles("*.log").OrderBy(f => f.LastWriteTimeUtc).ToList();
|
||||
var excess = files.Count - KeepLogs;
|
||||
var removed = 0;
|
||||
foreach (var f in files)
|
||||
{
|
||||
if (removed >= excess) break;
|
||||
try
|
||||
{
|
||||
f.Delete();
|
||||
removed++;
|
||||
}
|
||||
catch (Exception e) when (e is IOException or UnauthorizedAccessException) { }
|
||||
}
|
||||
if (removed > 0) log($"Removed {removed} old MelonLoader log(s) so a second instance does not trip MelonLoader's log cleanup.");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user