diff --git a/Bloxstrap/Bootstrapper.cs b/Bloxstrap/Bootstrapper.cs index 303190e..1267026 100644 --- a/Bloxstrap/Bootstrapper.cs +++ b/Bloxstrap/Bootstrapper.cs @@ -60,6 +60,7 @@ namespace Bloxstrap private string _latestVersionGuid = null!; private PackageManifest _versionPackageManifest = null!; + private FileManifest _versionFileManifest = null!; private string _versionFolder = null!; private bool _isInstalling = false; @@ -262,6 +263,7 @@ namespace Bloxstrap _latestVersionGuid = clientVersion.VersionGuid; _versionFolder = Path.Combine(Paths.Versions, _latestVersionGuid); _versionPackageManifest = await PackageManifest.Get(_latestVersionGuid); + _versionFileManifest = await FileManifest.Get(_latestVersionGuid); } private async Task StartRoblox() @@ -1402,6 +1404,16 @@ namespace Bloxstrap if (directory is not null) Directory.CreateDirectory(directory); + if (File.Exists(extractPath)) + { + var fileManifest = _versionFileManifest.FirstOrDefault(x => x.Name == Path.Combine(PackageDirectories[package.Name], entry.FullName)); + + if (fileManifest is not null && MD5Hash.FromFile(extractPath) == fileManifest.Signature) + continue; + + File.Delete(extractPath); + } + entry.ExtractToFile(extractPath, true); } diff --git a/Bloxstrap/GlobalUsings.cs b/Bloxstrap/GlobalUsings.cs index 105c8d9..15c873c 100644 --- a/Bloxstrap/GlobalUsings.cs +++ b/Bloxstrap/GlobalUsings.cs @@ -18,8 +18,9 @@ global using Bloxstrap.Enums; global using Bloxstrap.Exceptions; global using Bloxstrap.Extensions; global using Bloxstrap.Models; -global using Bloxstrap.Models.BloxstrapRPC; global using Bloxstrap.Models.Attributes; +global using Bloxstrap.Models.BloxstrapRPC; global using Bloxstrap.Models.RobloxApi; +global using Bloxstrap.Models.Manifest; global using Bloxstrap.UI; global using Bloxstrap.Utility; \ No newline at end of file diff --git a/Bloxstrap/Models/Manifest/FileManifest.cs b/Bloxstrap/Models/Manifest/FileManifest.cs new file mode 100644 index 0000000..904f1ec --- /dev/null +++ b/Bloxstrap/Models/Manifest/FileManifest.cs @@ -0,0 +1,33 @@ +namespace Bloxstrap.Models.Manifest +{ + public class FileManifest : List + { + private FileManifest(string data) + { + using StringReader reader = new StringReader(data); + + while (true) + { + string? fileName = reader.ReadLine(); + string? signature = reader.ReadLine(); + + if (string.IsNullOrEmpty(fileName) || string.IsNullOrEmpty(signature)) + break; + + Add(new ManifestFile + { + Name = fileName, + Signature = signature + }); + } + } + + public static async Task Get(string versionGuid) + { + string pkgManifestUrl = RobloxDeployment.GetLocation($"/{versionGuid}-rbxManifest.txt"); + var pkgManifestData = await App.HttpClient.GetStringAsync(pkgManifestUrl); + + return new FileManifest(pkgManifestData); + } + } +} diff --git a/Bloxstrap/Models/Manifest/ManifestFile.cs b/Bloxstrap/Models/Manifest/ManifestFile.cs new file mode 100644 index 0000000..71b1976 --- /dev/null +++ b/Bloxstrap/Models/Manifest/ManifestFile.cs @@ -0,0 +1,13 @@ +namespace Bloxstrap.Models.Manifest +{ + public class ManifestFile + { + public string Name { get; set; } = ""; + public string Signature { get; set; } = ""; + + public override string ToString() + { + return $"[{Signature}] {Name}"; + } + } +} diff --git a/Bloxstrap/Models/Package.cs b/Bloxstrap/Models/Manifest/Package.cs similarity index 92% rename from Bloxstrap/Models/Package.cs rename to Bloxstrap/Models/Manifest/Package.cs index 8b6be56..6feb162 100644 --- a/Bloxstrap/Models/Package.cs +++ b/Bloxstrap/Models/Manifest/Package.cs @@ -4,7 +4,7 @@ * Copyright (c) 2015-present MaximumADHD */ -namespace Bloxstrap.Models +namespace Bloxstrap.Models.Manifest { public class Package { diff --git a/Bloxstrap/Models/PackageManifest.cs b/Bloxstrap/Models/Manifest/PackageManifest.cs similarity index 98% rename from Bloxstrap/Models/PackageManifest.cs rename to Bloxstrap/Models/Manifest/PackageManifest.cs index 4d7c3a1..13c7172 100644 --- a/Bloxstrap/Models/PackageManifest.cs +++ b/Bloxstrap/Models/Manifest/PackageManifest.cs @@ -4,7 +4,7 @@ * Copyright (c) 2015-present MaximumADHD */ -namespace Bloxstrap.Models +namespace Bloxstrap.Models.Manifest { public class PackageManifest : List {