diff --git a/Updater/Argumets.cs b/Updater/Argumets.cs index 00f3854..fec8492 100755 --- a/Updater/Argumets.cs +++ b/Updater/Argumets.cs @@ -4,7 +4,6 @@ namespace Updater; public record Argumets { - public string? Updater { get; set; } = null!; public string Process { get; set; } = default!; private string? l = null; @@ -22,7 +21,6 @@ public record Argumets { get { - if (Updater is not null) return "Updater"; return d; } set @@ -57,8 +55,7 @@ public record Argumets { get { - if (goodarg(Branch) && Updater is null) return $"&branch={Branch}"; - if (Updater is not null) return $"&branch=Master"; + if (goodarg(Branch)) return $"&branch={Branch}"; return ""; } } @@ -83,7 +80,6 @@ public record Argumets remp.Add(val); } - if (goodarg(Updater)) addarg(nameof(Updater), Updater!); if (goodarg(Process)) addarg(nameof(Process), Process!); if (goodarg(Branch)) addarg(nameof(Branch), Branch!); if (goodarg(RemoteDirectory)) addarg(nameof(RemoteDirectory), RemoteDirectory!); @@ -100,8 +96,7 @@ public record Argumets return (goodarg(Process) && goodarg(RemoteDirectory) && - goodarg(LocalDirectory)) || - goodarg(Updater); + goodarg(LocalDirectory)); } private bool goodarg(string? arg) diff --git a/Updater/NewUpdater.cs b/Updater/NewUpdater.cs index 2a0863d..3b53862 100644 --- a/Updater/NewUpdater.cs +++ b/Updater/NewUpdater.cs @@ -2,7 +2,6 @@ using System.ComponentModel; using System.Diagnostics; using System.Net; using System.Reflection; -using System.Text.Json; using GraphicsManager; using GraphicsManager.Enums; using GraphicsManager.Objects; @@ -26,8 +25,8 @@ public class NewUpdater : FPSWindow public NewUpdater(NativeWindowSettings nws, GameWindowSettings gws, Argumets args) :base(nws, gws) { - base.ShowMissingChar = false; - base.LogFrames = false; + ShowMissingChar = false; + LogFrames = false; Speed = new() { Interval = 500 @@ -63,7 +62,6 @@ public class NewUpdater : FPSWindow InnerShader = Rectangle.DefaultAlphaShader[Context] }); - fi.PixelHeight = (uint)WallDistance; Controls.Add(Total_Downloaded = new(fi) { @@ -107,23 +105,11 @@ public class NewUpdater : FPSWindow Download.DoWork += Download_DoWork; Download.RunWorkerCompleted += Download_RunWorkerCompleted; Download.WorkerReportsProgress = true; - Invoke(new Action(() => { Download.RunWorkerAsync(); })); + Invoke(Download.RunWorkerAsync); Speed.Start(); - - - - Controls.Add(new Label(fi) - { - Location = new(10,10), - Text = FloatToInt(-0.11304348f, true).ToString() + " / " - + FloatToInt(-0.133858263f, true).ToString() + " / " - + FloatToInt(-0.314960629f, true).ToString() + " / " - + FloatToInt(-0.341389941f, true).ToString() + " / " - + FloatToInt(-0.5748032f, true).ToString() - }); } - private ulong last = 0; + private ulong last; private void Speed_Elapsed(object? sender, System.Timers.ElapsedEventArgs e) { @@ -133,19 +119,14 @@ public class NewUpdater : FPSWindow last = TotalProgress.ProgressValue; speeds.Add(BytesPertenthSec * 2); if (speeds.Count > 25) speeds.RemoveAt(0); - //Debug.WriteLine($"l: {last}"); - //Debug.WriteLine($"bps: {BytesPertenthSec}"); if (Transfer_Speed is not null && speeds.Average() != 0) Transfer_Speed.Text = Download_Speed_Neat(speeds.Average()); } - private bool ran = true; private void Download_DoWork(object? sender, DoWorkEventArgs e) { try { - ChangeProcessText("Deleting old program files"); - void TryDeleteDir(string? dir) { if (string.IsNullOrEmpty(dir) || string.IsNullOrWhiteSpace(dir)) return; @@ -162,7 +143,10 @@ public class NewUpdater : FPSWindow { file.Delete(); } - catch { } + catch + { + // ignored + } } foreach (var subdir in dirInfo.GetDirectories()) { @@ -172,64 +156,43 @@ public class NewUpdater : FPSWindow } TryDeleteDir(Argumets.LocalDirectory); Directory.CreateDirectory(Argumets.LocalDirectory); - if (Argumets.Updater is not null) TryDeleteDir(Argumets.Updater); - if (Argumets.Updater is not null) Directory.CreateDirectory(Argumets.Updater); - - #pragma warning disable SYSLIB0014 // Type or member is obsolete - using WebClient webPre = new(); - #pragma warning restore SYSLIB0014 // Type or member is obsolete - ChangeProcessText("Getting update info"); - string pp = - $"https://{Handler.Domain}/Updater/Files?directory={Argumets.RemoteDirectory}{Argumets.UriBranch}{Argumets.UriSeflContaind}{Argumets.UriPlatform}{Argumets.UriVersion}"; - string rem = webPre.DownloadString($"https://{Handler.Domain}/Updater/Files?directory={Argumets.RemoteDirectory}{Argumets.UriBranch}{Argumets.UriSeflContaind}{Argumets.UriPlatform}{Argumets.UriVersion}"); - //string uri; + try { - ulong realmax = ulong.Parse(webPre.DownloadString($"https://{Handler.Domain}/Updater/GetSize?directory={Argumets.RemoteDirectory}{Argumets.UriBranch}{Argumets.UriSeflContaind}{Argumets.UriPlatform}{Argumets.UriVersion}")); - TotalProgress.MaxProgressValue = realmax; - Console.WriteLine(TotalProgress.MaxProgressValue); - string[] files = rem.Split('\n'); - int c = -1; - - Tuple, Label, int> getpb() + HttpClient client = new(); + + Task files_pre = client.GetStringAsync($"https://{Handler.Domain}/Updater/Files?directory={Argumets.RemoteDirectory}{Argumets.UriBranch}{Argumets.UriSeflContaind}{Argumets.UriPlatform}{Argumets.UriVersion}"); + Task max_pre = client.GetStringAsync( + $"https://{Handler.Domain}/Updater/GetSize?directory={Argumets.RemoteDirectory}{Argumets.UriBranch}{Argumets.UriSeflContaind}{Argumets.UriPlatform}{Argumets.UriVersion}"); + max_pre.Wait(); + TotalProgress.MaxProgressValue = ulong.Parse(max_pre.Result); + files_pre.Wait(); + string[] files = files_pre.Result.Split('\n'); + Queue IndexesWaiting = new(); + for (int i = 0; i < cf.Format.DownloadThreads; i++) { - c++; - if (c == ProgressThreads.Count) c = 0; - return ProgressThreads[c]; + IndexesWaiting.Enqueue(i); } - _ = Parallel.ForEach(files, new ParallelOptions() {MaxDegreeOfParallelism = cf.Format.DownloadThreads},file => - { -#pragma warning disable SYSLIB0014 // Type or member is obsolete - using WebClient web = new(); -#pragma warning restore SYSLIB0014 // Type or member is obsolete - - if (string.IsNullOrEmpty(file)) return; - string uri = $"https://{Handler.Domain}/Updater/GetFileSize?directory={Argumets.RemoteDirectory}{Argumets.UriBranch}{Argumets.UriVersion}{Argumets.UriSeflContaind}{Argumets.UriPlatform}&file={file}"; - Uri u = new($"https://{Handler.Domain}/Updater/GetFile?directory={Argumets.RemoteDirectory}{Argumets.UriBranch}{Argumets.UriVersion}{Argumets.UriSeflContaind}{Argumets.UriPlatform}&file={file}"); - string[] temp = file.Split('/'); - if (file.Contains('/')) + _ = Parallel.ForEach(files, new ParallelOptions() { MaxDegreeOfParallelism = cf.Format.DownloadThreads }, + file => { - - string cur = ""; - for (int i = 0; i < temp.Length - 1; i++) + try { - cur += temp[i] + "/"; - if (Argumets.Updater is null) + int v; + lock (IndexesWaiting) { - if (!Directory.Exists(Argumets.LocalDirectory + cur)) - Directory.CreateDirectory(Argumets.LocalDirectory + cur); - } - else - { - if (!Directory.Exists(Argumets.Updater + cur)) - Directory.CreateDirectory(Argumets.Updater + cur); + v = IndexesWaiting.Dequeue(); } + Tuple, Label, int> pb = ProgressThreads[v]; + StartDownloadForFile(file, pb.Item1, pb.Item2).Wait(); + IndexesWaiting.Enqueue(v); + } + catch (Exception exception) + { + Console.WriteLine(exception); } } - - - DownloadFile(getpb(), web, uri, u, temp, file.Replace("/", Handler.Slash)).Wait(); - }); + ); } catch (Exception ex) { @@ -248,55 +211,66 @@ public class NewUpdater : FPSWindow throw; } } - - - private Task DownloadFile(Tuple, Label, int> pb, WebClient web, string uri, Uri u, string[] temp, string file) + + private async Task StartDownloadForFile(string file, ProgressBar pb, Label pbLabel) { - while (!web.IsBusy) + if (string.IsNullOrWhiteSpace(file)) return; + string[] temp = file.Split('/'); + if (file.Contains('/')) { - - string a = web.DownloadString(uri); - pb.Item1.MaxProgressValue = ulong.Parse(a); - pb.Item1.ProgressValue = 0; - web.DownloadProgressChanged += (sender, args) => + string cur = ""; + for (int i = 0; i < temp.Length - 1; i++) { - ulong tmp = (ulong)args.BytesReceived - pb.Item1.ProgressValue; - TotalProgress.ProgressValue += tmp; - - pb.Item1.ProgressValue = (ulong)args.BytesReceived; - if (ran) - { - ran = false; - Invoke( () => - { - Total_Downloaded!.Text = - $"Downloaded {TotalDownloadAmountNeat(TotalProgress.ProgressValue)}"; - ran = true; - }); - } - }; + cur = Path.Join(cur, temp[i]); + if (!Directory.Exists(Path.Join(Argumets.LocalDirectory, cur))) + Directory.CreateDirectory(Path.Join(Argumets.LocalDirectory, cur)); + } + } + using HttpClient client = new(); + string max = await client.GetStringAsync($"https://{Handler.Domain}/Updater/GetFileSize?directory={Argumets.RemoteDirectory}{Argumets.UriBranch}{Argumets.UriVersion}{Argumets.UriSeflContaind}{Argumets.UriPlatform}&file={file}"); + Invoke(() => + { + pb.ProgressValue = 0; + pb.MaxProgressValue = ulong.Parse(max); string s = $"Downloading {temp[^1]}"; - ChangeProcessText(s); try { - pb.Item2.Text = s; + pbLabel.Text = s; } catch (Exception e) { Console.WriteLine(e); } - if (Argumets.Updater is null) - { - web.DownloadFileTaskAsync(u, Path.Combine(Argumets.LocalDirectory, file)).Wait(); - } - else - { - web.DownloadFileTaskAsync(u, Path.Combine(Argumets.Updater, file)).Wait(); - } + }); + await DownloadFileAsync(pb, + $"https://{Handler.Domain}/Updater/GetFile?directory={Argumets.RemoteDirectory}{Argumets.UriBranch}{Argumets.UriVersion}{Argumets.UriSeflContaind}{Argumets.UriPlatform}&file={file}", + file.Replace("/", Handler.Slash)); + } + + private async Task DownloadFileAsync(ProgressBar progressBar, string url, string destinationPath) + { + using (HttpClient client = new HttpClient()) + using (HttpResponseMessage response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead)) + { + response.EnsureSuccessStatusCode(); - return Task.CompletedTask; + + using (var contentStream = await response.Content.ReadAsStreamAsync()) + using (var fileStream = new FileStream(Path.Join(Argumets.LocalDirectory, destinationPath), FileMode.Create, FileAccess.Write, FileShare.None, 8192, true)) + { + var buffer = new byte[8192]; + long totalRead = 0; + int bytesRead; + + while ((bytesRead = await contentStream.ReadAsync(buffer, 0, buffer.Length)) > 0) + { + await fileStream.WriteAsync(buffer, 0, bytesRead); + totalRead += bytesRead; + TotalProgress.ProgressValue += (ulong)bytesRead; + progressBar.ProgressValue = (ulong)totalRead; + } + } } - return Task.CompletedTask; } private void Download_RunWorkerCompleted(object? sender, RunWorkerCompletedEventArgs e) @@ -311,12 +285,6 @@ public class NewUpdater : FPSWindow } } - private void ChangeProcessText(string Process) - { - Console.WriteLine(Process); - //queue.Enqueue(new Action(() => { if (Current_Process is not null) Current_Process.Text = $"{Process}"; })); - } - #region Neat private string Download_Speed_Neat(double Number) {