using GHelper.Helpers; using System.Diagnostics; using System.Net; using System.Reflection; using System.Text.Json; namespace GHelper.AutoUpdate { public class AutoUpdateControl { SettingsForm settings; public string versionUrl = "http://github.com/seerge/g-helper/releases"; static long lastUpdate; public AutoUpdateControl(SettingsForm settingsForm) { settings = settingsForm; var appVersion = new Version(Assembly.GetExecutingAssembly().GetName().Version.ToString()); settings.SetVersionLabel(Properties.Strings.VersionLabel + $": {appVersion.Major}.{appVersion.Minor}.{appVersion.Build}"); } public void CheckForUpdates() { // Run update once per 12 hours if (Math.Abs(DateTimeOffset.Now.ToUnixTimeSeconds() - lastUpdate) < 43200) return; lastUpdate = DateTimeOffset.Now.ToUnixTimeSeconds(); Task.Run(async () => { await Task.Delay(TimeSpan.FromSeconds(1)); CheckForUpdatesAsync(); }); } public void LoadReleases() { try { Process.Start(new ProcessStartInfo(versionUrl) { UseShellExecute = true }); } catch (Exception ex) { Logger.WriteLine("Failed to open releases page:" + ex.Message); } } async void CheckForUpdatesAsync() { if (AppConfig.Is("skip_updates")) return; try { using (var httpClient = new HttpClient()) { httpClient.DefaultRequestHeaders.Add("User-Agent", "C# App"); var json = await httpClient.GetStringAsync("https://api.github.com/repos/seerge/g-helper/releases/latest"); var config = JsonSerializer.Deserialize(json); var tag = config.GetProperty("tag_name").ToString().Replace("v", ""); var assets = config.GetProperty("assets"); string url = null; for (int i = 0; i < assets.GetArrayLength(); i++) { if (assets[i].GetProperty("browser_download_url").ToString().Contains(".zip")) url = assets[i].GetProperty("browser_download_url").ToString(); } if (url is null) url = assets[0].GetProperty("browser_download_url").ToString(); var gitVersion = new Version(tag); var appVersion = new Version(Assembly.GetExecutingAssembly().GetName().Version.ToString()); //appVersion = new Version("0.50.0.0"); if (gitVersion.CompareTo(appVersion) > 0) { versionUrl = url; settings.SetVersionLabel(Properties.Strings.DownloadUpdate + ": " + tag, true); if (AppConfig.GetString("skip_version") != tag) { DialogResult dialogResult = MessageBox.Show(Properties.Strings.DownloadUpdate + ": G-Helper " + tag + "?", "Update", MessageBoxButtons.YesNo); if (dialogResult == DialogResult.Yes) AutoUpdate(url); else AppConfig.Set("skip_version", tag); } } else { Logger.WriteLine($"Latest version {appVersion}"); } } } catch (Exception ex) { Logger.WriteLine("Failed to check for updates:" + ex.Message); } } async void AutoUpdate(string requestUri) { Uri uri = new Uri(requestUri); string zipName = Path.GetFileName(uri.LocalPath); string exeLocation = Application.ExecutablePath; string exeDir = Path.GetDirectoryName(exeLocation); string exeName = Path.GetFileName(exeLocation); string zipLocation = exeDir + "\\" + zipName; using (WebClient client = new WebClient()) { client.DownloadFile(uri, zipLocation); Logger.WriteLine(requestUri); Logger.WriteLine(exeDir); Logger.WriteLine(zipName); Logger.WriteLine(exeName); string command = $"$ErrorActionPreference = \"Stop\"; Wait-Process -Name \"GHelper\"; Expand-Archive \"{zipName}\" -DestinationPath . -Force; Remove-Item \"{zipName}\" -Force; \".\\{exeName}\"; "; Logger.WriteLine(command); try { var cmd = new Process(); cmd.StartInfo.WorkingDirectory = exeDir; cmd.StartInfo.UseShellExecute = false; cmd.StartInfo.CreateNoWindow = true; cmd.StartInfo.FileName = "powershell"; cmd.StartInfo.Arguments = command; if (ProcessHelper.IsUserAdministrator()) cmd.StartInfo.Verb = "runas"; cmd.Start(); } catch (Exception ex) { Logger.WriteLine(ex.Message); } Application.Exit(); } } } }