pre atomic total
This commit is contained in:
parent
a4955ef20a
commit
2764601d1a
@ -7,7 +7,7 @@ public class Config
|
||||
{
|
||||
public static ConfigFile MakeFile()
|
||||
{
|
||||
if (!File.Exists(Program.JT + "/Updater/Config/Settings.json"))
|
||||
if (!File.Exists(Handler.JT + "/Updater/Config/Settings.json"))
|
||||
{
|
||||
ConfigFile file = new();
|
||||
file.Format = new Format()
|
||||
@ -51,10 +51,10 @@ public class Config
|
||||
A = 1f
|
||||
}
|
||||
};
|
||||
if (!Directory.Exists(Program.JT)) Directory.CreateDirectory(Program.JT);
|
||||
if (!Directory.Exists(Program.JT + "/Updater")) Directory.CreateDirectory(Program.JT + "/Updater" );
|
||||
if (!Directory.Exists(Program.JT + "/Updater/Config")) Directory.CreateDirectory(Program.JT + "/Updater/Config");
|
||||
FileStream ms = new(Program.JT + "/Updater/Config/Settings.json", FileMode.Create);
|
||||
if (!Directory.Exists(Handler.JT)) Directory.CreateDirectory(Handler.JT);
|
||||
if (!Directory.Exists(Handler.JT + "/Updater")) Directory.CreateDirectory(Handler.JT + "/Updater" );
|
||||
if (!Directory.Exists(Handler.JT + "/Updater/Config")) Directory.CreateDirectory(Handler.JT + "/Updater/Config");
|
||||
FileStream ms = new(Handler.JT + "/Updater/Config/Settings.json", FileMode.Create);
|
||||
JsonSerializer.Serialize(new Utf8JsonWriter(ms),
|
||||
file,
|
||||
ConfigFileContext.Default.ConfigFile);
|
||||
@ -69,7 +69,7 @@ public class Config
|
||||
public static string GetFile()
|
||||
{
|
||||
_ = MakeFile();
|
||||
return File.ReadAllText(Program.JT + "/Updater/Config/Settings.json");
|
||||
return File.ReadAllText(Handler.JT + "/Updater/Config/Settings.json");
|
||||
}
|
||||
|
||||
public static ConfigFile GetConfig()
|
||||
@ -79,14 +79,14 @@ public class Config
|
||||
ConfigFile? temp = JsonSerializer.Deserialize(GetFile(), ConfigFileContext.Default.ConfigFile);
|
||||
if (temp is null)
|
||||
{
|
||||
File.Delete(Program.JT + "/Updater/Config/Settings.json");
|
||||
File.Delete(Handler.JT + "/Updater/Config/Settings.json");
|
||||
temp = MakeFile();
|
||||
}
|
||||
int max = Environment.ProcessorCount * 2;
|
||||
if (temp.Format.DownloadThreads > max)
|
||||
{
|
||||
temp.Format.DownloadThreads = max;
|
||||
FileStream ms = new(Program.JT + "/Updater/Config/Settings.json", FileMode.Create);
|
||||
FileStream ms = new(Handler.JT + "/Updater/Config/Settings.json", FileMode.Create);
|
||||
JsonSerializer.Serialize(new Utf8JsonWriter(ms),
|
||||
temp,
|
||||
ConfigFileContext.Default.ConfigFile);
|
||||
@ -94,7 +94,7 @@ public class Config
|
||||
if (temp.Format.DownloadThreads < 1)
|
||||
{
|
||||
temp.Format.DownloadThreads = 1;
|
||||
FileStream ms = new(Program.JT + "/Updater/Config/Settings.json", FileMode.Create);
|
||||
FileStream ms = new(Handler.JT + "/Updater/Config/Settings.json", FileMode.Create);
|
||||
JsonSerializer.Serialize(new Utf8JsonWriter(ms),
|
||||
temp,
|
||||
ConfigFileContext.Default.ConfigFile);
|
||||
@ -103,7 +103,7 @@ public class Config
|
||||
}
|
||||
catch
|
||||
{
|
||||
File.Delete(Program.JT + "/Updater/Config/Settings.json");
|
||||
File.Delete(Handler.JT + "/Updater/Config/Settings.json");
|
||||
return MakeFile();
|
||||
}
|
||||
}
|
||||
|
130
Updater/Handler.cs
Normal file
130
Updater/Handler.cs
Normal file
@ -0,0 +1,130 @@
|
||||
using System.Diagnostics;
|
||||
using OpenTK.Windowing.Common;
|
||||
using OpenTK.Windowing.Common.Input;
|
||||
using OpenTK.Windowing.Desktop;
|
||||
|
||||
namespace Updater;
|
||||
|
||||
public static class Handler
|
||||
{
|
||||
public static string JT
|
||||
{
|
||||
get
|
||||
{
|
||||
string tmp = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "JacobTech");
|
||||
if (OperatingSystem.IsLinux())
|
||||
{
|
||||
tmp = Path.Combine(Environment.GetEnvironmentVariable("HOME")!, ".config/");
|
||||
tmp += "JacobTech";
|
||||
}
|
||||
return tmp;
|
||||
}
|
||||
}
|
||||
public static string Slash
|
||||
{
|
||||
get
|
||||
{
|
||||
if (OperatingSystem.IsWindows()) return "\\";
|
||||
else return "/";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public const string Domain = "www.JacobTech.com";
|
||||
|
||||
internal static Argumets Argumets { get; } = new();
|
||||
|
||||
internal static readonly NativeWindowSettings Settings = new()
|
||||
{
|
||||
Title = "Updater",
|
||||
WindowBorder = WindowBorder.Fixed,
|
||||
APIVersion = new Version(3, 2),
|
||||
StartFocused = true,
|
||||
Size = new(694, 105)
|
||||
};
|
||||
|
||||
internal static readonly GameWindowSettings GameWindowSettings = new()
|
||||
{
|
||||
UpdateFrequency = 30
|
||||
};
|
||||
|
||||
public const string UpdateArg = "--StartUpdate",
|
||||
PostUpdateArg = "--PostUpdate";
|
||||
|
||||
public static void PreUpdate(string app)
|
||||
{
|
||||
string p = Path.Join(Path.GetTempPath(), Path.GetRandomFileName());
|
||||
if (!Directory.Exists(p)) Directory.CreateDirectory(p);
|
||||
|
||||
void CoppyDir(string path, string dir)
|
||||
{
|
||||
DirectoryInfo DI = new(path);
|
||||
foreach (FileInfo file in DI.GetFiles())
|
||||
{
|
||||
file.CopyTo(Path.Join(dir, file.Name), true);
|
||||
}
|
||||
foreach (DirectoryInfo file in DI.GetDirectories())
|
||||
{
|
||||
Directory.CreateDirectory(Path.Join(dir, file.Name));
|
||||
CoppyDir(file.FullName, Path.Join(dir, file.Name));
|
||||
}
|
||||
}
|
||||
|
||||
CoppyDir(Directory.GetCurrentDirectory(), p);
|
||||
if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() || OperatingSystem.IsFreeBSD())
|
||||
{
|
||||
Process m = Process.Start("/usr/bin/chmod", $"+x \"{Path.Combine(p, app)}\"");
|
||||
m.WaitForExit();
|
||||
}
|
||||
|
||||
Process pp = new Process()
|
||||
{
|
||||
StartInfo = new()
|
||||
{
|
||||
FileName = Path.Join(p, app),
|
||||
WorkingDirectory = p,
|
||||
Arguments = UpdateArg + $" '{Directory.GetCurrentDirectory()}'"
|
||||
}
|
||||
};
|
||||
pp.Start();
|
||||
pp.WaitForExit();
|
||||
}
|
||||
|
||||
public static void StartUpdate(WindowIcon Icon, string App, string RemoteDirectory, string LocalDirectory, string ConfigPath, string Platform, string Branch = "main", bool SelfContained = false, string? ProgramVersion = null)
|
||||
{
|
||||
Argumets.Loc = ConfigPath;
|
||||
Argumets.RemoteDirectory = RemoteDirectory;
|
||||
Argumets.LocalDirectory = LocalDirectory;
|
||||
Argumets.DLL = App;
|
||||
Argumets.Branch = Branch;
|
||||
Argumets.Version = ProgramVersion;
|
||||
Argumets.SeflContaind = SelfContained;
|
||||
Argumets.Platform = Platform;
|
||||
|
||||
//Settings.Icon = Icon;
|
||||
|
||||
NewUpdater NU = new(Settings, GameWindowSettings, Argumets);
|
||||
NU.Run();
|
||||
NU.Close();
|
||||
NU.Dispose();
|
||||
if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() || OperatingSystem.IsFreeBSD())
|
||||
{
|
||||
Process m = Process.Start("/usr/bin/chmod", $"+x \"{Path.Combine(Argumets.LocalDirectory, Argumets.DLL)}\"");
|
||||
m.WaitForExit();
|
||||
}
|
||||
Process.Start(new ProcessStartInfo()
|
||||
{
|
||||
FileName = Path.Combine(Argumets.LocalDirectory, Argumets.DLL),
|
||||
Arguments = PostUpdateArg + $" '{Directory.GetCurrentDirectory()}'",
|
||||
WorkingDirectory = Argumets.LocalDirectory,
|
||||
CreateNoWindow = true,
|
||||
UseShellExecute = true,
|
||||
|
||||
})!.WaitForExit();
|
||||
}
|
||||
|
||||
public static void PostUpdate(string LocalDirectory)
|
||||
{
|
||||
if (Directory.Exists(LocalDirectory)) Directory.Delete(LocalDirectory, true);
|
||||
}
|
||||
}
|
@ -15,9 +15,9 @@ namespace Updater;
|
||||
public class NewUpdater : FPSWindow
|
||||
{
|
||||
private readonly ConfigFile cf;
|
||||
private ProgressBar TotalProgress;
|
||||
private ProgressBar<ulong> TotalProgress;
|
||||
private Argumets Argumets;
|
||||
private List<Tuple<ProgressBar, Label>> ProgressThreads = new();
|
||||
private List<Tuple<ProgressBar<ulong>, Label, int>> ProgressThreads = new();
|
||||
private readonly BackgroundWorker Download = new();
|
||||
private Label? Total_Downloaded, Transfer_Speed;
|
||||
private readonly System.Timers.Timer Speed;
|
||||
@ -26,6 +26,8 @@ public class NewUpdater : FPSWindow
|
||||
public NewUpdater(NativeWindowSettings nws, GameWindowSettings gws, Argumets args)
|
||||
:base(nws, gws)
|
||||
{
|
||||
base.ShowMissingChar = false;
|
||||
base.LogFrames = false;
|
||||
Speed = new()
|
||||
{
|
||||
Interval = 500
|
||||
@ -37,25 +39,24 @@ public class NewUpdater : FPSWindow
|
||||
//small = (uint)Math.Round(0.078740157480315 * StartGUI.Height, 0);
|
||||
//RenderObjects.Add(Transfer_Speed = new RenderText("Download Speed", "OpenSans-Regular", small, -0.9381188f, -0.05263158f, 1.2f, new Vector2(1f, 0f), new Vector4(cf.Colors.Text.R, cf.Colors.Text.G, cf.Colors.Text.B, cf.Colors.Text.A)));
|
||||
|
||||
FontFamily r = FontFamily.LoadFontFamily(Tools.GetResourceStream(Assembly.GetExecutingAssembly(), "Updater.Resource.OpenSans.zip"), "OpenSans").Result;
|
||||
FontFamily r = FontFamily.LoadFontFamily(Tools.GetResourceStream(Assembly.GetExecutingAssembly(), "Updater.Resource.OpenSans.zip"), "OpenSans");
|
||||
FontInteraction fi = FontInteraction.Load(r);
|
||||
cf = Config.GetConfig();
|
||||
|
||||
|
||||
Size = new(cf.Scale(Size.X), cf.Scale(Size.Y));
|
||||
Argumets = args;
|
||||
int WallDistance = cf.Scale(15);
|
||||
BackgroundColor = cf.Colors.Background.ToColor4();
|
||||
|
||||
Texture ProgressbarTexture = TextureManager.AddTexture(File.OpenRead("/home/jacob/Pictures/Progress.png"));
|
||||
Controls.Add(TotalProgress = new ProgressBar(ProgressbarTexture)
|
||||
Controls.Add(TotalProgress = new(ProgressbarTexture)
|
||||
{
|
||||
Location = new(WallDistance, cf.Scale(70), 0),
|
||||
Location = new(WallDistance, cf.Scale(70)),
|
||||
Size = new(Size.X - WallDistance - WallDistance, cf.Scale(20)),
|
||||
BackgroundColor = cf.Colors.Progress_bars.Backcolor.ToColor4(),
|
||||
ProgressColor = cf.Colors.Progress_bars.Fillcolor.ToColor4(),
|
||||
ProgressValue = 5,
|
||||
ProgressGap = (uint)cf.Scale(3),
|
||||
ProgressGap = new(cf.Scale(3)),
|
||||
Shader = Rectangle.DefaultAlphaShader[Context],
|
||||
TextureDisplay = TextureDisplay.ProgressHorizontalCenter,
|
||||
UpdateOnDraw = true,
|
||||
@ -67,28 +68,28 @@ public class NewUpdater : FPSWindow
|
||||
Controls.Add(Total_Downloaded = new(fi)
|
||||
{
|
||||
Text = "D",
|
||||
Location = new((int)FloatToInt(-0.9381188f), (int)FloatToInt(0.149797574f + 0.14f, true), 0)
|
||||
Location = new((int)FloatToInt(-0.9381188f), (int)FloatToInt(0.149797574f + 0.14f, true))
|
||||
});
|
||||
Controls.Add(Transfer_Speed = new(fi)
|
||||
{
|
||||
Text = "abcdefghijklmnopqrstuvwxyz",
|
||||
Location = new(Total_Downloaded.Location.X, (int)FloatToInt(-0.05263158f + 0.09f, true), 0)
|
||||
Location = new(Total_Downloaded.Location.X, (int)FloatToInt(-0.05263158f + 0.09f, true))
|
||||
});
|
||||
|
||||
int gap = cf.Scale(10);
|
||||
for (int i = 0; i < cf.Format.DownloadThreads; i++)
|
||||
{
|
||||
ProgressBar temp;
|
||||
ProgressBar<ulong> temp;
|
||||
Size = new(Size.X, Size.Y + gap + TotalProgress.Size.Y);
|
||||
Label l = new(fi)
|
||||
{
|
||||
Color = Color4.Black,
|
||||
Text = "Downloading ...."
|
||||
};
|
||||
l.Location = new(cf.Scale(5), (int)(((TotalProgress.Size.Y - l.TrueHeight) / 2) - fi.PixelHeight + l.PostiveTrueHeight), 0);
|
||||
Controls.Add(temp = new ProgressBar(ProgressbarTexture)
|
||||
l.Location = new(cf.Scale(5), (TotalProgress.Size.Y - l.Size.Y) / 2);
|
||||
Controls.Add(temp = new(ProgressbarTexture)
|
||||
{
|
||||
Location = new(WallDistance, cf.Scale(70) + (TotalProgress.Size.Y * (i + 1)) + (gap * (i + 1)), 0),
|
||||
Location = new(WallDistance, cf.Scale(70) + (TotalProgress.Size.Y * (i + 1)) + (gap * (i + 1))),
|
||||
Size = TotalProgress.Size,
|
||||
BackgroundColor = TotalProgress.BackgroundColor,
|
||||
ProgressColor = TotalProgress.ProgressColor,
|
||||
@ -100,7 +101,7 @@ public class NewUpdater : FPSWindow
|
||||
InnerShader = TotalProgress.InnerShader
|
||||
});
|
||||
temp.Controls.Add(l);
|
||||
ProgressThreads.Add(new(temp,l));
|
||||
ProgressThreads.Add(new(temp,l, i));
|
||||
}
|
||||
|
||||
Download.DoWork += Download_DoWork;
|
||||
@ -110,9 +111,10 @@ public class NewUpdater : FPSWindow
|
||||
Speed.Start();
|
||||
|
||||
|
||||
|
||||
Controls.Add(new Label(fi)
|
||||
{
|
||||
Location = new(10,10,0),
|
||||
Location = new(10,10),
|
||||
Text = FloatToInt(-0.11304348f, true).ToString() + " / "
|
||||
+ FloatToInt(-0.133858263f, true).ToString() + " / "
|
||||
+ FloatToInt(-0.314960629f, true).ToString() + " / "
|
||||
@ -122,6 +124,7 @@ public class NewUpdater : FPSWindow
|
||||
}
|
||||
|
||||
private ulong last = 0;
|
||||
Queue<ulong> ProgressQuee = new();
|
||||
|
||||
private void Speed_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)
|
||||
{
|
||||
@ -131,8 +134,13 @@ 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}");
|
||||
//Debug.WriteLine($"l: {last}");
|
||||
//Debug.WriteLine($"bps: {BytesPertenthSec}");
|
||||
for (int i = 0; i < ProgressQuee.Count; i++)
|
||||
{
|
||||
Console.WriteLine(TotalProgress.ProgressValue);
|
||||
TotalProgress.ProgressValue += ProgressQuee.Dequeue();
|
||||
}
|
||||
if (Transfer_Speed is not null && speeds.Average() != 0) Transfer_Speed.Text = Download_Speed_Neat(speeds.Average());
|
||||
}
|
||||
|
||||
@ -142,15 +150,6 @@ public class NewUpdater : FPSWindow
|
||||
{
|
||||
try
|
||||
{
|
||||
bool goodpre = true;
|
||||
while (goodpre)
|
||||
{
|
||||
while (!Program.IsProcessOpen(Argumets.Process))
|
||||
{
|
||||
goodpre = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
ChangeProcessText("Deleting old program files");
|
||||
|
||||
void TryDeleteDir(string? dir)
|
||||
@ -186,17 +185,19 @@ public class NewUpdater : FPSWindow
|
||||
using WebClient webPre = new();
|
||||
#pragma warning restore SYSLIB0014 // Type or member is obsolete
|
||||
ChangeProcessText("Getting update info");
|
||||
string rem = webPre.DownloadString($"https://{Program.Domain}/Updater/Files?directory={Argumets.RemoteDirectory}{Argumets.UriBranch}{Argumets.UriSeflContaind}{Argumets.UriPlatform}{Argumets.UriVersion}");
|
||||
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://{Program.Domain}/Updater/GetSize?directory={Argumets.RemoteDirectory}{Argumets.UriBranch}{Argumets.UriSeflContaind}{Argumets.UriPlatform}{Argumets.UriVersion}"));
|
||||
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<ProgressBar, Label> getpb()
|
||||
Tuple<ProgressBar<ulong>, Label, int> getpb()
|
||||
{
|
||||
c++;
|
||||
if (c == ProgressThreads.Count) c = 0;
|
||||
@ -209,8 +210,8 @@ public class NewUpdater : FPSWindow
|
||||
#pragma warning restore SYSLIB0014 // Type or member is obsolete
|
||||
|
||||
if (string.IsNullOrEmpty(file)) return;
|
||||
string uri = $"https://{Program.Domain}/Updater/GetFileSize?directory={Argumets.RemoteDirectory}{Argumets.UriBranch}{Argumets.UriVersion}{Argumets.UriSeflContaind}{Argumets.UriPlatform}&file={file}";
|
||||
Uri u = new($"https://{Program.Domain}/Updater/GetFile?directory={Argumets.RemoteDirectory}{Argumets.UriBranch}{Argumets.UriVersion}{Argumets.UriSeflContaind}{Argumets.UriPlatform}&file={file}");
|
||||
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('/'))
|
||||
{
|
||||
@ -233,7 +234,7 @@ public class NewUpdater : FPSWindow
|
||||
}
|
||||
|
||||
|
||||
DownloadFile(getpb(), web, uri, u, temp, file.Replace("/", Program.Slash)).Wait();
|
||||
DownloadFile(getpb(), web, uri, u, temp, file.Replace("/", Handler.Slash)).Wait();
|
||||
});
|
||||
}
|
||||
catch (Exception ex)
|
||||
@ -244,7 +245,7 @@ public class NewUpdater : FPSWindow
|
||||
int line = frame.GetFileLineNumber();
|
||||
string msg = $"Error in Updater.exe in function Download_DoWork on line '{line}' through error '{ex.Message}'\nERROR:\n'{ex}' FRAM:\n '{frame}'";
|
||||
MessageBox.Show(ex.ToString());
|
||||
_ = new HttpClient().PostAsync($"https://{Program.Domain}/Updater/Error/updater", new StringContent(msg));
|
||||
_ = new HttpClient().PostAsync($"https://{Handler.Domain}/Updater/Error/updater", new StringContent(msg));
|
||||
}
|
||||
}
|
||||
catch (Exception exception)
|
||||
@ -254,27 +255,31 @@ public class NewUpdater : FPSWindow
|
||||
}
|
||||
}
|
||||
|
||||
private Task DownloadFile(Tuple<ProgressBar, Label> pb, WebClient web, string uri, Uri u, string[] temp, string file)
|
||||
private readonly string m_Locker = "THREAD_LOCKER";
|
||||
|
||||
|
||||
|
||||
private Task DownloadFile(Tuple<ProgressBar<ulong>, Label, int> pb, WebClient web, string uri, Uri u, string[] temp, string file)
|
||||
{
|
||||
while (!web.IsBusy)
|
||||
{
|
||||
|
||||
string a = web.DownloadString(uri);
|
||||
//Invoke(new Action(() =>pb.MaxProgressValue = ulong.Parse(a)));
|
||||
pb.Item1.MaxProgressValue = ulong.Parse(a);
|
||||
pb.Item1.ProgressValue = 0;
|
||||
//ulong byres = 0;
|
||||
web.DownloadProgressChanged += (sender, args) =>
|
||||
{
|
||||
TotalProgress.ProgressValue += (ulong)args.BytesReceived - pb.Item1.ProgressValue;
|
||||
ulong tmp = (ulong)args.BytesReceived - pb.Item1.ProgressValue;
|
||||
ProgressQuee.Enqueue(tmp);
|
||||
|
||||
pb.Item1.ProgressValue = (ulong)args.BytesReceived;
|
||||
if (ran)
|
||||
{
|
||||
ran = false;
|
||||
Invoke( () =>
|
||||
{
|
||||
// Total_Downloaded!.Text =
|
||||
// $"Downloaded {TotalDownloadAmountNeat(TotalProgress.ProgressValue)}";
|
||||
Total_Downloaded!.Text =
|
||||
$"Downloaded {TotalDownloadAmountNeat(TotalProgress.ProgressValue)}";
|
||||
ran = true;
|
||||
});
|
||||
}
|
||||
@ -307,7 +312,6 @@ public class NewUpdater : FPSWindow
|
||||
{
|
||||
try
|
||||
{
|
||||
StartGUI.close = true;
|
||||
Close();
|
||||
}
|
||||
catch (Exception exception)
|
||||
|
@ -1,236 +1,20 @@
|
||||
using System.Diagnostics;
|
||||
using System.Reflection;
|
||||
|
||||
namespace Updater;
|
||||
namespace Updater;
|
||||
|
||||
public class Program
|
||||
{
|
||||
public static string Slash
|
||||
{
|
||||
get
|
||||
{
|
||||
if (OperatingSystem.IsWindows()) return "\\";
|
||||
else return "/";
|
||||
}
|
||||
}
|
||||
|
||||
public static string JT
|
||||
{
|
||||
get
|
||||
{
|
||||
string tmp = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "JacobTech");
|
||||
if (OperatingSystem.IsLinux())
|
||||
{
|
||||
tmp = Path.Combine(Environment.GetEnvironmentVariable("HOME")!, ".config/");
|
||||
tmp += "JacobTech";
|
||||
}
|
||||
return tmp;
|
||||
}
|
||||
}
|
||||
public static string[] rawargs;
|
||||
public static bool NewUpdater = false;
|
||||
private static string? del = null;
|
||||
public const string Domain = "www.JacobTech.com";
|
||||
internal static Argumets Argumets { get; } = new();
|
||||
|
||||
[STAThread]
|
||||
public static int Main(string[] args)
|
||||
{
|
||||
try
|
||||
{
|
||||
#if DEBUG
|
||||
args = new string[] { "--process", "vyukgykgyh", "--remotedirectory", "Luski", "--localdirectory", $"/home/jacob/Documents/Updater/Updater/bin/Release/ttt", "--dll", "Luski", "--selfcontained", "false", "--branch", "Dev", "--platform", "linux-x64" };
|
||||
string bbbbbb = $"\"{string.Join("\" \"", args)}\"";
|
||||
#endif
|
||||
rawargs = args;
|
||||
int skip = 0;
|
||||
if (args.Length > 2)
|
||||
{
|
||||
for (int i = 0; i < args.Length; i++)
|
||||
{
|
||||
if (args[i].StartsWith("--"))
|
||||
{
|
||||
if (((args.Length - 1) >= (i + 1)))
|
||||
{
|
||||
switch (args[i].Remove(0, 2).ToLower())
|
||||
{
|
||||
case "updater":
|
||||
skip++;
|
||||
NewUpdater = true;
|
||||
Argumets.Updater = args[i + 1];
|
||||
break;
|
||||
case "setconfig":
|
||||
skip++;
|
||||
Argumets.Loc = args[i + 1];
|
||||
break;
|
||||
case "process":
|
||||
skip++;
|
||||
Argumets.Process = args[i + 1];
|
||||
break;
|
||||
case "remotedirectory":
|
||||
skip++;
|
||||
Argumets.RemoteDirectory = args[i + 1];
|
||||
break;
|
||||
case "branch":
|
||||
skip++;
|
||||
Argumets.Branch = args[i + 1];
|
||||
break;
|
||||
case "localdirectory":
|
||||
skip++;
|
||||
Argumets.LocalDirectory = args[i + 1];
|
||||
break;
|
||||
case "dll":
|
||||
skip++;
|
||||
Argumets.DLL = args[i + 1];
|
||||
break;
|
||||
case "version":
|
||||
skip++;
|
||||
Argumets.Version = args[i + 1];
|
||||
break;
|
||||
case "selfcontained":
|
||||
skip++;
|
||||
Argumets.SeflContaind = bool.Parse(args[i + 1]);
|
||||
break;
|
||||
case "platform":
|
||||
skip++;
|
||||
Argumets.Platform = args[i + 1];
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine($"Argument {args[i].Remove(0, 2)} had no value");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
if (!Argumets.Verify())
|
||||
{
|
||||
Console.WriteLine("Not enough arguments were given");
|
||||
return 1;
|
||||
}
|
||||
skip *= 2;
|
||||
Argumets.args = args.Skip(skip).ToList();
|
||||
if (FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion != new HttpClient().GetAsync($"https://www.jacobtech.com/Updater/GetProgramVersion?directory=Updater{Argumets.UriPlatform}{Argumets.UriSeflContaind}").Result.Content.ReadAsStringAsync().Result)
|
||||
{
|
||||
//todo this is broken
|
||||
if (Argumets.Updater is not null)
|
||||
{
|
||||
StartGUI.Main(Argumets);
|
||||
}
|
||||
string newdir = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
|
||||
void MoveDir(string Base, string Move)
|
||||
{
|
||||
if (!Directory.Exists(Move)) Directory.CreateDirectory(Move);
|
||||
DirectoryInfo di = new(Base);
|
||||
foreach (FileInfo file in di.GetFiles())
|
||||
{
|
||||
file.CopyTo(Path.Combine(Move, file.Name));
|
||||
}
|
||||
|
||||
foreach (DirectoryInfo dir in di.GetDirectories())
|
||||
{
|
||||
MoveDir(dir.FullName, Path.Combine(Move, dir.Name));
|
||||
Directory.Delete(dir.FullName);
|
||||
}
|
||||
}
|
||||
MoveDir(AppDomain.CurrentDomain.BaseDirectory, newdir);
|
||||
Process p = new();
|
||||
p.StartInfo.FileName = Path.Combine(newdir, AppDomain.CurrentDomain.FriendlyName);
|
||||
if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() || OperatingSystem.IsFreeBSD())
|
||||
{
|
||||
Process m = Process.Start("/usr/bin/chmod", $"+x {Path.Combine(newdir, AppDomain.CurrentDomain.FriendlyName)}");
|
||||
m.WaitForExit();
|
||||
}
|
||||
|
||||
p.StartInfo.WorkingDirectory = newdir;
|
||||
p.StartInfo.CreateNoWindow = true;
|
||||
p.StartInfo.Arguments = $" --updater \"{AppDomain.CurrentDomain.BaseDirectory}\" \"{string.Join("\" \"", args)}\"";
|
||||
p.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
|
||||
|
||||
p.Start();
|
||||
Handler.StartUpdate(null!, "Luski", "Luski", "/home/jacob/Documents/test",
|
||||
"/home/jacob/Documents/test/cfg.json", "linux-x64");
|
||||
return 0;
|
||||
}
|
||||
if (Argumets.Updater is not null)
|
||||
{
|
||||
Directory.Delete(Argumets.Updater, true);
|
||||
Argumets.Updater = null;
|
||||
}
|
||||
if (!Directory.Exists(JT)) Directory.CreateDirectory(JT);
|
||||
if (!Directory.Exists(Path.Combine(JT + "Updater"))) Directory.CreateDirectory(Path.Combine(JT + "Updater"));
|
||||
if (!Directory.Exists(Path.Combine(JT + $"Updater{Program.Slash}Config"))) Directory.CreateDirectory(Path.Combine(JT + $"Updater{Program.Slash}Config"));
|
||||
_ = Config.MakeFile();
|
||||
//return 0;
|
||||
return StartGUI.Main(Argumets);
|
||||
}
|
||||
else
|
||||
{
|
||||
_ = MessageBox.Show("Not nough arguments were given");
|
||||
Console.WriteLine("Not nough arguments were given");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Console.WriteLine(e);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
public static bool IsProcessOpen(string name)
|
||||
{
|
||||
if (!NewUpdater)
|
||||
{
|
||||
bool @out = false;
|
||||
foreach (Process clsProcess in Process.GetProcessesByName(name.ToLower()))
|
||||
{
|
||||
if (clsProcess.ProcessName.ToLower().Contains(name.ToLower()))
|
||||
{
|
||||
@out = true;
|
||||
}
|
||||
}
|
||||
return @out;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!IsUpdaterProcessOpen())
|
||||
{
|
||||
if (del != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (Directory.Exists(del)) Directory.Delete(del, true);
|
||||
del = null;
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
}
|
||||
bool @out = false;
|
||||
foreach (Process clsProcess in Process.GetProcessesByName(name.ToLower()))
|
||||
{
|
||||
if (clsProcess.ProcessName.ToLower().Contains(name.ToLower()))
|
||||
{
|
||||
@out = true;
|
||||
}
|
||||
}
|
||||
return @out;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static bool IsUpdaterProcessOpen()
|
||||
{
|
||||
if (Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).Length <= 1)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
@ -1,168 +0,0 @@
|
||||
#if true
|
||||
using System.Diagnostics;
|
||||
using OpenTK.Mathematics;
|
||||
using OpenTK.Windowing.Common;
|
||||
using OpenTK.Windowing.Common.Input;
|
||||
using OpenTK.Windowing.Desktop;
|
||||
using SixLabors.ImageSharp.PixelFormats;
|
||||
using System.Reflection;
|
||||
using System.Text.Json;
|
||||
using GraphicsManager;
|
||||
using SixLabors.ImageSharp;
|
||||
using Image = OpenTK.Windowing.Common.Input.Image;
|
||||
|
||||
namespace Updater;
|
||||
|
||||
public class StartGUI
|
||||
{
|
||||
//internal static int Width = 694;
|
||||
//internal static int Height = 216;
|
||||
public static SixLabors.ImageSharp.Image<Rgba32>? Logo { get; private set; }
|
||||
static readonly NativeWindowSettings Settings = new()
|
||||
{
|
||||
Title = "Updater",
|
||||
WindowBorder = WindowBorder.Fixed,
|
||||
APIVersion = new Version(3, 2),
|
||||
StartFocused = true,
|
||||
Size = new(694, 105)
|
||||
};
|
||||
|
||||
private static readonly GameWindowSettings GameWindowSettings = new()
|
||||
{
|
||||
RenderFrequency = 24,
|
||||
UpdateFrequency = 30
|
||||
};
|
||||
|
||||
|
||||
internal static NewUpdater? Up;
|
||||
|
||||
public static bool close = false;
|
||||
|
||||
/// <summary>
|
||||
/// <para>args[0] = Process</para>
|
||||
/// <para>args[1] = Remote Program dir</para>
|
||||
/// <para>args[2] = Remote Program Branch</para>
|
||||
/// <para>args[3] = Local Program Dir</para>
|
||||
/// <para>args[4] = exe file</para>
|
||||
/// </summary>
|
||||
/// <param name="args"></param>
|
||||
internal static int Main(Argumets args)
|
||||
{
|
||||
/*
|
||||
var mmm = Monitors.GetMonitors();
|
||||
if (mmm is not null && mmm.Any())
|
||||
{
|
||||
var mi = mmm.First();
|
||||
int tempw = (int)Math.Round(mi.HorizontalResolution * 0.2127604166666667);
|
||||
int temph = (int)Math.Round(mi.VerticalResolution * 0.1175925925925926);
|
||||
if (tempw < Width) tempw = Width;
|
||||
Width = tempw;
|
||||
if (temph < Height) temph = Height;
|
||||
Height = temph - 30;
|
||||
// Settings.CurrentMonitor = mi.Handle;
|
||||
}
|
||||
//Settings.Size = new Vector2i(Width, Height);
|
||||
*/
|
||||
Image<Rgba32> Logo = SixLabors.ImageSharp.Image.Load<Rgba32>(Tools.GetResourceStream(Assembly.GetExecutingAssembly(), "Updater.Resource.Logo.png"));
|
||||
Logo.DangerousTryGetSinglePixelMemory(out Memory<Rgba32> mm);
|
||||
byte[] pixels = new byte[4 * Logo.Width * Logo.Height];
|
||||
Logo.CopyPixelDataTo(pixels);
|
||||
|
||||
Settings.Icon = new WindowIcon(new Image(Logo.Width, Logo.Height, pixels));
|
||||
|
||||
(Up = new NewUpdater(Settings, GameWindowSettings, args)).Run();
|
||||
Up.Close();
|
||||
Up.Dispose();
|
||||
if (close)
|
||||
{
|
||||
if (args.Updater is not null)
|
||||
{
|
||||
Process p = new();
|
||||
p.StartInfo.FileName = Path.Combine(args.Updater, AppDomain.CurrentDomain.FriendlyName);
|
||||
if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() || OperatingSystem.IsFreeBSD())
|
||||
{
|
||||
Process m = Process.Start("/usr/bin/chmod", $"+x {Path.Combine(args.Updater, AppDomain.CurrentDomain.FriendlyName)}");
|
||||
m.WaitForExit();
|
||||
}
|
||||
|
||||
p.StartInfo.WorkingDirectory = args.Updater;
|
||||
p.StartInfo.CreateNoWindow = true;
|
||||
Program.rawargs[1] = AppDomain.CurrentDomain.BaseDirectory;
|
||||
p.StartInfo.Arguments = $"\"{string.Join("\" \"", Program.rawargs)}\"";
|
||||
p.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
|
||||
|
||||
p.Start();
|
||||
Console.WriteLine("Program done");
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (args.Loc is not null)
|
||||
{
|
||||
FileInfo fi = new(args.Loc);
|
||||
if (!fi.Directory!.Exists) Directory.CreateDirectory(fi.Directory.FullName);
|
||||
UpdaterSettings temp;
|
||||
if (!File.Exists(args.Loc))
|
||||
{
|
||||
File.WriteAllText(args.Loc, JsonSerializer.Serialize(new UpdaterSettings(), UpdaterSettingsContext.Default.UpdaterSettings));
|
||||
temp = new();
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
UpdaterSettings? ss = JsonSerializer.Deserialize(File.ReadAllText(args.Loc), UpdaterSettingsContext.Default.UpdaterSettings);
|
||||
if (ss is null)
|
||||
{
|
||||
ss = new();
|
||||
}
|
||||
|
||||
temp = ss;
|
||||
}
|
||||
catch
|
||||
{
|
||||
temp = new();
|
||||
}
|
||||
|
||||
temp.Updater = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, AppDomain.CurrentDomain.FriendlyName);
|
||||
if (args.Platform is not null) temp.Platform = args.Platform!.ToLower();
|
||||
temp.SelfContained = args.SeflContaind;
|
||||
temp.Branch = args.Branch!.ToLower() switch
|
||||
{
|
||||
"dev" => Branch.Dev,
|
||||
"beta" => Branch.Beta,
|
||||
"master" or _ => Branch.Master
|
||||
};
|
||||
File.WriteAllText(args.Loc, JsonSerializer.Serialize(temp, UpdaterSettingsContext.Default.UpdaterSettings));
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(args.DLL) || string.IsNullOrWhiteSpace(args.DLL))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() || OperatingSystem.IsFreeBSD())
|
||||
{
|
||||
Process m = Process.Start("/usr/bin/chmod", $"+x \"{Path.Combine(args.LocalDirectory, args.DLL)}\"");
|
||||
m.WaitForExit();
|
||||
}
|
||||
|
||||
string a = "";
|
||||
foreach (string arg in args.args!)
|
||||
{
|
||||
a += arg + " ";
|
||||
}
|
||||
|
||||
Process.Start(new ProcessStartInfo()
|
||||
{
|
||||
FileName = Path.Combine(args.LocalDirectory, args.DLL),
|
||||
Arguments = a,
|
||||
WorkingDirectory = args.LocalDirectory,
|
||||
CreateNoWindow = true,
|
||||
UseShellExecute = true,
|
||||
|
||||
})!.WaitForExit();
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
#endif
|
@ -1,15 +1,18 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||
<StartupObject>Updater.Program</StartupObject>
|
||||
<ApplicationIcon>Logo.ico</ApplicationIcon>
|
||||
<FileVersion>2.0.0.0</FileVersion>
|
||||
<FileVersion>1.0.0.0</FileVersion>
|
||||
<AnalysisLevel>latest</AnalysisLevel>
|
||||
<Company>JacobTech, LLC</Company>
|
||||
<Version>1.0.0-alpha02</Version>
|
||||
<Title>Updater</Title>
|
||||
<Authors>JacobTech</Authors>
|
||||
<RepositoryUrl>https://git.jacobtech.com/JacobTech.com/Updater</RepositoryUrl>
|
||||
<RepositoryType>git</RepositoryType>
|
||||
<OutputType>Exe</OutputType>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
<DebugType>portable</DebugType>
|
||||
@ -25,7 +28,7 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="GraphicsManager" Version="1.0.7-alpha95" />
|
||||
<PackageReference Include="GraphicsManager" Version="1.1.1-alpha23" />
|
||||
<PackageReference Include="WindowsAPICodePack-Shell" Version="1.1.1">
|
||||
<NoWarn>NU1701</NoWarn>
|
||||
</PackageReference>
|
||||
@ -35,10 +38,9 @@
|
||||
<EmbeddedResource Include="Resource/**"></EmbeddedResource>
|
||||
</ItemGroup>
|
||||
|
||||
<Target Name="CustomActionsAfterPublish" AfterTargets="AfterPublish">
|
||||
<Message Text="Actions AfterPublish" Importance="high" />
|
||||
<Target Name="CustomActionsAfterPublish" AfterTargets="Pack">
|
||||
<Message Text="Actions AfterPublish: $(PackageId).$(PackageVersion).nupkg" Importance="high" />
|
||||
<Exec Command="nuget push -Source https://nuget.jacobtech.com/v3/index.json bin/Release/$(PackageId).$(PackageVersion).nupkg" />
|
||||
</Target>
|
||||
|
||||
|
||||
|
||||
</Project>
|
||||
|
@ -1,46 +0,0 @@
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Updater;
|
||||
|
||||
public class UpdaterSettings
|
||||
{
|
||||
[JsonInclude]
|
||||
[JsonPropertyName("self_contained")]
|
||||
public bool SelfContained { get; set; } = false;
|
||||
|
||||
[JsonInclude]
|
||||
[JsonPropertyName("updater")]
|
||||
public string? Updater { get; set; } = null;
|
||||
|
||||
[JsonInclude]
|
||||
[JsonPropertyName("branch")]
|
||||
public Branch Branch { get; set; } = Branch.Beta;
|
||||
|
||||
[JsonInclude]
|
||||
[JsonPropertyName("platform")]
|
||||
public string Platform { get; set; } = "linux-x64";
|
||||
|
||||
[JsonInclude]
|
||||
[JsonPropertyName("auto_launch")]
|
||||
public bool AutoLaunch { get; set; } = true;
|
||||
|
||||
[JsonInclude]
|
||||
[JsonPropertyName("update_check")]
|
||||
public bool AutoUpdateCheck { get; set; } = true;
|
||||
}
|
||||
|
||||
public enum Branch : short
|
||||
{
|
||||
Dev,
|
||||
Beta,
|
||||
Master,
|
||||
}
|
||||
|
||||
[JsonSerializable(typeof(UpdaterSettings))]
|
||||
[JsonSourceGenerationOptions(
|
||||
GenerationMode = JsonSourceGenerationMode.Default,
|
||||
WriteIndented = true)]
|
||||
internal partial class UpdaterSettingsContext : JsonSerializerContext
|
||||
{
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user