diff --git a/.github/workflows/autoclose.yml b/.github/workflows/autoclose.yml new file mode 100644 index 00000000..6c9c7413 --- /dev/null +++ b/.github/workflows/autoclose.yml @@ -0,0 +1,16 @@ +name: Issue Auto Closing + +on: + issues: + types: + - opened + +jobs: + autoclose: + runs-on: ubuntu-latest + steps: + - name: Close Condition + if: contains(toJson(github.event.issue.body), '### Game\r\n\r\nFortnite') + uses: peter-evans/close-issue@v2 + with: + comment: Fortnite related issues are not allowed here. Join the [discord server](https://fmodel.app/discord) and read the common errors channel instead. diff --git a/FModel/Framework/FRestRequest.cs b/FModel/Framework/FRestRequest.cs new file mode 100644 index 00000000..549a00e3 --- /dev/null +++ b/FModel/Framework/FRestRequest.cs @@ -0,0 +1,19 @@ +using System; +using RestSharp; + +namespace FModel.Framework; + +public class FRestRequest : RestRequest +{ + private const int _timeout = 3 * 1000; + + public FRestRequest(string url, Method method = Method.Get) : base(url, method) + { + Timeout = _timeout; + } + + public FRestRequest(Uri uri, Method method = Method.Get) : base(uri, method) + { + Timeout = _timeout; + } +} diff --git a/FModel/ViewModels/ApiEndpoints/BenbotApiEndpoint.cs b/FModel/ViewModels/ApiEndpoints/BenbotApiEndpoint.cs index 9c62a522..ddfb971c 100644 --- a/FModel/ViewModels/ApiEndpoints/BenbotApiEndpoint.cs +++ b/FModel/ViewModels/ApiEndpoints/BenbotApiEndpoint.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Threading; using System.Threading.Tasks; +using FModel.Framework; using FModel.ViewModels.ApiEndpoints.Models; using RestSharp; using Serilog; @@ -16,7 +17,7 @@ public class BenbotApiEndpoint : AbstractApiProvider public async Task GetAesKeysAsync(CancellationToken token) { - var request = new RestRequest("https://benbot.app/api/v2/aes") + var request = new FRestRequest("https://benbot.app/api/v2/aes") { OnBeforeDeserialization = resp => { resp.ContentType = "application/json; charset=utf-8"; } }; @@ -32,7 +33,7 @@ public class BenbotApiEndpoint : AbstractApiProvider public async Task GetMappingsAsync(CancellationToken token) { - var request = new RestRequest("https://benbot.app/api/v1/mappings") + var request = new FRestRequest("https://benbot.app/api/v1/mappings") { OnBeforeDeserialization = resp => { resp.ContentType = "application/json; charset=utf-8"; } }; @@ -48,7 +49,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") + var request = new FRestRequest("https://benbot.app/api/v1/hotfixes") { OnBeforeDeserialization = resp => { resp.ContentType = "application/json; charset=utf-8"; } }; @@ -65,7 +66,7 @@ public class BenbotApiEndpoint : AbstractApiProvider public async Task DownloadFileAsync(string fileLink, string installationPath) { - var request = new RestRequest(fileLink); + var request = new FRestRequest(fileLink); var data = _client.DownloadData(request); await File.WriteAllBytesAsync(installationPath, data); } diff --git a/FModel/ViewModels/ApiEndpoints/EpicApiEndpoint.cs b/FModel/ViewModels/ApiEndpoints/EpicApiEndpoint.cs index 97277d6c..4c391f7e 100644 --- a/FModel/ViewModels/ApiEndpoints/EpicApiEndpoint.cs +++ b/FModel/ViewModels/ApiEndpoints/EpicApiEndpoint.cs @@ -2,6 +2,7 @@ using System.Threading; using System.Threading.Tasks; using EpicManifestParser.Objects; +using FModel.Framework; using FModel.Settings; using FModel.ViewModels.ApiEndpoints.Models; using RestSharp; @@ -30,7 +31,7 @@ public class EpicApiEndpoint : AbstractApiProvider } } - var request = new RestRequest(_LAUNCHER_ASSETS); + var request = new FRestRequest(_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, response.ResponseUri?.OriginalString); @@ -44,7 +45,7 @@ public class EpicApiEndpoint : AbstractApiProvider private async Task GetAuthAsync(CancellationToken token) { - var request = new RestRequest(_OAUTH_URL, Method.Post); + var request = new FRestRequest(_OAUTH_URL, Method.Post); request.AddHeader("Authorization", _BASIC_TOKEN); request.AddParameter("grant_type", "client_credentials"); var response = await _client.ExecuteAsync(request, token).ConfigureAwait(false); diff --git a/FModel/ViewModels/ApiEndpoints/FModelApi.cs b/FModel/ViewModels/ApiEndpoints/FModelApi.cs index a488b030..b0b5c2ba 100644 --- a/FModel/ViewModels/ApiEndpoints/FModelApi.cs +++ b/FModel/ViewModels/ApiEndpoints/FModelApi.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using System.Windows; using AutoUpdaterDotNET; using FModel.Extensions; +using FModel.Framework; using FModel.Services; using FModel.Settings; using FModel.ViewModels.ApiEndpoints.Models; @@ -34,7 +35,7 @@ public class FModelApi : AbstractApiProvider public async Task GetNewsAsync(CancellationToken token, string game) { - var request = new RestRequest($"https://api.fmodel.app/v1/news/{Constants.APP_VERSION}"); + var request = new FRestRequest($"https://api.fmodel.app/v1/news/{Constants.APP_VERSION}"); request.AddParameter("game", game); var response = await _client.ExecuteAsync(request, token).ConfigureAwait(false); Log.Information("[{Method}] [{Status}({StatusCode})] '{Resource}'", request.Method, response.StatusDescription, (int) response.StatusCode, response.ResponseUri?.OriginalString); @@ -48,7 +49,7 @@ public class FModelApi : AbstractApiProvider public async Task GetInfosAsync(CancellationToken token, EUpdateMode updateMode) { - var request = new RestRequest($"https://api.fmodel.app/v1/infos/{updateMode}"); + var request = new FRestRequest($"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, response.ResponseUri?.OriginalString); return response.Data; @@ -61,7 +62,7 @@ public class FModelApi : AbstractApiProvider public async Task GetBackupsAsync(CancellationToken token, string gameName) { - var request = new RestRequest($"https://api.fmodel.app/v1/backups/{gameName}"); + var request = new FRestRequest($"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, response.ResponseUri?.OriginalString); return response.Data; @@ -74,7 +75,7 @@ public class FModelApi : AbstractApiProvider public async Task GetGamesAsync(CancellationToken token, string gameName) { - var request = new RestRequest($"https://api.fmodel.app/v1/games/{gameName}"); + var request = new FRestRequest($"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, response.ResponseUri?.OriginalString); return response.Data; @@ -87,7 +88,7 @@ public class FModelApi : AbstractApiProvider public async Task GetDesignAsync(string designName) { - var request = new RestRequest($"https://api.fmodel.app/v1/designs/{designName}"); + var request = new FRestRequest($"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, response.ResponseUri?.OriginalString); return response.Data != null ? new CommunityDesign(response.Data) : null; @@ -173,7 +174,7 @@ public class FModelApi : AbstractApiProvider private void ShowChangelog(UpdateInfoEventArgs args) { - var request = new RestRequest(args.ChangelogURL); + var request = new FRestRequest(args.ChangelogURL); var response = _client.Execute(request); if (string.IsNullOrEmpty(response.Content)) return; diff --git a/FModel/ViewModels/ApiEndpoints/FortniteApiEndpoint.cs b/FModel/ViewModels/ApiEndpoints/FortniteApiEndpoint.cs index 6878e553..c2036976 100644 --- a/FModel/ViewModels/ApiEndpoints/FortniteApiEndpoint.cs +++ b/FModel/ViewModels/ApiEndpoints/FortniteApiEndpoint.cs @@ -2,6 +2,7 @@ using FModel.ViewModels.ApiEndpoints.Models; using RestSharp; using System.Threading.Tasks; +using FModel.Framework; namespace FModel.ViewModels.ApiEndpoints; @@ -13,7 +14,7 @@ public class FortniteApiEndpoint : AbstractApiProvider public async Task GetPlaylistAsync(string playlistId) { - var request = new RestRequest($"https://fortnite-api.com/v1/playlists/{playlistId}"); + var request = new FRestRequest($"https://fortnite-api.com/v1/playlists/{playlistId}"); var response = await _client.ExecuteAsync(request).ConfigureAwait(false); return response.Data; } @@ -25,7 +26,7 @@ public class FortniteApiEndpoint : AbstractApiProvider public bool TryGetBytes(Uri link, out byte[] data) { - var request = new RestRequest(link); + var request = new FRestRequest(link); data = _client.DownloadData(request); return data != null; } diff --git a/FModel/ViewModels/ApiEndpoints/ValorantApiEndpoint.cs b/FModel/ViewModels/ApiEndpoints/ValorantApiEndpoint.cs index 29e23594..8c98133a 100644 --- a/FModel/ViewModels/ApiEndpoints/ValorantApiEndpoint.cs +++ b/FModel/ViewModels/ApiEndpoints/ValorantApiEndpoint.cs @@ -13,6 +13,7 @@ using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; +using FModel.Framework; namespace FModel.ViewModels.ApiEndpoints; @@ -26,7 +27,7 @@ public class ValorantApiEndpoint : AbstractApiProvider public async Task GetManifestAsync(CancellationToken token) { - var request = new RestRequest(_URL); + var request = new FRestRequest(_URL); var response = await _client.ExecuteAsync(request, token).ConfigureAwait(false); return new VManifest(response.RawBytes); }