adding all the things
This commit is contained in:
parent
10306c8878
commit
0c0651e241
25
EftPatchHelper/EftPatchHelper.sln
Normal file
25
EftPatchHelper/EftPatchHelper.sln
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio Version 17
|
||||||
|
VisualStudioVersion = 17.0.32126.317
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EftPatchHelper", "EftPatchHelper\EftPatchHelper.csproj", "{53238CBB-729D-4E9B-ABB3-12C430AE56F1}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{53238CBB-729D-4E9B-ABB3-12C430AE56F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{53238CBB-729D-4E9B-ABB3-12C430AE56F1}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{53238CBB-729D-4E9B-ABB3-12C430AE56F1}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{53238CBB-729D-4E9B-ABB3-12C430AE56F1}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {D08D2C5F-8AAA-4A57-AD66-F21402682B0C}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
14
EftPatchHelper/EftPatchHelper/EftPatchHelper.csproj
Normal file
14
EftPatchHelper/EftPatchHelper/EftPatchHelper.csproj
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Spectre.Console" Version="0.43.0" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
61
EftPatchHelper/EftPatchHelper/Helpers/FolderCleaner.cs
Normal file
61
EftPatchHelper/EftPatchHelper/Helpers/FolderCleaner.cs
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
using Spectre.Console;
|
||||||
|
|
||||||
|
namespace EftPatchHelper.Helpers
|
||||||
|
{
|
||||||
|
public static class FolderCleaner
|
||||||
|
{
|
||||||
|
public static string cleanPathsFile = Path.Join(Directory.GetCurrentDirectory(), "removePaths.txt");
|
||||||
|
|
||||||
|
public static string[] AssumedPaths =
|
||||||
|
{
|
||||||
|
"BattlEye",
|
||||||
|
"cache",
|
||||||
|
"Logs",
|
||||||
|
"ConsistencyInfo",
|
||||||
|
"EscapeFromTarkov_BE.exe",
|
||||||
|
"Uninstall.exe",
|
||||||
|
"UnityCrashHandler64.exe",
|
||||||
|
"WinPixEventRuntime.dll"
|
||||||
|
};
|
||||||
|
|
||||||
|
public static void Clean(string FolderPath)
|
||||||
|
{
|
||||||
|
AnsiConsole.Status()
|
||||||
|
.Spinner(Spinner.Known.Default)
|
||||||
|
.Start($"Cleaning Folder ...", ctx =>
|
||||||
|
{
|
||||||
|
AnsiConsole.MarkupLine($"[blue]INFO:[/] [gray]Getting folders to remove for {FolderPath} ...[/]");
|
||||||
|
if (!File.Exists(cleanPathsFile)) File.WriteAllLines(cleanPathsFile, AssumedPaths);
|
||||||
|
|
||||||
|
string[] delPaths = File.ReadAllLines(cleanPathsFile);
|
||||||
|
|
||||||
|
foreach (string delPath in delPaths)
|
||||||
|
{
|
||||||
|
string fsItemToRemove = Path.Join(FolderPath, delPath);
|
||||||
|
|
||||||
|
FileSystemInfo fsInfo = Directory.Exists(fsItemToRemove) ? new DirectoryInfo(fsItemToRemove) : new FileInfo(fsItemToRemove);
|
||||||
|
|
||||||
|
if (fsInfo is DirectoryInfo dInfo)
|
||||||
|
{
|
||||||
|
dInfo.Delete(true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fsInfo.Delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fsInfo.Refresh();
|
||||||
|
|
||||||
|
if(!fsInfo.Exists)
|
||||||
|
{
|
||||||
|
AnsiConsole.MarkupLine($"[blue]INFO:[/] [gray]Deleting {fsInfo.Name} ...[/] [green]OK[/]");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
AnsiConsole.MarkupLine($"[blue]INFO:[/] [gray]Deleting {fsInfo.Name} ...[/] [red]Failed[/]");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
86
EftPatchHelper/EftPatchHelper/Helpers/FolderCopy.cs
Normal file
86
EftPatchHelper/EftPatchHelper/Helpers/FolderCopy.cs
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
using Spectre.Console;
|
||||||
|
|
||||||
|
namespace EftPatchHelper.Helpers
|
||||||
|
{
|
||||||
|
public class FolderCopy
|
||||||
|
{
|
||||||
|
private string SourceFolder { get; }
|
||||||
|
private string DestinationFolder { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create a folder copy object
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="SourceFolder">The folder to copy</param>
|
||||||
|
/// <param name="DestinationFolder">The folder to copy into</param>
|
||||||
|
public FolderCopy(string SourceFolder, string DestinationFolder)
|
||||||
|
{
|
||||||
|
this.SourceFolder = SourceFolder;
|
||||||
|
this.DestinationFolder = DestinationFolder;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Start()
|
||||||
|
{
|
||||||
|
DirectoryInfo sourceDir = new DirectoryInfo(SourceFolder);
|
||||||
|
DirectoryInfo destDir = new DirectoryInfo(DestinationFolder);
|
||||||
|
|
||||||
|
if (!destDir.Exists)
|
||||||
|
{
|
||||||
|
destDir.Create();
|
||||||
|
destDir.Refresh();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(!AnsiConsole.Confirm($"{destDir.FullName} exists. Do you want to overwright it?", false))
|
||||||
|
{
|
||||||
|
AnsiConsole.MarkupLine("[yellow]Using existing folder[/]");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
destDir.Delete(true);
|
||||||
|
destDir.Create();
|
||||||
|
destDir.Refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
string[] files = Directory.GetFiles(this.SourceFolder, "*", SearchOption.AllDirectories);
|
||||||
|
|
||||||
|
AnsiConsole.Progress()
|
||||||
|
.Columns(new ProgressColumn[]
|
||||||
|
{
|
||||||
|
new TaskDescriptionColumn(),
|
||||||
|
new ProgressBarColumn(),
|
||||||
|
new PercentageColumn(),
|
||||||
|
new ElapsedTimeColumn(),
|
||||||
|
new SpinnerColumn()
|
||||||
|
})
|
||||||
|
.Start(ctx =>
|
||||||
|
{
|
||||||
|
var copyTask = ctx.AddTask($"Copying [green]{sourceDir.Name}[/] -> [green]{destDir.Parent?.Name ?? destDir.Name}[/]");
|
||||||
|
|
||||||
|
copyTask.MaxValue = files.Count();
|
||||||
|
|
||||||
|
foreach (string file in files)
|
||||||
|
{
|
||||||
|
FileInfo sourceFileInfo = new FileInfo(file);
|
||||||
|
|
||||||
|
string relativeDestParentPath = sourceFileInfo.DirectoryName?.Replace(sourceDir.FullName, "") ??
|
||||||
|
throw new Exception($"Failed to get destination file path for {sourceFileInfo.FullName}");
|
||||||
|
|
||||||
|
DirectoryInfo destParent = new DirectoryInfo(Path.Join(destDir.FullName, relativeDestParentPath));
|
||||||
|
|
||||||
|
if (!destParent.Exists)
|
||||||
|
{
|
||||||
|
destParent.Create();
|
||||||
|
}
|
||||||
|
|
||||||
|
string targetFile = Path.Join(destParent.FullName, sourceFileInfo.Name);
|
||||||
|
|
||||||
|
sourceFileInfo.CopyTo(targetFile, true);
|
||||||
|
|
||||||
|
copyTask.Increment(1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
141
EftPatchHelper/EftPatchHelper/Program.cs
Normal file
141
EftPatchHelper/EftPatchHelper/Program.cs
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
// See https://aka.ms/new-console-template for more information
|
||||||
|
using EftPatchHelper;
|
||||||
|
using EftPatchHelper.Helpers;
|
||||||
|
using Spectre.Console;
|
||||||
|
using System.Diagnostics;
|
||||||
|
|
||||||
|
Settings? settings = Settings.Load();
|
||||||
|
|
||||||
|
// check settings file exists
|
||||||
|
if(settings == null)
|
||||||
|
{
|
||||||
|
settings = new Settings();
|
||||||
|
settings.Save();
|
||||||
|
|
||||||
|
AnsiConsole.MarkupLine($"Settings file was create here: \n[blue]{Settings.settingsFile}[/]\n\nPlease update it and try again.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// validate settings
|
||||||
|
if(!settings.Validate())
|
||||||
|
{
|
||||||
|
AnsiConsole.MarkupLine($"[red]Settings file seems to be missing some information, please fix it[/]\n\nPath to file:\n[blue]{Settings.settingsFile}[/]\n\n");
|
||||||
|
AnsiConsole.MarkupLine("Press [blue]Enter[/] to close ...");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Fancy
|
||||||
|
AnsiConsole.Write(new FigletText("EFT Patch Helper").Centered().Color(Color.Blue));
|
||||||
|
|
||||||
|
// show some settings information
|
||||||
|
AnsiConsole.WriteLine();
|
||||||
|
AnsiConsole.MarkupLine($"Current target version is [purple]{settings.TargetEftVersion}[/]");
|
||||||
|
AnsiConsole.MarkupLine($"Prep folder path is [purple]{settings.PrepFolderPath}[/]");
|
||||||
|
AnsiConsole.MarkupLine($"Backup folder path is [purple]{settings.BackupFolderPath}[/]");
|
||||||
|
AnsiConsole.WriteLine();
|
||||||
|
|
||||||
|
// Source Selection Prompt
|
||||||
|
SelectionPrompt<string> sourcePrompt = new SelectionPrompt<string>()
|
||||||
|
{
|
||||||
|
Title = "Select Source Version",
|
||||||
|
MoreChoicesText = "Move cursor to see more versions",
|
||||||
|
PageSize = 10
|
||||||
|
};
|
||||||
|
|
||||||
|
// Get eft live version
|
||||||
|
var eftVersion = FileVersionInfo.GetVersionInfo(Path.Join(settings.LiveEftPath, "EscapeFromTarkov.exe")).ProductVersion?.Replace('-', '.');
|
||||||
|
|
||||||
|
if(eftVersion != null)
|
||||||
|
{
|
||||||
|
//remove leading 0 from version number
|
||||||
|
if (eftVersion.StartsWith("0."))
|
||||||
|
{
|
||||||
|
eftVersion = eftVersion.Remove(0, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// add eft liver version to selection prompt choices
|
||||||
|
sourcePrompt.AddChoice($"Live: {eftVersion}");
|
||||||
|
}
|
||||||
|
|
||||||
|
// add backup folders to source prompt choices
|
||||||
|
foreach(string backup in Directory.GetDirectories(settings.BackupFolderPath))
|
||||||
|
{
|
||||||
|
DirectoryInfo backupDir = new DirectoryInfo(backup);
|
||||||
|
|
||||||
|
if(!backupDir.Exists)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
sourcePrompt.AddChoice($"Backup: {backupDir.Name}");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
string result = sourcePrompt.Show(AnsiConsole.Console);
|
||||||
|
|
||||||
|
string sourceVersion = result.Split(": ")[1];
|
||||||
|
|
||||||
|
string sourceBackupPath = Path.Join(settings.BackupFolderPath, sourceVersion);
|
||||||
|
|
||||||
|
//backup live folder if it was selected
|
||||||
|
if(result.StartsWith("Live:"))
|
||||||
|
{
|
||||||
|
// only backup the live folder if it doesn't exist already
|
||||||
|
if(!Directory.Exists(sourceBackupPath))
|
||||||
|
{
|
||||||
|
AnsiConsole.MarkupLine("[blue]Backing up live ...[/]");
|
||||||
|
FolderCopy backupLiveCopy = new FolderCopy(settings.LiveEftPath, sourceBackupPath);
|
||||||
|
|
||||||
|
backupLiveCopy.Start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
string targetBackupPath = Path.Join(settings.BackupFolderPath, settings.TargetEftVersion);
|
||||||
|
|
||||||
|
string targetPrepPath = Path.Join(settings.PrepFolderPath, settings.TargetEftVersion);
|
||||||
|
|
||||||
|
string sourcePrepPath = Path.Join(settings.PrepFolderPath, sourceVersion);
|
||||||
|
|
||||||
|
|
||||||
|
//copy source to prep directory
|
||||||
|
AnsiConsole.MarkupLine("[gray]Copying[/] [blue]source[/][gray] to prep area ...[/]");
|
||||||
|
|
||||||
|
FolderCopy sourceCopy = new FolderCopy(sourceBackupPath, sourcePrepPath);
|
||||||
|
|
||||||
|
sourceCopy.Start();
|
||||||
|
|
||||||
|
//copy target to prep directory
|
||||||
|
AnsiConsole.MarkupLine("[gray]Copying[/] [blue]target[/][gray] to prep area ...[/]");
|
||||||
|
|
||||||
|
FolderCopy targetCopy = new FolderCopy(targetBackupPath, targetPrepPath);
|
||||||
|
|
||||||
|
targetCopy.Start();
|
||||||
|
|
||||||
|
// clean prep source and target folders of uneeded data
|
||||||
|
FolderCleaner.Clean(sourcePrepPath);
|
||||||
|
|
||||||
|
FolderCleaner.Clean(targetPrepPath);
|
||||||
|
|
||||||
|
// start patcher
|
||||||
|
if(File.Exists(settings.PatcherEXEPath))
|
||||||
|
{
|
||||||
|
string patcherOutputName = $"Patcher_{sourceVersion}_to_{settings.TargetEftVersion}";
|
||||||
|
|
||||||
|
AnsiConsole.Markup("Starting patcher ... ");
|
||||||
|
|
||||||
|
Process.Start(new ProcessStartInfo()
|
||||||
|
{
|
||||||
|
FileName = settings.PatcherEXEPath,
|
||||||
|
WorkingDirectory = new FileInfo(settings.PatcherEXEPath).Directory?.FullName ?? Directory.GetCurrentDirectory(),
|
||||||
|
ArgumentList = {$"OutputFolderName::{patcherOutputName}", $"SourceFolderPath::{sourcePrepPath}", $"TargetFolderPath::{targetPrepPath}", $"AutoZip::{settings.AutoZip}"}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
AnsiConsole.MarkupLine("[green]done[/]");
|
||||||
|
|
||||||
|
AnsiConsole.WriteLine();
|
||||||
|
|
||||||
|
// done
|
||||||
|
AnsiConsole.MarkupLine("Press [blue]Enter[/] to close ...");
|
||||||
|
|
||||||
|
Console.ReadLine();
|
62
EftPatchHelper/EftPatchHelper/Settings.cs
Normal file
62
EftPatchHelper/EftPatchHelper/Settings.cs
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
using System.Text.Json;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
|
namespace EftPatchHelper
|
||||||
|
{
|
||||||
|
public class Settings
|
||||||
|
{
|
||||||
|
[JsonIgnore]
|
||||||
|
public static string settingsFile = Path.Join(Directory.GetCurrentDirectory(), "settings.json");
|
||||||
|
|
||||||
|
[JsonPropertyName("target_eft_version")]
|
||||||
|
public string TargetEftVersion { get; set; } = "";
|
||||||
|
|
||||||
|
[JsonPropertyName("prep_folder_path")]
|
||||||
|
public string PrepFolderPath { get; set; } = "";
|
||||||
|
|
||||||
|
[JsonPropertyName("backup_folder_path")]
|
||||||
|
public string BackupFolderPath { get; set; } = "";
|
||||||
|
|
||||||
|
[JsonPropertyName("live_eft_path")]
|
||||||
|
public string LiveEftPath { get; set; } = "";
|
||||||
|
|
||||||
|
[JsonPropertyName("auto_zip")]
|
||||||
|
public bool AutoZip { get; set; } = true;
|
||||||
|
|
||||||
|
[JsonPropertyName("patcher_exe_path")]
|
||||||
|
public string PatcherEXEPath { get; set; } = "";
|
||||||
|
|
||||||
|
public void Save()
|
||||||
|
{
|
||||||
|
string json = JsonSerializer.Serialize(this, typeof(Settings), new JsonSerializerOptions() { WriteIndented = true });
|
||||||
|
|
||||||
|
if (string.IsNullOrWhiteSpace(json)) return;
|
||||||
|
|
||||||
|
File.WriteAllText(settingsFile, json);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Settings? Load()
|
||||||
|
{
|
||||||
|
if (!File.Exists(settingsFile)) return null;
|
||||||
|
|
||||||
|
string json = File.ReadAllText(settingsFile);
|
||||||
|
|
||||||
|
return JsonSerializer.Deserialize<Settings>(json);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Validate()
|
||||||
|
{
|
||||||
|
if(string.IsNullOrWhiteSpace(TargetEftVersion)) return false;
|
||||||
|
|
||||||
|
if(string.IsNullOrWhiteSpace(PrepFolderPath)) return false;
|
||||||
|
|
||||||
|
if(string.IsNullOrWhiteSpace(BackupFolderPath)) return false;
|
||||||
|
|
||||||
|
if(string.IsNullOrWhiteSpace(LiveEftPath)) return false;
|
||||||
|
|
||||||
|
if(string.IsNullOrWhiteSpace(PatcherEXEPath)) return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user