From 2d001ff21fca66a4e9d13a8f18b42582bdb9caa3 Mon Sep 17 00:00:00 2001 From: Asval Date: Wed, 2 Oct 2024 21:08:41 +0200 Subject: [PATCH] more of the logic --- FModel/MainWindow.xaml | 10 ++- FModel/MainWindow.xaml.cs | 2 - FModel/ViewModels/ApiEndpointViewModel.cs | 2 + .../ApiEndpoints/FModelApiEndpoint.cs | 48 +----------- .../ApiEndpoints/GitHubApiEndpoint.cs | 36 +++++++++ .../ApiEndpoints/Models/FModelResponse.cs | 61 --------------- .../ApiEndpoints/Models/GitHubResponse.cs | 75 +++++++++++++++++++ FModel/ViewModels/ApplicationViewModel.cs | 3 +- FModel/ViewModels/Commands/MenuCommand.cs | 5 +- FModel/ViewModels/UpdateViewModel.cs | 18 +---- .../Resources/Controls/CommitControl.xaml | 2 +- .../Controls/CommitDownloaderControl.xaml | 8 +- .../Controls/CommitDownloaderControl.xaml.cs | 56 ++++++++++---- FModel/Views/UpdateView.xaml | 46 ++++++++---- FModel/Views/UpdateView.xaml.cs | 12 +-- 15 files changed, 210 insertions(+), 174 deletions(-) create mode 100644 FModel/ViewModels/ApiEndpoints/GitHubApiEndpoint.cs create mode 100644 FModel/ViewModels/ApiEndpoints/Models/GitHubResponse.cs diff --git a/FModel/MainWindow.xaml b/FModel/MainWindow.xaml index e46eac51..d4e261ab 100644 --- a/FModel/MainWindow.xaml +++ b/FModel/MainWindow.xaml @@ -147,11 +147,17 @@ - + - + + + + + + + diff --git a/FModel/MainWindow.xaml.cs b/FModel/MainWindow.xaml.cs index 150ed139..6dcede02 100644 --- a/FModel/MainWindow.xaml.cs +++ b/FModel/MainWindow.xaml.cs @@ -45,8 +45,6 @@ public partial class MainWindow private async void OnLoaded(object sender, RoutedEventArgs e) { - var result = new UpdateView().ShowDialog(); - var newOrUpdated = UserSettings.Default.ShowChangelog; #if !DEBUG ApplicationService.ApiEndpointView.FModelApi.CheckForUpdates(UserSettings.Default.UpdateMode, true); diff --git a/FModel/ViewModels/ApiEndpointViewModel.cs b/FModel/ViewModels/ApiEndpointViewModel.cs index 47146eae..6276567a 100644 --- a/FModel/ViewModels/ApiEndpointViewModel.cs +++ b/FModel/ViewModels/ApiEndpointViewModel.cs @@ -20,6 +20,7 @@ public class ApiEndpointViewModel public FortniteCentralApiEndpoint CentralApi { get; } public EpicApiEndpoint EpicApi { get; } public FModelApiEndpoint FModelApi { get; } + public GitHubApiEndpoint GitHubApi { get; } public DynamicApiEndpoint DynamicApi { get; } public ApiEndpointViewModel() @@ -29,6 +30,7 @@ public class ApiEndpointViewModel CentralApi = new FortniteCentralApiEndpoint(_client); EpicApi = new EpicApiEndpoint(_client); FModelApi = new FModelApiEndpoint(_client); + GitHubApi = new GitHubApiEndpoint(_client); DynamicApi = new DynamicApiEndpoint(_client); } diff --git a/FModel/ViewModels/ApiEndpoints/FModelApiEndpoint.cs b/FModel/ViewModels/ApiEndpoints/FModelApiEndpoint.cs index 2d5fdc07..9d0e28ac 100644 --- a/FModel/ViewModels/ApiEndpoints/FModelApiEndpoint.cs +++ b/FModel/ViewModels/ApiEndpoints/FModelApiEndpoint.cs @@ -10,6 +10,7 @@ using FModel.Framework; using FModel.Services; using FModel.Settings; using FModel.ViewModels.ApiEndpoints.Models; +using FModel.Views; using Newtonsoft.Json; using RestSharp; using Serilog; @@ -22,7 +23,6 @@ namespace FModel.ViewModels.ApiEndpoints; public class FModelApiEndpoint : AbstractApiProvider { - private GitHubCommit[] _commits; private News _news; private Info _infos; private Donator[] _donators; @@ -33,23 +33,6 @@ public class FModelApiEndpoint : AbstractApiProvider public FModelApiEndpoint(RestClient client) : base(client) { } - public async Task GetGitHubCommitHistoryAsync(string branch = "dev", int page = 1, int limit = 20) - { - var request = new FRestRequest(Constants.GH_COMMITS_HISTORY); - request.AddParameter("sha", branch); - request.AddParameter("page", page); - request.AddParameter("per_page", limit); - var response = await _client.ExecuteAsync(request).ConfigureAwait(false); - return response.Data; - } - - public async Task GetGitHubReleaseAsync(string tag) - { - var request = new FRestRequest($"{Constants.GH_RELEASES}/tags/{tag}"); - var response = await _client.ExecuteAsync(request).ConfigureAwait(false); - return response.Data; - } - public async Task GetNewsAsync(CancellationToken token, string game) { var request = new FRestRequest($"https://api.fmodel.app/v1/news/{Constants.APP_VERSION}"); @@ -177,33 +160,8 @@ public class FModelApiEndpoint : AbstractApiProvider return; } - var downgrade = currentVersion < args.InstalledVersion; - var messageBox = new MessageBoxModel - { - Text = $"The latest version of FModel {UserSettings.Default.UpdateMode.GetDescription()} is {(qa.Value ? qa.ShortCommitHash : args.CurrentVersion)}. You are using version {(qa.Value ? UserSettings.Default.ShortCommitHash : args.InstalledVersion)}. Do you want to {(downgrade ? "downgrade" : "update")} the application now?", - Caption = $"{(downgrade ? "Downgrade" : "Update")} Available", - Icon = MessageBoxImage.Question, - Buttons = MessageBoxButtons.YesNo(), - IsSoundEnabled = false - }; - - MessageBox.Show(messageBox); - if (messageBox.Result != MessageBoxResult.Yes) return; - - try - { - if (AutoUpdater.DownloadUpdate(args)) - { - UserSettings.Default.ShowChangelog = currentVersion != args.InstalledVersion; - UserSettings.Default.CommitHash = qa.CommitHash; - Application.Current.Shutdown(); - } - } - catch (Exception exception) - { - UserSettings.Default.ShowChangelog = false; - MessageBox.Show(exception.Message, exception.GetType().ToString(), MessageBoxButton.OK, MessageBoxImage.Error); - } + const string message = "A new update is available!"; + Helper.OpenWindow(message, () => new UpdateView { Title = message, ResizeMode = ResizeMode.NoResize }.ShowDialog()); } else { diff --git a/FModel/ViewModels/ApiEndpoints/GitHubApiEndpoint.cs b/FModel/ViewModels/ApiEndpoints/GitHubApiEndpoint.cs new file mode 100644 index 00000000..7414a7ca --- /dev/null +++ b/FModel/ViewModels/ApiEndpoints/GitHubApiEndpoint.cs @@ -0,0 +1,36 @@ +using System.Threading.Tasks; +using FModel.Framework; +using FModel.ViewModels.ApiEndpoints.Models; +using RestSharp; + +namespace FModel.ViewModels.ApiEndpoints; + +public class GitHubApiEndpoint : AbstractApiProvider +{ + private GitHubCommit[] _commits; + + public GitHubApiEndpoint(RestClient client) : base(client) { } + + public async Task GetCommitHistoryAsync(string branch = "dev", int page = 1, int limit = 20) + { + var request = new FRestRequest(Constants.GH_COMMITS_HISTORY); + request.AddParameter("sha", branch); + request.AddParameter("page", page); + request.AddParameter("per_page", limit); + var response = await _client.ExecuteAsync(request).ConfigureAwait(false); +#if DEBUG + System.IO.File.WriteAllTextAsync(@"C:\Users\valen\Downloads\history.json", Newtonsoft.Json.JsonConvert.SerializeObject(response.Data)); +#endif + return response.Data; + } + + public async Task GetReleaseAsync(string tag) + { + var request = new FRestRequest($"{Constants.GH_RELEASES}/tags/{tag}"); + var response = await _client.ExecuteAsync(request).ConfigureAwait(false); +#if DEBUG + System.IO.File.WriteAllTextAsync(@"C:\Users\valen\Downloads\qa.json", Newtonsoft.Json.JsonConvert.SerializeObject(response.Data)); +#endif + return response.Data; + } +} diff --git a/FModel/ViewModels/ApiEndpoints/Models/FModelResponse.cs b/FModel/ViewModels/ApiEndpoints/Models/FModelResponse.cs index 5719714e..6c9b8dc4 100644 --- a/FModel/ViewModels/ApiEndpoints/Models/FModelResponse.cs +++ b/FModel/ViewModels/ApiEndpoints/Models/FModelResponse.cs @@ -1,74 +1,13 @@ -using System; using System.Collections.Generic; using System.Diagnostics; using CUE4Parse.UE4.Versions; using FModel.Creator; using FModel.Extensions; -using FModel.Framework; -using FModel.Settings; using SkiaSharp; using J = Newtonsoft.Json.JsonPropertyAttribute; namespace FModel.ViewModels.ApiEndpoints.Models; -public class GitHubRelease -{ - [J("assets")] public GitHubAsset[] Assets { get; private set; } -} - -public class GitHubAsset : ViewModel -{ - [J("name")] public string Name { get; private set; } - [J("size")] public int Size { get; private set; } - [J("download_count")] public int DownloadCount { get; private set; } - [J("browser_download_url")] public string BrowserDownloadUrl { get; private set; } - [J("created_at")] public DateTime CreatedAt { get; private set; } - - private bool _isLatest; - public bool IsLatest - { - get => _isLatest; - set => SetProperty(ref _isLatest, value); - } -} - -public class GitHubCommit : ViewModel -{ - [J("sha")] public string Sha { get; private set; } - [J("commit")] public Commit Commit { get; private set; } - [J("author")] public Author Author { get; private set; } - - private GitHubAsset _asset; - public GitHubAsset Asset - { - get => _asset; - set - { - SetProperty(ref _asset, value); - RaisePropertyChanged(nameof(IsDownloadable)); - } - } - - public bool IsCurrent => Sha == UserSettings.Default.CommitHash; - - public string ShortSha => Sha[..7]; - public bool IsDownloadable => Asset != null; -} - -public class Commit -{ - [J("author")] public Author Author { get; set; } - [J("message")] public string Message { get; set; } -} - -public class Author -{ - [J("name")] public string Name { get; set; } - [J("date")] public DateTime Date { get; set; } - [J("avatar_url")] public string AvatarUrl { get; set; } - [J("html_url")] public string HtmlUrl { get; set; } -} - [DebuggerDisplay("{" + nameof(Messages) + "}")] public class News { diff --git a/FModel/ViewModels/ApiEndpoints/Models/GitHubResponse.cs b/FModel/ViewModels/ApiEndpoints/Models/GitHubResponse.cs new file mode 100644 index 00000000..b6288897 --- /dev/null +++ b/FModel/ViewModels/ApiEndpoints/Models/GitHubResponse.cs @@ -0,0 +1,75 @@ +using System; +using FModel.Framework; +using FModel.Settings; +using J = Newtonsoft.Json.JsonPropertyAttribute; + +namespace FModel.ViewModels.ApiEndpoints.Models; + +public class GitHubRelease +{ + [J("assets")] public GitHubAsset[] Assets { get; private set; } +} + +public class GitHubAsset : ViewModel +{ + [J("name")] public string Name { get; private set; } + [J("size")] public int Size { get; private set; } + [J("download_count")] public int DownloadCount { get; private set; } + [J("browser_download_url")] public string BrowserDownloadUrl { get; private set; } + [J("created_at")] public DateTime CreatedAt { get; private set; } + + private bool _isLatest; + public bool IsLatest + { + get => _isLatest; + set => SetProperty(ref _isLatest, value); + } +} + +public class GitHubCommit : ViewModel +{ + private string _sha; + [J("sha")] + public string Sha + { + get => _sha; + set + { + SetProperty(ref _sha, value); + RaisePropertyChanged(nameof(IsCurrent)); + RaisePropertyChanged(nameof(ShortSha)); + } + } + + [J("commit")] public Commit Commit { get; private set; } + [J("author")] public Author Author { get; private set; } + + private GitHubAsset _asset; + public GitHubAsset Asset + { + get => _asset; + set + { + SetProperty(ref _asset, value); + RaisePropertyChanged(nameof(IsDownloadable)); + } + } + + public bool IsCurrent => Sha == UserSettings.Default.CommitHash; + public string ShortSha => Sha[..7]; + public bool IsDownloadable => Asset != null; +} + +public class Commit +{ + [J("author")] public Author Author { get; set; } + [J("message")] public string Message { get; set; } +} + +public class Author +{ + [J("name")] public string Name { get; set; } + [J("date")] public DateTime Date { get; set; } + [J("avatar_url")] public string AvatarUrl { get; set; } + [J("html_url")] public string HtmlUrl { get; set; } +} diff --git a/FModel/ViewModels/ApplicationViewModel.cs b/FModel/ViewModels/ApplicationViewModel.cs index 1d314969..a96d4d22 100644 --- a/FModel/ViewModels/ApplicationViewModel.cs +++ b/FModel/ViewModels/ApplicationViewModel.cs @@ -10,7 +10,6 @@ using CUE4Parse.Compression; using CUE4Parse.Encryption.Aes; using CUE4Parse.UE4.Objects.Core.Misc; using CUE4Parse.UE4.VirtualFileSystem; -using FModel.Extensions; using FModel.Framework; using FModel.Services; using FModel.Settings; @@ -50,7 +49,7 @@ public class ApplicationViewModel : ViewModel public CopyCommand CopyCommand => _copyCommand ??= new CopyCommand(this); private CopyCommand _copyCommand; - public string InitialWindowTitle => $"FModel {UserSettings.Default.UpdateMode.GetDescription()}"; + public string InitialWindowTitle => $"FModel ({UserSettings.Default.ShortCommitHash})"; public string GameDisplayName => CUE4Parse.Provider.GameDisplayName ?? "Unknown"; public string TitleExtra => $"({UserSettings.Default.CurrentDir.UeVersion}){(Build != EBuildKind.Release ? $" ({Build})" : "")}"; diff --git a/FModel/ViewModels/Commands/MenuCommand.cs b/FModel/ViewModels/Commands/MenuCommand.cs index 7a510915..14b54904 100644 --- a/FModel/ViewModels/Commands/MenuCommand.cs +++ b/FModel/ViewModels/Commands/MenuCommand.cs @@ -54,9 +54,8 @@ public class MenuCommand : ViewModelCommand case "Help_Donate": Process.Start(new ProcessStartInfo { FileName = Constants.DONATE_LINK, UseShellExecute = true }); break; - case "Help_Changelog": - UserSettings.Default.ShowChangelog = true; - ApplicationService.ApiEndpointView.FModelApi.CheckForUpdates(UserSettings.Default.UpdateMode); + case "Help_Releases": + Helper.OpenWindow("Releases", () => new UpdateView().Show()); break; case "Help_BugsReport": Process.Start(new ProcessStartInfo { FileName = Constants.ISSUE_LINK, UseShellExecute = true }); diff --git a/FModel/ViewModels/UpdateViewModel.cs b/FModel/ViewModels/UpdateViewModel.cs index af2b1319..64bef9c2 100644 --- a/FModel/ViewModels/UpdateViewModel.cs +++ b/FModel/ViewModels/UpdateViewModel.cs @@ -1,5 +1,4 @@ using System.ComponentModel; -using System.IO; using System.Linq; using System.Threading.Tasks; using System.Windows.Data; @@ -8,7 +7,6 @@ using FModel.Framework; using FModel.Services; using FModel.ViewModels.ApiEndpoints.Models; using FModel.Views.Resources.Converters; -using Newtonsoft.Json; namespace FModel.ViewModels; @@ -31,19 +29,11 @@ public class UpdateViewModel : ViewModel public async Task Load() { #if DEBUG - Commits.AddRange(JsonConvert.DeserializeObject(await File.ReadAllTextAsync(@"C:\Users\valen\Downloads\history.json"))); + Commits.AddRange(Newtonsoft.Json.JsonConvert.DeserializeObject(await System.IO.File.ReadAllTextAsync(@"C:\Users\valen\Downloads\history.json"))); + var qa = Newtonsoft.Json.JsonConvert.DeserializeObject(await System.IO.File.ReadAllTextAsync(@"C:\Users\valen\Downloads\qa.json")); #else - Commits.AddRange(await _apiEndpointView.FModelApi.GetGitHubCommitHistoryAsync()); -#endif - _ = PostLoad(); - } - - private async Task PostLoad() - { -#if DEBUG - var qa = JsonConvert.DeserializeObject(await File.ReadAllTextAsync(@"C:\Users\valen\Downloads\qa.json")); -#else - var qa = await _apiEndpointView.FModelApi.GetGitHubReleaseAsync("qa"); + Commits.AddRange(await _apiEndpointView.GitHubApi.GetCommitHistoryAsync()); + var qa = await _apiEndpointView.GitHubApi.GetReleaseAsync("qa"); #endif qa.Assets.OrderByDescending(x => x.CreatedAt).First().IsLatest = true; diff --git a/FModel/Views/Resources/Controls/CommitControl.xaml b/FModel/Views/Resources/Controls/CommitControl.xaml index e55327fe..00d331e4 100644 --- a/FModel/Views/Resources/Controls/CommitControl.xaml +++ b/FModel/Views/Resources/Controls/CommitControl.xaml @@ -65,7 +65,7 @@ - + @@ -72,7 +74,7 @@ - + diff --git a/FModel/Views/Resources/Controls/CommitDownloaderControl.xaml.cs b/FModel/Views/Resources/Controls/CommitDownloaderControl.xaml.cs index 34a89f2e..89464610 100644 --- a/FModel/Views/Resources/Controls/CommitDownloaderControl.xaml.cs +++ b/FModel/Views/Resources/Controls/CommitDownloaderControl.xaml.cs @@ -1,7 +1,14 @@ -using System.Windows; +using System; +using System.Windows; using System.Windows.Controls; +using AdonisUI.Controls; using AutoUpdaterDotNET; +using FModel.Settings; using FModel.ViewModels.ApiEndpoints.Models; +using MessageBox = AdonisUI.Controls.MessageBox; +using MessageBoxButton = AdonisUI.Controls.MessageBoxButton; +using MessageBoxImage = AdonisUI.Controls.MessageBoxImage; +using MessageBoxResult = AdonisUI.Controls.MessageBoxResult; namespace FModel.Views.Resources.Controls; @@ -12,27 +19,44 @@ public partial class CommitDownloaderControl : UserControl InitializeComponent(); } - public static readonly DependencyProperty CommitAssetProperty = - DependencyProperty.Register("CommitAsset", typeof(GitHubAsset), typeof(CommitDownloaderControl), new PropertyMetadata(null)); + public static readonly DependencyProperty CommitProperty = + DependencyProperty.Register(nameof(Commit), typeof(GitHubCommit), typeof(CommitDownloaderControl), new PropertyMetadata(null)); - public GitHubAsset CommitAsset + public GitHubCommit Commit { - get { return (GitHubAsset)GetValue(CommitAssetProperty); } - set { SetValue(CommitAssetProperty, value); } - } - - public static readonly DependencyProperty IsCurrentProperty = - DependencyProperty.Register("IsCurrent", typeof(bool), typeof(CommitDownloaderControl), new PropertyMetadata(null)); - - public bool IsCurrent - { - get { return (bool)GetValue(IsCurrentProperty); } - set { SetValue(IsCurrentProperty, value); } + get { return (GitHubCommit)GetValue(CommitProperty); } + set { SetValue(CommitProperty, value); } } private void OnDownload(object sender, RoutedEventArgs e) { - AutoUpdater.DownloadUpdate(new UpdateInfoEventArgs { DownloadURL = CommitAsset.BrowserDownloadUrl }); + if (Commit.IsCurrent) return; + + var messageBox = new MessageBoxModel + { + Text = $"Are you sure you want to update to version '{Commit.ShortSha}'?{(!Commit.Asset.IsLatest ? "\nThis is not the latest version." : "")}", + Caption = "Update FModel", + Icon = MessageBoxImage.Question, + Buttons = MessageBoxButtons.YesNo(), + IsSoundEnabled = false + }; + + MessageBox.Show(messageBox); + if (messageBox.Result != MessageBoxResult.Yes) return; + + try + { + if (AutoUpdater.DownloadUpdate(new UpdateInfoEventArgs { DownloadURL = Commit.Asset.BrowserDownloadUrl })) + { + UserSettings.Default.CommitHash = Commit.Sha; + Application.Current.Shutdown(); + } + } + catch (Exception exception) + { + UserSettings.Default.ShowChangelog = false; + MessageBox.Show(exception.Message, exception.GetType().ToString(), MessageBoxButton.OK, MessageBoxImage.Error); + } } } diff --git a/FModel/Views/UpdateView.xaml b/FModel/Views/UpdateView.xaml index c9d2567e..dc1d9ef2 100644 --- a/FModel/Views/UpdateView.xaml +++ b/FModel/Views/UpdateView.xaml @@ -5,12 +5,12 @@ xmlns:adonisExtensions="clr-namespace:AdonisUI.Extensions;assembly=AdonisUI" xmlns:adonisControls="clr-namespace:AdonisUI.Controls;assembly=AdonisUI" xmlns:controls="clr-namespace:FModel.Views.Resources.Controls" - MinHeight="{Binding Source={x:Static SystemParameters.MaximizedPrimaryScreenHeight}, Converter={converters:RatioConverter}, ConverterParameter='0.20'}" - Width="{Binding Source={x:Static SystemParameters.MaximizedPrimaryScreenWidth}, Converter={converters:RatioConverter}, ConverterParameter='0.50'}" - Loaded="OnLoaded"> + WindowStartupLocation="CenterScreen" IconVisibility="Collapsed" ResizeMode="CanMinimize" Loaded="OnLoaded" + MinHeight="{Binding Source={x:Static SystemParameters.MaximizedPrimaryScreenHeight}, Converter={converters:RatioConverter}, ConverterParameter='0.40'}" + Width="{Binding Source={x:Static SystemParameters.MaximizedPrimaryScreenWidth}, Converter={converters:RatioConverter}, ConverterParameter='0.35'}"> @@ -20,17 +20,35 @@ - - - - - - + + + + + - - + + + + + + + + + + + - + + + + @@ -69,6 +87,6 @@ - + diff --git a/FModel/Views/UpdateView.xaml.cs b/FModel/Views/UpdateView.xaml.cs index 61d3f290..a1c284a4 100644 --- a/FModel/Views/UpdateView.xaml.cs +++ b/FModel/Views/UpdateView.xaml.cs @@ -1,8 +1,4 @@ -using System.Diagnostics; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Navigation; -using FModel.Services; +using System.Windows; using FModel.ViewModels; namespace FModel.Views; @@ -20,11 +16,5 @@ public partial class UpdateView if (DataContext is not UpdateViewModel viewModel) return; await viewModel.Load(); } - - private void OnRequestNavigate(object sender, RequestNavigateEventArgs e) - { - Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri) { UseShellExecute = true }); - e.Handled = true; - } }