diff --git a/minecraft-launcher-client/Network.cs b/minecraft-launcher-client/Network.cs index b7fb0b2..6dd7469 100644 --- a/minecraft-launcher-client/Network.cs +++ b/minecraft-launcher-client/Network.cs @@ -1,4 +1,5 @@ -using System.Net; +using System; +using System.Net; using System.Net.Sockets; using System.Threading; using DTLib; @@ -7,6 +8,7 @@ using DTLib.Extensions; using DTLib.Filesystem; using DTLib.Logging; using DTLib.Network; +using DTLib.XXHash; using static launcher_client.Launcher; namespace launcher_client; @@ -57,15 +59,26 @@ public class Network string manifestContent = Fsp.DownloadFileToMemory(manifestPath).BytesToString(); Logger.LogDebug(nameof(Network), manifestContent); var manifest = new DtsodV23(manifestContent); - var hasher = new Hasher(); foreach (var fileOnServerData in manifest) { IOPath fileOnClient = Path.Concat(dirOnClient, fileOnServerData.Key); - if (!File.Exists(fileOnClient) || (overwrite && hasher.HashFile(fileOnClient).HashToString() != fileOnServerData.Value)) + if (!File.Exists(fileOnClient)) { Logger.LogDebug(nameof(Network), $"downloading {fileOnClient}"); Fsp.DownloadFile(Path.Concat(dirOnServer, fileOnServerData.Key), fileOnClient); } + else if (overwrite) + { + var fileStream = File.OpenRead(fileOnClient); + ulong hash = xxHash64.ComputeHash(fileStream); + fileStream.Close(); + string hashStr = BitConverter.GetBytes(hash).HashToString(); + if (hashStr != fileOnServerData.Value) + { + Logger.LogDebug(nameof(Network), $"downloading {fileOnClient} (hash {hashStr} != {fileOnServerData.Value})"); + Fsp.DownloadFile(Path.Concat(dirOnServer, fileOnServerData.Key), fileOnClient); + } + } } // удаление лишних файлов if (delete_excess) diff --git a/minecraft-launcher-client/launcher-client.csproj b/minecraft-launcher-client/launcher-client.csproj index 41812ab..49b8cee 100644 --- a/minecraft-launcher-client/launcher-client.csproj +++ b/minecraft-launcher-client/launcher-client.csproj @@ -23,8 +23,9 @@ all - - - + + + + \ No newline at end of file diff --git a/minecraft-launcher-server/Manifests.cs b/minecraft-launcher-server/Manifests.cs index 540810c..ca3c709 100644 --- a/minecraft-launcher-server/Manifests.cs +++ b/minecraft-launcher-server/Manifests.cs @@ -1,8 +1,5 @@ using System.Linq; -using System.Text; -using DTLib; -using DTLib.Extensions; -using DTLib.Filesystem; +using DTLib.XXHash; using static launcher_server.Server; namespace launcher_server; @@ -20,7 +17,6 @@ public static class Manifests } StringBuilder manifestBuilder = new(); - Hasher hasher = new(); var manifestPath = Path.Concat(dir, "manifest.dtsod"); if (Directory.GetFiles(dir).Contains(manifestPath)) File.Delete(manifestPath); @@ -29,8 +25,11 @@ public static class Manifests var fileRelative = fileInDir.RemoveBase(dir); manifestBuilder.Append(fileRelative); manifestBuilder.Append(": \""); - byte[] hash = hasher.HashFile(Path.Concat(fileInDir)); - manifestBuilder.Append(hash.HashToString()); + var fileStream = File.OpenRead(fileInDir); + ulong hash = xxHash64.ComputeHash(fileStream); + fileStream.Close(); + string hashStr = BitConverter.GetBytes(hash).HashToString(); + manifestBuilder.Append(hashStr); manifestBuilder.Append("\";\n"); } File.WriteAllText(manifestPath, manifestBuilder.ToString().Replace('\\','/')); @@ -59,7 +58,7 @@ public static class Manifests } dirlist_content_builder .Append("\t\"") - .Append(dirs[dirs.Length-1].RemoveBase(sync_and_remove_dir).Str.Replace('\\','/')) + .Append(dirs[^1].RemoveBase(sync_and_remove_dir).Str.Replace('\\','/')) .Append("\"\n"); dirlist_content_builder.Append("];"); diff --git a/minecraft-launcher-server/launcher-server.csproj b/minecraft-launcher-server/launcher-server.csproj index a047f49..e8c12f9 100644 --- a/minecraft-launcher-server/launcher-server.csproj +++ b/minecraft-launcher-server/launcher-server.csproj @@ -12,8 +12,9 @@ true - - - + + + + \ No newline at end of file