bump, now checks against json from repo to download patcher and zip if needed

This commit is contained in:
CWX 2022-05-30 13:04:54 +01:00
parent 43098c7578
commit a3bbb4756b
4 changed files with 162 additions and 95 deletions

View File

@ -2,9 +2,7 @@
using SPT_AKI_Installer.Aki.Helper; using SPT_AKI_Installer.Aki.Helper;
using System; using System;
using System.IO; using System.IO;
using System.Net.Http; using System.Threading;
using System.Threading.Tasks;
using Newtonsoft.Json;
namespace SPT_AKI_Installer.Aki.Core namespace SPT_AKI_Installer.Aki.Core
{ {
@ -14,29 +12,20 @@ namespace SPT_AKI_Installer.Aki.Core
public static class SPTinstaller public static class SPTinstaller
{ {
private static string akiLink;
private static string patcherLink;
static void Main() static void Main()
{ {
string targetPath = Environment.CurrentDirectory; string targetPath = Environment.CurrentDirectory;
#if DEBUG #if DEBUG
targetPath = @"D:\install"; targetPath = @"D:\install";
#endif #endif
_ = DownloadFileAsync(targetPath, "https://dev.sp-tarkov.com/api/v1/repos/CWX/Installer_Test/raw/ClientVersions.json", "/ClientVersions.json");
Console.ReadKey();
ReadJson(targetPath);
Console.ReadKey();
_ = DownloadFileAsync(targetPath, akiLink, "/RELEASE-SPT-2.3.1-17349.zip");
Console.ReadKey();
_ = DownloadFileAsync(targetPath, patcherLink, "/Patcher_12.12.15.18103_to_12.12.15.17349.zip");
Console.ReadKey();
SpectreHelper.Figlet("SPT-AKI INSTALLER", Color.Yellow); SpectreHelper.Figlet("SPT-AKI INSTALLER", Color.Yellow);
PreCheckHelper.GameCheck(out string originalGamePath); PreCheckHelper.GameCheck(out string originalGamePath);
PreCheckHelper.DetectOriginalGameVersion(originalGamePath);
if (originalGamePath == null)
{
CloseApp("Unable to find EFT OG directory! \n please make sure EFT is installed! \n please also run EFT once!");
}
if (originalGamePath == targetPath) if (originalGamePath == targetPath)
{ {
@ -44,42 +33,96 @@ namespace SPT_AKI_Installer.Aki.Core
} }
var checkForExistingFiles = FileHelper.FindFile(targetPath, "EscapeFromTarkov.exe"); var checkForExistingFiles = FileHelper.FindFile(targetPath, "EscapeFromTarkov.exe");
//Console.WriteLine(checkForExistingFiles ?? "null");
if (checkForExistingFiles != null) if (checkForExistingFiles != null)
{ {
CloseApp("Installer is located in a Folder that has existing Game Files \n Please make sure the installer is in a fresh folder as per the guide"); CloseApp("Installer is located in a Folder that has existing Game Files \n Please make sure the installer is in a fresh folder as per the guide");
} }
//Console.ReadKey();
LogHelper.User("We need to download files during this installation.");
LogHelper.User("Are you ok with this? type yes or no");
var userReponse = Console.ReadLine();
while (!string.Equals(userReponse, "yes", StringComparison.OrdinalIgnoreCase) &&
!string.Equals(userReponse, "no", StringComparison.OrdinalIgnoreCase))
{
LogHelper.Warning("Response was not yes or no, please respond with yes or no");
userReponse = Console.ReadLine();
}
if (string.Equals(userReponse, "no", StringComparison.OrdinalIgnoreCase))
{
CloseApp("you selected no, we need to download this to continue with auto installation \n Press enter to close the app");
}
LogHelper.Info("Downloading ClientVersions.json...");
var jsonDownload = DownloadHelper.DownloadFileAsync(targetPath, "https://dev.sp-tarkov.com/api/v1/repos/CWX/Installer_Test/raw/ClientVersions.json", "/ClientVersions.json");
while (jsonDownload.Status != System.Threading.Tasks.TaskStatus.RanToCompletion)
{
}
//Thread.Sleep(3000);
LogHelper.Info("Downloading Complete, Checking Versions!");
DownloadHelper.ReadJson(targetPath);
LogHelper.Info($"Original game path detected, Game version: { DownloadHelper.ogClient } Detected");
LogHelper.Info($"TargetClient version for this Game version is: { DownloadHelper.targetClient }");
if (string.Equals(DownloadHelper.patchNeedCheck, "true", StringComparison.OrdinalIgnoreCase))
{
LogHelper.Info("Patching IS required!");
}
if (string.Equals(DownloadHelper.patchNeedCheck, "false", StringComparison.OrdinalIgnoreCase))
{
LogHelper.Info("Patching is not required!");
}
LogHelper.Info($"TargetAki version for this GameVersion is { DownloadHelper.targetAki }");
LogHelper.Info("Checking if Zips already exist in directory");
PreCheckHelper.PatcherZipCheck(originalGamePath, targetPath, out string patcherZipPath); PreCheckHelper.PatcherZipCheck(originalGamePath, targetPath, out string patcherZipPath);
PreCheckHelper.AkiZipCheck(targetPath, out string akiZipPath); PreCheckHelper.AkiZipCheck(targetPath, out string akiZipPath);
if (patcherZipPath == null && PreCheckHelper.PatcherNeededCheck()) if (patcherZipPath == null && string.Equals(DownloadHelper.patchNeedCheck, "true", StringComparison.OrdinalIgnoreCase))
{ {
CloseApp("Game Version needs to be patched to match Aki Version \n but Patcher is missing or the wrong version \n Press enter to close the app"); LogHelper.Info("Unable to find Patcher Zip in Directory");
LogHelper.Info("Downloading Patcher Zip now!");
var task = DownloadHelper.DownloadFileAsync(targetPath, DownloadHelper.patcherLink, "/PATCHER.zip");
while(task.Status != System.Threading.Tasks.TaskStatus.RanToCompletion)
{
}
LogHelper.Info("Download Complete!");
}
else if (string.Equals(DownloadHelper.patchNeedCheck, "false", StringComparison.OrdinalIgnoreCase))
{
LogHelper.Info("Did not check for Patcher as its not needed");
} }
if (akiZipPath == null) if (akiZipPath == null)
{ {
CloseApp("Aki's Zip could not be found \n Press enter to close the app"); LogHelper.Info("Unable to find Aki Zip in Directory");
LogHelper.Info("Downloading Aki Zip now!");
var task = DownloadHelper.DownloadFileAsync(targetPath, DownloadHelper.akiLink, "/AKI.zip");
while (task.Status != System.Threading.Tasks.TaskStatus.RanToCompletion)
{
}
LogHelper.Info("Download Complete!");
} }
LogHelper.Info("Ready to continue with installation");
Console.ReadKey();
if (PreCheckHelper.PatcherNeededCheck() && !PreCheckHelper.PatcherAkiCheck()) PreCheckHelper.PatcherZipCheck(originalGamePath, targetPath, out patcherZipPath);
{ PreCheckHelper.AkiZipCheck(targetPath, out akiZipPath);
CloseApp("Patcher does not match downgraded version that Aki Requires \n Press enter to close the app");
}
LogHelper.Info("Copying game files"); LogHelper.Info("Copying game files");
GameCopy(originalGamePath, targetPath); GameCopy(originalGamePath, targetPath);
if (PreCheckHelper.PatcherNeededCheck()) if (string.Equals(DownloadHelper.patchNeedCheck, "true", StringComparison.OrdinalIgnoreCase))
{ {
PatcherCopy(targetPath, patcherZipPath); PatcherCopy(targetPath, patcherZipPath);
PatcherProcess(targetPath); PatcherProcess(targetPath);
} }
AkiInstall(targetPath, akiZipPath); AkiInstall(targetPath, akiZipPath);
DeleteZip(patcherZipPath, akiZipPath); DeleteZip(patcherZipPath, akiZipPath, Path.Join(targetPath, "/ClientVersions.json"));
} }
static void GameCopy(string originalGamePath, string targetPath) static void GameCopy(string originalGamePath, string targetPath)
@ -121,10 +164,11 @@ namespace SPT_AKI_Installer.Aki.Core
LogHelper.Info("Aki has been extracted"); LogHelper.Info("Aki has been extracted");
} }
static void DeleteZip(string patcherZipPath, string akiZipPath) static void DeleteZip(string patcherZipPath, string akiZipPath, string versionJson)
{ {
FileHelper.DeleteFiles(patcherZipPath, false); FileHelper.DeleteFiles(patcherZipPath, false);
FileHelper.DeleteFiles(akiZipPath, false); FileHelper.DeleteFiles(akiZipPath, false);
FileHelper.DeleteFiles(versionJson, false);
LogHelper.User("Removed Zips, Press enter to close the installer, you can then delete the installer"); LogHelper.User("Removed Zips, Press enter to close the installer, you can then delete the installer");
LogHelper.User("ENJOY SPT-AKI!"); LogHelper.User("ENJOY SPT-AKI!");
@ -138,37 +182,5 @@ namespace SPT_AKI_Installer.Aki.Core
Console.ReadKey(); Console.ReadKey();
Environment.Exit(0); Environment.Exit(0);
} }
// https://dev.sp-tarkov.com/api/v1/repos/CWX/Installer_Test/raw/ClientVersions.json
// https://dev.sp-tarkov.com/CWX/Installer_Test/src/branch/master/ClientVersions.json
static async Task DownloadFileAsync(string targetFilePath, string targetLink, string newFileName)
{
using (var httpClient = new HttpClient())
{
await httpClient.DownloadFile(targetLink, Path.Join(targetFilePath, newFileName));
}
}
static void ReadJson(string targetPath)
{
var json = FileHelper.FindFile(targetPath, "ClientVersions.json");
var text = File.ReadAllText(json);
dynamic result = JsonConvert.DeserializeObject<object>(text);
akiLink = result.client18103.AKI;
patcherLink = result.client18103.PATCHER;
Console.WriteLine(akiLink);
Console.WriteLine(patcherLink);
}
public static async Task DownloadFile(this HttpClient client, string address, string fileName)
{
using (var response = await client.GetAsync(address))
using (var stream = await response.Content.ReadAsStreamAsync())
using (var file = File.OpenWrite(fileName))
{
stream.CopyTo(file);
}
}
} }
} }

View File

@ -1,12 +1,67 @@
using System; using Newtonsoft.Json;
using System.Collections.Generic; using System;
using System.Linq; using System.IO;
using System.Text; using System.Net.Http;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace SPT_AKI_Installer.Aki.Helper namespace SPT_AKI_Installer.Aki.Helper
{ {
public class DownloadHelper public static class DownloadHelper
{ {
public static string objToFind;
public static string patchNeedCheck;
public static string ogClient;
public static string targetClient;
public static string targetAki;
public static string akiLink;
public static string patcherLink;
// https://dev.sp-tarkov.com/api/v1/repos/CWX/Installer_Test/raw/ClientVersions.json
// https://dev.sp-tarkov.com/CWX/Installer_Test/src/branch/master/ClientVersions.json
public static async Task DownloadFileAsync(string targetFilePath, string targetLink, string newFileName)
{
using (var httpClient = new HttpClient())
{
await httpClient.DownloadFile(targetLink, Path.Join(targetFilePath, newFileName));
}
}
public static void ReadJson(string targetPath)
{
var json = FileHelper.FindFile(targetPath, "ClientVersions.json");
var text = File.ReadAllText(json);
dynamic result = JsonConvert.DeserializeObject<object>(text);
objToFind = "client" + PreCheckHelper.gameVersion;
patchNeedCheck = result[objToFind]?.PATCHNEEDED;
ogClient = result[objToFind]?.OGCLIENT;
targetClient = result[objToFind]?.TARGETCLIENT;
targetAki = result[objToFind]?.TARGETAKI;
akiLink = result[objToFind]?.AKIDOWNLOAD;
patcherLink = result[objToFind]?.PATCHERDOWNLOAD;
if (result[objToFind] == null)
{
LogHelper.Warning("No records found for client version");
LogHelper.Warning("this could be because your client is a version before this installer was made or");
LogHelper.Warning("a new client version has come out, if this is the case, please update to latest or try again later");
LogHelper.Warning("as we need to update the available list of clients.");
LogHelper.Warning("Press enter to close the app!");
Console.ReadKey();
Environment.Exit(0);
}
}
public static async Task DownloadFile(this HttpClient client, string address, string fileName)
{
using (var response = await client.GetAsync(address))
using (var stream = await response.Content.ReadAsStreamAsync())
using (var file = File.OpenWrite(fileName))
{
stream.CopyTo(file);
}
}
} }
} }

View File

@ -74,9 +74,16 @@ namespace SPT_AKI_Installer.Aki.Helper
public static bool FindFolder(string patchRef, string targetPath, out DirectoryInfo dir) public static bool FindFolder(string patchRef, string targetPath, out DirectoryInfo dir)
{ {
var patchInfo = new FileInfo(patchRef); var dirInfo = new DirectoryInfo(targetPath).GetDirectories();
var patchName = patchInfo.Name.Replace(patchInfo.Extension, ""); string patchInner = null;
var path = new DirectoryInfo(Path.Join(targetPath, patchName)); foreach (var file in dirInfo)
{
if (file.FullName.Contains("patcher", StringComparison.OrdinalIgnoreCase))
{
patchInner = file.FullName;
}
}
var path = new DirectoryInfo(patchInner);
if (path.Exists) if (path.Exists)
{ {
dir = path; dir = path;

View File

@ -9,11 +9,10 @@ namespace SPT_AKI_Installer.Aki.Helper
public static class PreCheckHelper public static class PreCheckHelper
{ {
private const string registryInstall = @"Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\EscapeFromTarkov"; private const string registryInstall = @"Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\EscapeFromTarkov";
private static string gameVersion; private static string OGGamePath;
public static string gameVersion;
private static string patchZip; private static string patchZip;
private static string patchToVersion;
private static string akiZip; private static string akiZip;
private static string akiVersion;
public static string DetectOriginalGamePath() public static string DetectOriginalGamePath()
{ {
@ -24,7 +23,9 @@ namespace SPT_AKI_Installer.Aki.Helper
var uninstallStringValue = Registry.LocalMachine.OpenSubKey(registryInstall, false) var uninstallStringValue = Registry.LocalMachine.OpenSubKey(registryInstall, false)
?.GetValue("UninstallString"); ?.GetValue("UninstallString");
var info = (uninstallStringValue is string key) ? new FileInfo(key) : null; var info = (uninstallStringValue is string key) ? new FileInfo(key) : null;
return info?.DirectoryName; OGGamePath = info?.DirectoryName;
return OGGamePath;
} }
public static void GameCheck(out string gamePath) public static void GameCheck(out string gamePath)
@ -41,12 +42,19 @@ namespace SPT_AKI_Installer.Aki.Helper
gamePath = Path; gamePath = Path;
} }
public static void DetectOriginalGameVersion(string gamePath)
{
gameVersion = FileVersionInfo.GetVersionInfo(Path.Join(gamePath + "/EscapeFromTarkov.exe")).ProductVersion.Replace('-', '.').Split('.')[^2];
}
public static void PatcherZipCheck(string gamePath, string targetPath, out string patcherZipPath) public static void PatcherZipCheck(string gamePath, string targetPath, out string patcherZipPath)
{ {
// example patch name - Patcher.12.12.15.17861.to.12.12.15.17349.zip // example patch name - Patcher.12.12.15.17861.to.12.12.15.17349.zip
gameVersion = FileVersionInfo.GetVersionInfo(Path.Join(gamePath + "/EscapeFromTarkov.exe")).ProductVersion.Replace('-', '.').Split('.')[^2];
patchZip = FileHelper.FindFile(targetPath, gameVersion, "Patcher"); patchZip = FileHelper.FindFile(targetPath, gameVersion, "Patcher");
patchToVersion = patchZip?.Split('.')[^2]; if (patchZip == null)
{
patchZip = FileHelper.FindFile(targetPath, "PATCHER");
}
patcherZipPath = patchZip; patcherZipPath = patchZip;
} }
@ -54,26 +62,11 @@ namespace SPT_AKI_Installer.Aki.Helper
{ {
// example aki name - RELEASE-SPT-2.3.1-17349.zip // example aki name - RELEASE-SPT-2.3.1-17349.zip
akiZip = FileHelper.FindFile(targetPath, "SPT", "RELEASE"); akiZip = FileHelper.FindFile(targetPath, "SPT", "RELEASE");
akiVersion = akiZip?.Replace('-', '.').Split('.')[^2]; if (akiZip == null)
{
akiZip = FileHelper.FindFile(targetPath, "AKI");
}
akiZipPath = akiZip; akiZipPath = akiZip;
} }
/// <summary>
/// will return true if Patcher version at the end of the zip matches aki zip version
/// </summary>
/// <returns>bool</returns>
public static bool PatcherAkiCheck()
{
return patchToVersion == akiVersion;
}
/// <summary>
/// will return true if game version is not equal to aki zip version (patcher is needed)
/// </summary>
/// <returns>bool</returns>
public static bool PatcherNeededCheck()
{
return gameVersion != akiVersion;
}
} }
} }