diff --git a/Wabbajack.Launcher/MainWindowVM.cs b/Wabbajack.Launcher/MainWindowVM.cs index 04aaa3b0..3b64c5df 100644 --- a/Wabbajack.Launcher/MainWindowVM.cs +++ b/Wabbajack.Launcher/MainWindowVM.cs @@ -7,6 +7,7 @@ using System.Linq; using System.Net; using System.Runtime.CompilerServices; using System.Threading.Tasks; +using Newtonsoft.Json; using Wabbajack.Launcher.Annotations; namespace Wabbajack.Launcher @@ -14,6 +15,9 @@ namespace Wabbajack.Launcher public class MainWindowVM : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; + private WebClient _client = new WebClient(); + public Uri GITHUB_REPO = new Uri("https://api.github.com/repos/wabbajack-tools/temp-releases/releases"); + [NotifyPropertyChangedInvocator] protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) @@ -22,7 +26,7 @@ namespace Wabbajack.Launcher } private string _status = "Checking for Updates"; - private string _version; + private Release _version; public string Status { @@ -44,16 +48,42 @@ namespace Wabbajack.Launcher private async Task CheckForUpdates() { - _version = "0.9.17.0"; + _client.Headers.Add ("user-agent", "Wabbajack Launcher"); + Status = "Selecting Release"; - var base_folder = Path.Combine(Directory.GetCurrentDirectory()); + try + { + var releases = await GetReleases(); + _version = releases.OrderByDescending(r => + { + if (Version.TryParse(r.Tag, out var v)) + return v; + return new Version(0, 0, 0, 0); + }).FirstOrDefault(); + } + catch (Exception) + { + FinishAndExit(); + } - if (File.Exists(Path.Combine(base_folder, _version, "Wabbajack.exe"))) + if (_version == null) + FinishAndExit(); + + Status = "Looking for Updates"; + + var base_folder = Path.Combine(Directory.GetCurrentDirectory(), _version.Tag); + + if (File.Exists(Path.Combine(base_folder, "Wabbajack.exe"))) + FinishAndExit(); + + var asset = _version.Assets.FirstOrDefault(a => a.Name == _version.Tag + ".zip"); + if (asset == null) FinishAndExit(); var wc = new WebClient(); wc.DownloadProgressChanged += UpdateProgress; - var data = await wc.DownloadDataTaskAsync(new Uri("https://build.wabbajack.org/0.9.17.0.zip")); + Status = $"Downloading {_version.Tag} ..."; + var data = await wc.DownloadDataTaskAsync(asset.BrowserDownloadUrl); using (var zip = new ZipArchive(new MemoryStream(data), ZipArchiveMode.Read)) { @@ -77,11 +107,14 @@ namespace Wabbajack.Launcher private void FinishAndExit() { Status = "Launching..."; - var wj_folder = Path.Combine(Directory.GetCurrentDirectory(), _version); + var wjFolder = Directory.EnumerateDirectories(Directory.GetCurrentDirectory()) + .OrderByDescending(v => + Version.TryParse(Path.GetFileName(v), out var ver) ? ver : new Version(0, 0, 0, 0)) + .FirstOrDefault(); var info = new ProcessStartInfo { - FileName = Path.Combine(wj_folder, "Wabbajack.exe"), - WorkingDirectory = wj_folder, + FileName = Path.Combine(wjFolder, "Wabbajack.exe"), + WorkingDirectory = wjFolder, }; Process.Start(info); Environment.Exit(0); @@ -89,7 +122,34 @@ namespace Wabbajack.Launcher private void UpdateProgress(object sender, DownloadProgressChangedEventArgs e) { - Status = $"Downloading ({e.ProgressPercentage}%)..."; + Status = $"Downloading {_version.Tag} ({e.ProgressPercentage}%)..."; + } + + private async Task GetReleases() + { + Status = "Checking GitHub Repository"; + var data = await _client.DownloadStringTaskAsync(GITHUB_REPO); + Status = "Parsing Response"; + return JsonConvert.DeserializeObject(data); + } + + + class Release + { + [JsonProperty("tag_name")] + public string Tag { get; set; } + + [JsonProperty("assets")] + public Asset[] Assets { get; set; } + } + + class Asset + { + [JsonProperty("browser_download_url")] + public Uri BrowserDownloadUrl { get; set; } + + [JsonProperty("name")] + public string Name { get; set; } } } } diff --git a/Wabbajack.Launcher/Wabbajack.Launcher.csproj b/Wabbajack.Launcher/Wabbajack.Launcher.csproj index 5b6c1d2a..b787cbd4 100644 --- a/Wabbajack.Launcher/Wabbajack.Launcher.csproj +++ b/Wabbajack.Launcher/Wabbajack.Launcher.csproj @@ -4,9 +4,11 @@ WinExe netcoreapp3.1 true - true + true win-x64 + Wabbajack + Wabbajack