diff --git a/CUE4Parse b/CUE4Parse index d2d8fe2e..0a98d821 160000 --- a/CUE4Parse +++ b/CUE4Parse @@ -1 +1 @@ -Subproject commit d2d8fe2e3e9575fea5f18ce8e317ff62acaa66c7 +Subproject commit 0a98d821d8d0c93ead31bec576e27313efb2f9a5 diff --git a/FModel/FModel.csproj b/FModel/FModel.csproj index 927b871a..0896e87d 100644 --- a/FModel/FModel.csproj +++ b/FModel/FModel.csproj @@ -107,21 +107,21 @@ - - + + - + - - - + + + - + diff --git a/FModel/Framework/JsonNetSerializer.cs b/FModel/Framework/JsonNetSerializer.cs index 6bc2ee4d..68daf367 100644 --- a/FModel/Framework/JsonNetSerializer.cs +++ b/FModel/Framework/JsonNetSerializer.cs @@ -2,11 +2,11 @@ using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using RestSharp; -using RestSharp.Serialization; +using RestSharp.Serializers; namespace FModel.Framework; -public class JsonNetSerializer : IRestSerializer +public class JsonNetSerializer : IRestSerializer, ISerializer, IDeserializer { public static readonly JsonSerializerSettings SerializerSettings = new() { @@ -15,28 +15,16 @@ public class JsonNetSerializer : IRestSerializer ContractResolver = new CamelCasePropertyNamesContractResolver() }; - public string Serialize(object obj) - { - return JsonConvert.SerializeObject(obj); - } + public string Serialize(Parameter parameter) => JsonConvert.SerializeObject(parameter.Value); + public string Serialize(object obj) => JsonConvert.SerializeObject(obj); + public T Deserialize(RestResponse response) => JsonConvert.DeserializeObject(response.Content!, SerializerSettings); - [Obsolete] - public string Serialize(Parameter parameter) - { - return JsonConvert.SerializeObject(parameter.Value); - } + public ISerializer Serializer => this; + public IDeserializer Deserializer => this; - public T Deserialize(IRestResponse response) - { - return JsonConvert.DeserializeObject(response.Content, SerializerSettings); - } - - public string[] SupportedContentTypes { get; } = - { - "application/json", "application/json; charset=UTF-8" - }; - - public string ContentType { get; set; } = "application/json; charset=UTF-8"; + public string ContentType { get; set; } = "application/json"; + public string[] AcceptedContentTypes => RestSharp.Serializers.ContentType.JsonAccept; + public SupportsContentType SupportsContentType => contentType => contentType.EndsWith("json", StringComparison.InvariantCultureIgnoreCase); public DataFormat DataFormat => DataFormat.Json; -} \ No newline at end of file +} diff --git a/FModel/ViewModels/ApiEndpointViewModel.cs b/FModel/ViewModels/ApiEndpointViewModel.cs index 94b66268..55d5d6af 100644 --- a/FModel/ViewModels/ApiEndpointViewModel.cs +++ b/FModel/ViewModels/ApiEndpointViewModel.cs @@ -6,10 +6,13 @@ namespace FModel.ViewModels; public class ApiEndpointViewModel { - private readonly IRestClient _client = new RestClient + private readonly RestClient _client = new RestClient { - UserAgent = $"FModel/{Constants.APP_VERSION}", - Timeout = 3 * 1000 + Options = + { + UserAgent = $"FModel/{Constants.APP_VERSION}", + MaxTimeout = 3 * 1000 + } }.UseSerializer(); public FortniteApiEndpoint FortniteApi { get; } @@ -26,4 +29,4 @@ public class ApiEndpointViewModel EpicApi = new EpicApiEndpoint(_client); FModelApi = new FModelApi(_client); } -} \ No newline at end of file +} diff --git a/FModel/ViewModels/ApiEndpoints/AbstractApiProvider.cs b/FModel/ViewModels/ApiEndpoints/AbstractApiProvider.cs index c66aa0f7..ea0f4c04 100644 --- a/FModel/ViewModels/ApiEndpoints/AbstractApiProvider.cs +++ b/FModel/ViewModels/ApiEndpoints/AbstractApiProvider.cs @@ -4,10 +4,10 @@ namespace FModel.ViewModels.ApiEndpoints; public abstract class AbstractApiProvider { - protected readonly IRestClient _client; + protected readonly RestClient _client; - protected AbstractApiProvider(IRestClient client) + protected AbstractApiProvider(RestClient client) { _client = client; } -} \ No newline at end of file +} diff --git a/FModel/ViewModels/ApiEndpoints/BenbotApiEndpoint.cs b/FModel/ViewModels/ApiEndpoints/BenbotApiEndpoint.cs index 8dc631f0..5bd477ff 100644 --- a/FModel/ViewModels/ApiEndpoints/BenbotApiEndpoint.cs +++ b/FModel/ViewModels/ApiEndpoints/BenbotApiEndpoint.cs @@ -10,13 +10,13 @@ namespace FModel.ViewModels.ApiEndpoints; public class BenbotApiEndpoint : AbstractApiProvider { - public BenbotApiEndpoint(IRestClient client) : base(client) + public BenbotApiEndpoint(RestClient client) : base(client) { } public async Task GetAesKeysAsync(CancellationToken token) { - var request = new RestRequest("https://benbot.app/api/v2/aes", Method.GET) + var request = new RestRequest("https://benbot.app/api/v2/aes") { OnBeforeDeserialization = resp => { resp.ContentType = "application/json; charset=utf-8"; } }; @@ -32,7 +32,7 @@ public class BenbotApiEndpoint : AbstractApiProvider public async Task GetMappingsAsync(CancellationToken token) { - var request = new RestRequest("https://benbot.app/api/v1/mappings", Method.GET) + var request = new RestRequest("https://benbot.app/api/v1/mappings") { OnBeforeDeserialization = resp => { resp.ContentType = "application/json; charset=utf-8"; } }; @@ -48,7 +48,7 @@ public class BenbotApiEndpoint : AbstractApiProvider public async Task>> GetHotfixesAsync(CancellationToken token, string language = "en-US") { - var request = new RestRequest("https://benbot.app/api/v1/hotfixes", Method.GET) + var request = new RestRequest("https://benbot.app/api/v1/hotfixes") { OnBeforeDeserialization = resp => { resp.ContentType = "application/json; charset=utf-8"; } }; @@ -65,7 +65,7 @@ public class BenbotApiEndpoint : AbstractApiProvider public async Task DownloadFileAsync(string fileLink, string installationPath) { - var request = new RestRequest(fileLink, Method.GET); + var request = new RestRequest(fileLink); var data = _client.DownloadData(request); await File.WriteAllBytesAsync(installationPath, data); } @@ -74,4 +74,4 @@ public class BenbotApiEndpoint : AbstractApiProvider { DownloadFileAsync(fileLink, installationPath).GetAwaiter().GetResult(); } -} \ No newline at end of file +} diff --git a/FModel/ViewModels/ApiEndpoints/EpicApiEndpoint.cs b/FModel/ViewModels/ApiEndpoints/EpicApiEndpoint.cs index 95e0bf8f..57b1e9c7 100644 --- a/FModel/ViewModels/ApiEndpoints/EpicApiEndpoint.cs +++ b/FModel/ViewModels/ApiEndpoints/EpicApiEndpoint.cs @@ -15,7 +15,7 @@ public class EpicApiEndpoint : AbstractApiProvider private const string _BASIC_TOKEN = "basic MzQ0NmNkNzI2OTRjNGE0NDg1ZDgxYjc3YWRiYjIxNDE6OTIwOWQ0YTVlMjVhNDU3ZmI5YjA3NDg5ZDMxM2I0MWE="; private const string _LAUNCHER_ASSETS = "https://launcher-public-service-prod06.ol.epicgames.com/launcher/api/public/assets/v2/platform/Windows/namespace/fn/catalogItem/4fe75bbc5a674f4f9b356b5c90567da5/app/Fortnite/label/Live"; - public EpicApiEndpoint(IRestClient client) : base(client) + public EpicApiEndpoint(RestClient client) : base(client) { } @@ -30,7 +30,7 @@ public class EpicApiEndpoint : AbstractApiProvider } } - var request = new RestRequest(_LAUNCHER_ASSETS, Method.GET); + var request = new RestRequest(_LAUNCHER_ASSETS); request.AddHeader("Authorization", $"bearer {UserSettings.Default.LastAuthResponse.AccessToken}"); var response = await _client.ExecuteAsync(request, token).ConfigureAwait(false); Log.Information("[{Method}] [{Status}({StatusCode})] '{Resource}'", request.Method, response.StatusDescription, (int) response.StatusCode, request.Resource); @@ -44,7 +44,7 @@ public class EpicApiEndpoint : AbstractApiProvider private async Task GetAuthAsync(CancellationToken token) { - var request = new RestRequest(_OAUTH_URL, Method.POST); + var request = new RestRequest(_OAUTH_URL, Method.Post); request.AddHeader("Authorization", _BASIC_TOKEN); request.AddParameter("grant_type", "client_credentials"); var response = await _client.ExecuteAsync(request, token).ConfigureAwait(false); @@ -57,4 +57,4 @@ public class EpicApiEndpoint : AbstractApiProvider if (string.IsNullOrEmpty(UserSettings.Default.LastAuthResponse.AccessToken)) return true; return DateTime.Now.Subtract(TimeSpan.FromHours(1)) >= UserSettings.Default.LastAuthResponse.ExpiresAt; } -} \ No newline at end of file +} diff --git a/FModel/ViewModels/ApiEndpoints/FModelApi.cs b/FModel/ViewModels/ApiEndpoints/FModelApi.cs index 003adf65..aa763d32 100644 --- a/FModel/ViewModels/ApiEndpoints/FModelApi.cs +++ b/FModel/ViewModels/ApiEndpoints/FModelApi.cs @@ -28,13 +28,13 @@ public class FModelApi : AbstractApiProvider private readonly IDictionary _communityDesigns = new Dictionary(); private ApplicationViewModel _applicationView => ApplicationService.ApplicationView; - public FModelApi(IRestClient client) : base(client) + public FModelApi(RestClient client) : base(client) { } public async Task GetNewsAsync(CancellationToken token) { - var request = new RestRequest($"https://api.fmodel.app/v1/news/{Constants.APP_VERSION}", Method.GET); + var request = new RestRequest($"https://api.fmodel.app/v1/news/{Constants.APP_VERSION}"); var response = await _client.ExecuteAsync(request, token).ConfigureAwait(false); Log.Information("[{Method}] [{Status}({StatusCode})] '{Resource}'", request.Method, response.StatusDescription, (int) response.StatusCode, request.Resource); return response.Data; @@ -47,7 +47,7 @@ public class FModelApi : AbstractApiProvider public async Task GetInfosAsync(CancellationToken token, EUpdateMode updateMode) { - var request = new RestRequest($"https://api.fmodel.app/v1/infos/{updateMode}", Method.GET); + var request = new RestRequest($"https://api.fmodel.app/v1/infos/{updateMode}"); var response = await _client.ExecuteAsync(request, token).ConfigureAwait(false); Log.Information("[{Method}] [{Status}({StatusCode})] '{Resource}'", request.Method, response.StatusDescription, (int) response.StatusCode, request.Resource); return response.Data; @@ -60,7 +60,7 @@ public class FModelApi : AbstractApiProvider public async Task GetBackupsAsync(CancellationToken token, string gameName) { - var request = new RestRequest($"https://api.fmodel.app/v1/backups/{gameName}", Method.GET); + var request = new RestRequest($"https://api.fmodel.app/v1/backups/{gameName}"); var response = await _client.ExecuteAsync(request, token).ConfigureAwait(false); Log.Information("[{Method}] [{Status}({StatusCode})] '{Resource}'", request.Method, response.StatusDescription, (int) response.StatusCode, request.Resource); return response.Data; @@ -73,7 +73,7 @@ public class FModelApi : AbstractApiProvider public async Task GetGamesAsync(CancellationToken token, string gameName) { - var request = new RestRequest($"https://api.fmodel.app/v1/games/{gameName}", Method.GET); + var request = new RestRequest($"https://api.fmodel.app/v1/games/{gameName}"); var response = await _client.ExecuteAsync(request, token).ConfigureAwait(false); Log.Information("[{Method}] [{Status}({StatusCode})] '{Resource}'", request.Method, response.StatusDescription, (int) response.StatusCode, request.Resource); return response.Data; @@ -86,7 +86,7 @@ public class FModelApi : AbstractApiProvider public async Task GetDesignAsync(string designName) { - var request = new RestRequest($"https://api.fmodel.app/v1/designs/{designName}", Method.GET); + var request = new RestRequest($"https://api.fmodel.app/v1/designs/{designName}"); var response = await _client.ExecuteAsync(request).ConfigureAwait(false); Log.Information("[{Method}] [{Status}({StatusCode})] '{Resource}'", request.Method, response.StatusDescription, (int) response.StatusCode, request.Resource); return response.Data != null ? new CommunityDesign(response.Data) : null; @@ -172,7 +172,7 @@ public class FModelApi : AbstractApiProvider private void ShowChangelog(UpdateInfoEventArgs args) { - var request = new RestRequest(args.ChangelogURL, Method.GET); + var request = new RestRequest(args.ChangelogURL); var response = _client.Execute(request); if (string.IsNullOrEmpty(response.Content)) return; @@ -181,4 +181,4 @@ public class FModelApi : AbstractApiProvider _applicationView.CUE4Parse.TabControl.SelectedTab.SetDocumentText(response.Content, false); UserSettings.Default.ShowChangelog = false; } -} \ No newline at end of file +} diff --git a/FModel/ViewModels/ApiEndpoints/FortniteApiEndpoint.cs b/FModel/ViewModels/ApiEndpoints/FortniteApiEndpoint.cs index ced45e01..6878e553 100644 --- a/FModel/ViewModels/ApiEndpoints/FortniteApiEndpoint.cs +++ b/FModel/ViewModels/ApiEndpoints/FortniteApiEndpoint.cs @@ -7,13 +7,13 @@ namespace FModel.ViewModels.ApiEndpoints; public class FortniteApiEndpoint : AbstractApiProvider { - public FortniteApiEndpoint(IRestClient client) : base(client) + public FortniteApiEndpoint(RestClient client) : base(client) { } public async Task GetPlaylistAsync(string playlistId) { - var request = new RestRequest($"https://fortnite-api.com/v1/playlists/{playlistId}", Method.GET); + var request = new RestRequest($"https://fortnite-api.com/v1/playlists/{playlistId}"); var response = await _client.ExecuteAsync(request).ConfigureAwait(false); return response.Data; } @@ -25,8 +25,8 @@ public class FortniteApiEndpoint : AbstractApiProvider public bool TryGetBytes(Uri link, out byte[] data) { - var request = new RestRequest(link, Method.GET); + var request = new RestRequest(link); data = _client.DownloadData(request); return data != null; } -} \ No newline at end of file +} diff --git a/FModel/ViewModels/ApiEndpoints/ValorantApiEndpoint.cs b/FModel/ViewModels/ApiEndpoints/ValorantApiEndpoint.cs index 3a836d2c..29e23594 100644 --- a/FModel/ViewModels/ApiEndpoints/ValorantApiEndpoint.cs +++ b/FModel/ViewModels/ApiEndpoints/ValorantApiEndpoint.cs @@ -20,13 +20,13 @@ public class ValorantApiEndpoint : AbstractApiProvider { private const string _URL = "https://fmodel.fortnite-api.com/valorant/v2/manifest"; - public ValorantApiEndpoint(IRestClient client) : base(client) + public ValorantApiEndpoint(RestClient client) : base(client) { } public async Task GetManifestAsync(CancellationToken token) { - var request = new RestRequest(_URL, Method.GET); + var request = new RestRequest(_URL); var response = await _client.ExecuteAsync(request, token).ConfigureAwait(false); return new VManifest(response.RawBytes); } @@ -310,4 +310,4 @@ public class VPakStream : Stream, ICloneable public override void Flush() => throw new NotSupportedException(); public override void SetLength(long value) => throw new NotSupportedException(); public override void Write(byte[] buffer, int offset, int count) => throw new NotSupportedException(); -} \ No newline at end of file +} diff --git a/FModel/ViewModels/MapViewerViewModel.cs b/FModel/ViewModels/MapViewerViewModel.cs index e179ec3e..1026d68d 100644 --- a/FModel/ViewModels/MapViewerViewModel.cs +++ b/FModel/ViewModels/MapViewerViewModel.cs @@ -214,7 +214,7 @@ public class MapViewerViewModel : ViewModel } public BitmapImage GetImageToSave() => GetImageSource(GetLayerBitmap(true)); - + private SKBitmap GetLayerBitmap(bool withMap) { var ret = new SKBitmap(_widthHeight, _widthHeight, SKColorType.Rgba8888, SKAlphaType.Premul); @@ -471,7 +471,7 @@ public class MapViewerViewModel : ViewModel var patrolsPathBitmap = new SKBitmap(_widthHeight, _widthHeight, SKColorType.Rgba8888, SKAlphaType.Premul); using var c = new SKCanvas(patrolsPathBitmap); - var exports = Utils.LoadExports("/NPCLibrary/LevelOverlays/Artemis_Overlay_S20_NPCLibrary"); + var exports = Utils.LoadExports("/NPCLibrary/LevelOverlays/Artemis_Overlay_S21_NPCLibrary"); foreach (var export in exports) { if (!export.ExportType.Equals("FortAthenaPatrolPath", StringComparison.OrdinalIgnoreCase) || @@ -874,4 +874,4 @@ public class MapViewerViewModel : ViewModel _bitmaps[0]["ApolloGameplay_TagsLocation"] = new MapLayer { Layer = tagsLocationBitmap, IsEnabled = false }; }); } -} \ No newline at end of file +}