diff --git a/FModel/Framework/FEndpoint.cs b/FModel/Framework/FEndpoint.cs index f5edc115..16fbd42b 100644 --- a/FModel/Framework/FEndpoint.cs +++ b/FModel/Framework/FEndpoint.cs @@ -6,7 +6,11 @@ public class FEndpoint : ViewModel public string Url { get => _url; - set => SetProperty(ref _url, value); + set + { + SetProperty(ref _url, value); + RaisePropertyChanged(nameof(IsEnabled)); + } } private bool _overwrite; diff --git a/FModel/ViewModels/ApiEndpoints/Models/AesResponse.cs b/FModel/ViewModels/ApiEndpoints/Models/AesResponse.cs index 76e775a9..745ca904 100644 --- a/FModel/ViewModels/ApiEndpoints/Models/AesResponse.cs +++ b/FModel/ViewModels/ApiEndpoints/Models/AesResponse.cs @@ -1,17 +1,25 @@ using System.Collections.Generic; using System.Diagnostics; using J = Newtonsoft.Json.JsonPropertyAttribute; +using I = Newtonsoft.Json.JsonIgnoreAttribute; namespace FModel.ViewModels.ApiEndpoints.Models; [DebuggerDisplay("{" + nameof(Version) + "}")] public class AesResponse { - [J("version")] public string Version { get; private set; } + [I][J("version")] public string Version { get; private set; } [J("mainKey")] public string MainKey { get; set; } [J("dynamicKeys")] public List DynamicKeys { get; set; } - public bool HasDynamicKeys => DynamicKeys is { Count: > 0 }; + public AesResponse() + { + MainKey = string.Empty; + DynamicKeys = new List(); + } + + [I] public bool HasDynamicKeys => DynamicKeys is { Count: > 0 }; + [I] public bool IsValid => !string.IsNullOrEmpty(MainKey); } [DebuggerDisplay("{" + nameof(Key) + "}")] @@ -20,4 +28,7 @@ public class DynamicKey [J("name")] public string Name { get; set; } [J("guid")] public string Guid { get; set; } [J("key")] public string Key { get; set; } + + [I] public bool IsValid => !string.IsNullOrEmpty(Guid) && + !string.IsNullOrEmpty(Key); } diff --git a/FModel/ViewModels/ApiEndpoints/Models/MappingsResponse.cs b/FModel/ViewModels/ApiEndpoints/Models/MappingsResponse.cs index 2a89a8ff..23c1aba6 100644 --- a/FModel/ViewModels/ApiEndpoints/Models/MappingsResponse.cs +++ b/FModel/ViewModels/ApiEndpoints/Models/MappingsResponse.cs @@ -1,22 +1,41 @@ using System.Diagnostics; using J = Newtonsoft.Json.JsonPropertyAttribute; +using I = Newtonsoft.Json.JsonIgnoreAttribute; namespace FModel.ViewModels.ApiEndpoints.Models; [DebuggerDisplay("{" + nameof(FileName) + "}")] public class MappingsResponse { - [J] public string Url { get; private set; } - [J] public string FileName { get; private set; } - [J] public string Hash { get; private set; } - [J] public long Length { get; private set; } - [J] public string Uploaded { get; private set; } - [J] public Meta Meta { get; private set; } + [J] public string Url { get; set; } + [J] public string FileName { get; set; } + [I][J] public string Hash { get; private set; } + [I][J] public long Length { get; private set; } + [I][J] public string Uploaded { get; private set; } + [J] public Meta Meta { get; set; } + + public MappingsResponse() + { + Url = string.Empty; + FileName = string.Empty; + Meta = new Meta(); + } + + [I] public bool IsValid => !string.IsNullOrEmpty(Url) && + !string.IsNullOrEmpty(FileName) && + Meta != null; } [DebuggerDisplay("{" + nameof(CompressionMethod) + "}")] public class Meta { - [J] public string Version { get; private set; } - [J] public string CompressionMethod { get; private set; } -} \ No newline at end of file + [I][J] public string Version { get; private set; } + [J] public string CompressionMethod { get; set; } + + public Meta() + { + CompressionMethod = "Oodle"; + } + + [I] public bool IsValid => CompressionMethod == "Oodle"; +} diff --git a/FModel/ViewModels/ApiEndpoints/Models/PlaylistResponse.cs b/FModel/ViewModels/ApiEndpoints/Models/PlaylistResponse.cs index cc290894..e65d794b 100644 --- a/FModel/ViewModels/ApiEndpoints/Models/PlaylistResponse.cs +++ b/FModel/ViewModels/ApiEndpoints/Models/PlaylistResponse.cs @@ -12,10 +12,9 @@ public class PlaylistResponse [J] public Playlist Data { get; private set; } [J] public string Error { get; private set; } - public bool IsSuccess => Status == 200; - public bool HasError => Error != null; - - private object DebuggerDisplay => IsSuccess ? Data : $"Error: {Status} | {Error}"; + [I] public bool IsSuccess => Status == 200; + [I] public bool HasError => Error != null; + [I] private object DebuggerDisplay => IsSuccess ? Data : $"Error: {Status} | {Error}"; } [DebuggerDisplay("{" + nameof(Id) + "}")] @@ -32,4 +31,4 @@ public class PlaylistImages [I] public bool HasShowcase => Showcase != null; [I] public bool HasMissionIcon => MissionIcon != null; -} \ No newline at end of file +} diff --git a/FModel/ViewModels/CUE4ParseViewModel.cs b/FModel/ViewModels/CUE4ParseViewModel.cs index 5f2a3e2d..c3d614c0 100644 --- a/FModel/ViewModels/CUE4ParseViewModel.cs +++ b/FModel/ViewModels/CUE4ParseViewModel.cs @@ -301,7 +301,7 @@ public class CUE4ParseViewModel : ViewModel await _threadWorkerView.Begin(cancellationToken => { var aes = _apiEndpointView.DynamicApi.GetAesKeys(cancellationToken, endpoint.Url); - if (aes?.MainKey == null && aes?.DynamicKeys == null) return; + if (aes is not { IsValid: true }) return; UserSettings.Default.AesKeys[Game] = aes; }); @@ -342,7 +342,7 @@ public class CUE4ParseViewModel : ViewModel { foreach (var mapping in mappings) { - if (mapping.Meta.CompressionMethod != "Oodle") continue; + if (!mapping.IsValid || !mapping.Meta.IsValid) continue; var mappingPath = Path.Combine(mappingsFolder, mapping.FileName); if (!File.Exists(mappingPath)) diff --git a/FModel/ViewModels/SettingsViewModel.cs b/FModel/ViewModels/SettingsViewModel.cs index 90997f37..8f0ccc2e 100644 --- a/FModel/ViewModels/SettingsViewModel.cs +++ b/FModel/ViewModels/SettingsViewModel.cs @@ -324,6 +324,12 @@ public class SettingsViewModel : ViewModel UserSettings.Default.OverridedOptions[_game] = SelectedOptions; } + if (UserSettings.Default.CustomEndpoints.TryGetValue(_game, out var endpoints)) + { + endpoints[0] = AesEndpoint; + endpoints[1] = MappingEndpoint; + } + UserSettings.Default.AssetLanguage = SelectedAssetLanguage; UserSettings.Default.CompressedAudioMode = SelectedCompressedAudio; UserSettings.Default.CosmeticStyle = SelectedCosmeticStyle; diff --git a/FModel/Views/Resources/Controls/EndpointEditor.xaml b/FModel/Views/Resources/Controls/EndpointEditor.xaml new file mode 100644 index 00000000..6843c062 --- /dev/null +++ b/FModel/Views/Resources/Controls/EndpointEditor.xaml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +