From 1364cdc38c1550a5952d0c49fe4d727ce01462ce Mon Sep 17 00:00:00 2001 From: estrogen elf <87099578+BlossomiShymae@users.noreply.github.com> Date: Thu, 29 May 2025 15:10:00 -0500 Subject: [PATCH] feat: Add Game Client to Endpoints --- Needlework.Net/DataSource.cs | 2 +- .../ViewModels/Pages/ConsoleViewModel.cs | 11 +- .../Pages/Endpoints/EndpointViewModel.cs | 4 +- .../Endpoints/EndpointsNavigationViewModel.cs | 23 +++- .../Pages/Endpoints/EndpointsTabViewModel.cs | 44 +++++--- .../Pages/Endpoints/EndpointsViewModel.cs | 17 ++- .../Pages/Endpoints/OperationViewModel.cs | 62 +++++++--- .../Pages/Endpoints/PathOperationViewModel.cs | 12 +- ...equestViewModel.cs => RequestViewModel.cs} | 106 +++++++++++++++--- Needlework.Net/Views/Pages/ConsoleView.axaml | 8 +- .../Views/Pages/ConsoleView.axaml.cs | 10 +- .../Views/Pages/Endpoints/EndpointView.axaml | 16 +-- .../Pages/Endpoints/EndpointView.axaml.cs | 18 +-- .../Pages/Endpoints/EndpointsTabView.axaml | 21 +++- Needlework.Net/Views/Pages/HomeView.axaml | 2 +- 15 files changed, 257 insertions(+), 99 deletions(-) rename Needlework.Net/ViewModels/Shared/{LcuRequestViewModel.cs => RequestViewModel.cs} (56%) diff --git a/Needlework.Net/DataSource.cs b/Needlework.Net/DataSource.cs index 1daab6f..b9eba09 100644 --- a/Needlework.Net/DataSource.cs +++ b/Needlework.Net/DataSource.cs @@ -43,7 +43,7 @@ namespace Needlework.Net var lcuSchemaRaw = reader.Read(lcuSchemaStream, out var _); _lcuSchemaDocument = new Document(lcuSchemaRaw); - var lolClientStream = await _httpClient.GetStreamAsync("https://raw.githubusercontent.com/BlossomiShymae/poroschema/refs/heads/main/schemas/lolclient.json"); + var lolClientStream = await _httpClient.GetStreamAsync("https://raw.githubusercontent.com/AlsoSylv/Irelia/refs/heads/master/schemas/game_schema.json"); var lolClientRaw = reader.Read(lolClientStream, out var _); _lolClientDocument = new Document(lolClientRaw); } diff --git a/Needlework.Net/ViewModels/Pages/ConsoleViewModel.cs b/Needlework.Net/ViewModels/Pages/ConsoleViewModel.cs index e807798..c26aadb 100644 --- a/Needlework.Net/ViewModels/Pages/ConsoleViewModel.cs +++ b/Needlework.Net/ViewModels/Pages/ConsoleViewModel.cs @@ -4,6 +4,7 @@ using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using Microsoft.Extensions.Logging; using Needlework.Net.ViewModels.Shared; +using System.Net.Http; using System.Threading.Tasks; namespace Needlework.Net.ViewModels.Pages; @@ -14,19 +15,19 @@ public partial class ConsoleViewModel : PageBase public IAvaloniaList RequestPaths { get; } = new AvaloniaList(); [ObservableProperty] private bool _isBusy = true; - [ObservableProperty] private LcuRequestViewModel _lcuRequest; + [ObservableProperty] private RequestViewModel _request; private readonly DataSource _dataSource; - public ConsoleViewModel(ILogger lcuRequestViewModelLogger, DataSource dataSource) : base("Console", "terminal", -200) + public ConsoleViewModel(ILogger requestViewModelLogger, DataSource dataSource, HttpClient httpClient) : base("Console", "terminal", -200) { - _lcuRequest = new(lcuRequestViewModelLogger); + _request = new(requestViewModelLogger, Endpoints.Tab.LCU, httpClient); _dataSource = dataSource; } public override async Task InitializeAsync() { - var document = await _dataSource.GetLolClientDocumentAsync(); + var document = await _dataSource.GetLcuSchemaDocumentAsync(); Dispatcher.UIThread.Invoke(() => { RequestPaths.Clear(); @@ -39,6 +40,6 @@ public partial class ConsoleViewModel : PageBase [RelayCommand] private async Task SendRequest() { - await LcuRequest.ExecuteAsync(); + await Request.ExecuteAsync(); } } diff --git a/Needlework.Net/ViewModels/Pages/Endpoints/EndpointViewModel.cs b/Needlework.Net/ViewModels/Pages/Endpoints/EndpointViewModel.cs index 953959d..bb8d121 100644 --- a/Needlework.Net/ViewModels/Pages/Endpoints/EndpointViewModel.cs +++ b/Needlework.Net/ViewModels/Pages/Endpoints/EndpointViewModel.cs @@ -21,10 +21,10 @@ public partial class EndpointViewModel : ObservableObject public event EventHandler? PathOperationSelected; - public EndpointViewModel(string endpoint, ILogger lcuRequestViewModelLogger, Models.Document lcuSchemaDocument) + public EndpointViewModel(string endpoint, ILogger requestViewModelLogger, Models.Document document, Tab tab, System.Net.Http.HttpClient httpClient) { Endpoint = endpoint; - PathOperations = new AvaloniaList(lcuSchemaDocument.Plugins[endpoint].Select(x => new PathOperationViewModel(x, lcuRequestViewModelLogger, lcuSchemaDocument))); + PathOperations = new AvaloniaList(document.Plugins[endpoint].Select(x => new PathOperationViewModel(x, requestViewModelLogger, document, tab, httpClient))); FilteredPathOperations = new AvaloniaList(PathOperations); } diff --git a/Needlework.Net/ViewModels/Pages/Endpoints/EndpointsNavigationViewModel.cs b/Needlework.Net/ViewModels/Pages/Endpoints/EndpointsNavigationViewModel.cs index 8404a55..6f897ac 100644 --- a/Needlework.Net/ViewModels/Pages/Endpoints/EndpointsNavigationViewModel.cs +++ b/Needlework.Net/ViewModels/Pages/Endpoints/EndpointsNavigationViewModel.cs @@ -13,14 +13,27 @@ public partial class EndpointsNavigationViewModel : ObservableObject [ObservableProperty] private ObservableObject _activeViewModel; [ObservableProperty] private ObservableObject _endpointsViewModel; - [ObservableProperty] private string _title = string.Empty; + [ObservableProperty] private string _title; private readonly Action _onEndpointNavigation; + private readonly Tab _tab; - public EndpointsNavigationViewModel(IAvaloniaList plugins, Action onEndpointNavigation, ILogger lcuRequestViewModelLogger, Models.Document lcuSchemaDocument) + public EndpointsNavigationViewModel(IAvaloniaList plugins, Action onEndpointNavigation, ILogger requestViewModelLogger, Models.Document document, Tab tab, System.Net.Http.HttpClient httpClient) { - _activeViewModel = _endpointsViewModel = new EndpointsViewModel(plugins, OnClicked, lcuRequestViewModelLogger, lcuSchemaDocument); + _activeViewModel = _endpointsViewModel = new EndpointsViewModel(plugins, OnClicked, requestViewModelLogger, document, tab, httpClient); _onEndpointNavigation = onEndpointNavigation; + _tab = tab; + _title = GetTitle(tab); + } + + private string GetTitle(Tab tab) + { + return tab switch + { + Tab.LCU => "LCU", + Tab.GameClient => "Game Client", + _ => string.Empty, + }; } private void OnClicked(ObservableObject viewModel) @@ -28,7 +41,7 @@ public partial class EndpointsNavigationViewModel : ObservableObject ActiveViewModel = viewModel; if (viewModel is EndpointViewModel endpoint) { - Title = endpoint.Title; + Title = $"{GetTitle(_tab)} - {endpoint.Title}"; _onEndpointNavigation.Invoke(endpoint.Title, Guid); } } @@ -37,7 +50,7 @@ public partial class EndpointsNavigationViewModel : ObservableObject private void GoBack() { ActiveViewModel = EndpointsViewModel; - Title = string.Empty; + Title = GetTitle(_tab); _onEndpointNavigation.Invoke(null, Guid); } } diff --git a/Needlework.Net/ViewModels/Pages/Endpoints/EndpointsTabViewModel.cs b/Needlework.Net/ViewModels/Pages/Endpoints/EndpointsTabViewModel.cs index b3dd063..00db1f9 100644 --- a/Needlework.Net/ViewModels/Pages/Endpoints/EndpointsTabViewModel.cs +++ b/Needlework.Net/ViewModels/Pages/Endpoints/EndpointsTabViewModel.cs @@ -2,15 +2,22 @@ using Avalonia.Threading; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; -using CommunityToolkit.Mvvm.Messaging; using FluentAvalonia.UI.Controls; using Microsoft.Extensions.Logging; +using Needlework.Net.Models; using Needlework.Net.ViewModels.Shared; using System; +using System.Net.Http; using System.Threading.Tasks; namespace Needlework.Net.ViewModels.Pages.Endpoints; +public enum Tab +{ + LCU, + GameClient +} + public partial class EndpointsTabViewModel : PageBase { public IAvaloniaList Plugins { get; } = new AvaloniaList(); @@ -18,32 +25,41 @@ public partial class EndpointsTabViewModel : PageBase [ObservableProperty] private bool _isBusy = true; - private readonly ILogger _lcuRequestViewModelLogger; + private readonly ILogger _requestViewModelLogger; private readonly DataSource _dataSource; + private readonly HttpClient _httpClient; - public EndpointsTabViewModel(ILogger lcuRequestViewModelLogger, DataSource dataSource) : base("Endpoints", "list-alt", -500) + public EndpointsTabViewModel(ILogger requestViewModelLogger, DataSource dataSource, HttpClient httpClient) : base("Endpoints", "list-alt", -500) { - _lcuRequestViewModelLogger = lcuRequestViewModelLogger; + _requestViewModelLogger = requestViewModelLogger; _dataSource = dataSource; - WeakReferenceMessenger.Default.RegisterAll(this); + _httpClient = httpClient; } public override async Task InitializeAsync() { - var document = await _dataSource.GetLcuSchemaDocumentAsync(); - Plugins.Clear(); - Plugins.AddRange(document.Plugins.Keys); - await Dispatcher.UIThread.Invoke(AddEndpoint); + await Dispatcher.UIThread.Invoke(async () => await AddEndpoint(Tab.LCU)); IsBusy = false; IsInitialized = true; } [RelayCommand] - private async Task AddEndpoint() + private async Task AddEndpoint(Tab tab) { - var lcuSchemaDocument = await _dataSource.GetLcuSchemaDocumentAsync(); + Document document = tab switch + { + Tab.LCU => await _dataSource.GetLcuSchemaDocumentAsync(), + Tab.GameClient => await _dataSource.GetLolClientDocumentAsync(), + _ => throw new NotImplementedException(), + }; + + Plugins.Clear(); + Plugins.AddRange(document.Plugins.Keys); + + var vm = new EndpointsNavigationViewModel(Plugins, OnEndpointNavigation, _requestViewModelLogger, document, tab, _httpClient); Endpoints.Add(new() { - Content = new EndpointsNavigationViewModel(Plugins, OnEndpointNavigation, _lcuRequestViewModelLogger, lcuSchemaDocument), + Content = vm, + Header = vm.Title, Selected = true }); } @@ -54,7 +70,7 @@ public partial class EndpointsTabViewModel : PageBase { if (endpoint.Content.Guid.Equals(guid)) { - endpoint.Header = title ?? "Endpoints"; + endpoint.Header = endpoint.Content.Title; break; } } @@ -63,7 +79,7 @@ public partial class EndpointsTabViewModel : PageBase public partial class EndpointItem : ObservableObject { - [ObservableProperty] private string _header = "Endpoints"; + [ObservableProperty] private string _header = string.Empty; public IconSource IconSource { get; set; } = new SymbolIconSource() { Symbol = Symbol.Document, FontSize = 20.0, Foreground = Avalonia.Media.Brushes.White }; public bool Selected { get; set; } = false; public required EndpointsNavigationViewModel Content { get; init; } diff --git a/Needlework.Net/ViewModels/Pages/Endpoints/EndpointsViewModel.cs b/Needlework.Net/ViewModels/Pages/Endpoints/EndpointsViewModel.cs index c9f734e..4798ff0 100644 --- a/Needlework.Net/ViewModels/Pages/Endpoints/EndpointsViewModel.cs +++ b/Needlework.Net/ViewModels/Pages/Endpoints/EndpointsViewModel.cs @@ -6,6 +6,7 @@ using Needlework.Net.Models; using Needlework.Net.ViewModels.Shared; using System; using System.Linq; +using System.Net.Http; namespace Needlework.Net.ViewModels.Pages.Endpoints; @@ -19,16 +20,20 @@ public partial class EndpointsViewModel : ObservableObject public Action OnClicked { get; } - private readonly ILogger _lcuRequestViewModelLogger; - private readonly Document _lcuSchemaDocument; + private readonly ILogger _requestViewModelLogger; + private readonly Document _document; + private readonly Tab _tab; + private readonly HttpClient _httpClient; - public EndpointsViewModel(IAvaloniaList plugins, Action onClicked, ILogger lcuRequestViewModelLogger, Models.Document lcuSchemaDocument) + public EndpointsViewModel(IAvaloniaList plugins, Action onClicked, ILogger requestViewModelLogger, Models.Document document, Tab tab, System.Net.Http.HttpClient httpClient) { Plugins = new AvaloniaList(plugins); Query = new AvaloniaList(plugins); OnClicked = onClicked; - _lcuRequestViewModelLogger = lcuRequestViewModelLogger; - _lcuSchemaDocument = lcuSchemaDocument; + _requestViewModelLogger = requestViewModelLogger; + _document = document; + _tab = tab; + _httpClient = httpClient; } partial void OnSearchChanged(string value) @@ -45,6 +50,6 @@ public partial class EndpointsViewModel : ObservableObject { if (string.IsNullOrEmpty(value)) return; - OnClicked.Invoke(new EndpointViewModel(value, _lcuRequestViewModelLogger, _lcuSchemaDocument)); + OnClicked.Invoke(new EndpointViewModel(value, _requestViewModelLogger, _document, _tab, _httpClient)); } } diff --git a/Needlework.Net/ViewModels/Pages/Endpoints/OperationViewModel.cs b/Needlework.Net/ViewModels/Pages/Endpoints/OperationViewModel.cs index 303b4ea..e45be2f 100644 --- a/Needlework.Net/ViewModels/Pages/Endpoints/OperationViewModel.cs +++ b/Needlework.Net/ViewModels/Pages/Endpoints/OperationViewModel.cs @@ -3,6 +3,7 @@ using CommunityToolkit.Mvvm.ComponentModel; using Microsoft.OpenApi.Models; using Needlework.Net.Models; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Text.Json; @@ -21,23 +22,23 @@ public partial class OperationViewModel : ObservableObject public IAvaloniaReadOnlyList QueryParameters { get; } public string? RequestTemplate { get; } - public OperationViewModel(OpenApiOperation operation, Models.Document lcuSchemaDocument) + public OperationViewModel(OpenApiOperation operation, Models.Document document) { Summary = operation.Summary ?? string.Empty; Description = operation.Description ?? string.Empty; IsRequestBody = operation.RequestBody != null; ReturnType = GetReturnType(operation.Responses); - RequestClasses = GetRequestClasses(operation.RequestBody, lcuSchemaDocument); - ResponseClasses = GetResponseClasses(operation.Responses, lcuSchemaDocument); + RequestClasses = GetRequestClasses(operation.RequestBody, document); + ResponseClasses = GetResponseClasses(operation.Responses, document); PathParameters = GetParameters(operation.Parameters, ParameterLocation.Path); QueryParameters = GetParameters(operation.Parameters, ParameterLocation.Query); RequestBodyType = GetRequestBodyType(operation.RequestBody); - RequestTemplate = GetRequestTemplate(operation.RequestBody, lcuSchemaDocument); + RequestTemplate = GetRequestTemplate(operation.RequestBody, document); } - private string? GetRequestTemplate(OpenApiRequestBody? requestBody, Document lcuSchemaDocument) + private string? GetRequestTemplate(OpenApiRequestBody? requestBody, Document document) { - var requestClasses = GetRequestClasses(requestBody, lcuSchemaDocument); + var requestClasses = GetRequestClasses(requestBody, document); if (requestClasses.Count == 0) { var type = GetRequestBodyType(requestBody); @@ -132,17 +133,40 @@ public partial class OperationViewModel : ObservableObject return pathParameters; } - private AvaloniaList GetResponseClasses(OpenApiResponses responses, Document lcuSchemaDocument) + private bool TryGetResponse(OpenApiResponses responses, [NotNullWhen(true)] out OpenApiResponse? response) { - if (responses.TryGetValue("2XX", out var response) - && response.Content.TryGetValue("application/json", out var media)) + response = null; + var flag = false; + if (responses.TryGetValue("2XX", out var x)) { - var document = lcuSchemaDocument.OpenApiDocument; + response = x; + flag = true; + } + else if (responses.TryGetValue("200", out var y)) + { + response = y; + flag = true; + } + return flag; + + } + + private AvaloniaList GetResponseClasses(OpenApiResponses responses, Document document) + { + if (!TryGetResponse(responses, out var response)) + return []; + + if (response.Content.TryGetValue("application/json", out var media)) + { + var rawDocument = document.OpenApiDocument; var schema = media.Schema; + if (schema == null) return []; + AvaloniaList propertyClasses = []; - WalkSchema(schema, propertyClasses, document); + WalkSchema(schema, propertyClasses, rawDocument); return propertyClasses; } + return []; } @@ -185,12 +209,12 @@ public partial class OperationViewModel : ObservableObject || type.Contains("number")); } - private AvaloniaList GetRequestClasses(OpenApiRequestBody? requestBody, Document lcuSchemaDocument) + private AvaloniaList GetRequestClasses(OpenApiRequestBody? requestBody, Document document) { if (requestBody == null) return []; if (requestBody.Content.TryGetValue("application/json", out var media)) { - var document = lcuSchemaDocument.OpenApiDocument; + var rawDocument = document.OpenApiDocument; var schema = media.Schema; if (schema == null) return []; @@ -198,9 +222,9 @@ public partial class OperationViewModel : ObservableObject if (IsComponent(type)) { var componentId = GetComponentId(schema); - var componentSchema = document.Components.Schemas[componentId]; + var componentSchema = rawDocument.Components.Schemas[componentId]; AvaloniaList propertyClasses = []; - WalkSchema(componentSchema, propertyClasses, document); + WalkSchema(componentSchema, propertyClasses, rawDocument); return propertyClasses; } } @@ -209,12 +233,15 @@ public partial class OperationViewModel : ObservableObject private string GetReturnType(OpenApiResponses responses) { - if (responses.TryGetValue("2XX", out var response) - && response.Content.TryGetValue("application/json", out var media)) + if (!TryGetResponse(responses, out var response)) + return "none"; + + if (response.Content.TryGetValue("application/json", out var media)) { var schema = media.Schema; return GetSchemaType(schema); } + return "none"; } @@ -223,6 +250,7 @@ public partial class OperationViewModel : ObservableObject if (schema.Reference != null) return schema.Reference.Id; if (schema.Type == "object" && schema.AdditionalProperties?.Reference != null) return schema.AdditionalProperties.Reference.Id; if (schema.Type == "integer" || schema.Type == "number") return $"{schema.Type}:{schema.Format}"; + if (schema.Type == "array" && schema.AdditionalProperties?.Reference != null) return schema.AdditionalProperties.Reference.Id; if (schema.Type == "array" && schema.Items.Reference != null) return $"{schema.Items.Reference.Id}[]"; if (schema.Type == "array" && (schema.Items.Type == "integer" || schema.Items.Type == "number")) return $"{schema.Items.Type}:{schema.Items.Format}[]"; if (schema.Type == "array") return $"{schema.Items.Type}[]"; diff --git a/Needlework.Net/ViewModels/Pages/Endpoints/PathOperationViewModel.cs b/Needlework.Net/ViewModels/Pages/Endpoints/PathOperationViewModel.cs index 679ef92..b013a10 100644 --- a/Needlework.Net/ViewModels/Pages/Endpoints/PathOperationViewModel.cs +++ b/Needlework.Net/ViewModels/Pages/Endpoints/PathOperationViewModel.cs @@ -17,13 +17,13 @@ public partial class PathOperationViewModel : ObservableObject public string Url { get; } [ObservableProperty] private bool _isBusy; - [ObservableProperty] private Lazy _lcuRequest; + [ObservableProperty] private Lazy _request; - public PathOperationViewModel(PathOperation pathOperation, ILogger lcuRequestViewModelLogger, Document lcuSchemaDocument) + public PathOperationViewModel(PathOperation pathOperation, ILogger requestViewModelLogger, Document document, Tab tab, System.Net.Http.HttpClient httpClient) { Path = pathOperation.Path; - Operation = new OperationViewModel(pathOperation.Operation, lcuSchemaDocument); - LcuRequest = new(() => new LcuRequestViewModel(lcuRequestViewModelLogger) + Operation = new OperationViewModel(pathOperation.Operation, document); + Request = new(() => new RequestViewModel(requestViewModelLogger, tab, httpClient) { Method = pathOperation.Method.ToUpper() }); @@ -50,8 +50,8 @@ public partial class PathOperationViewModel : ObservableObject } } - LcuRequest.Value.RequestPath = sb.ToString(); - await LcuRequest.Value.ExecuteAsync(); + Request.Value.RequestPath = sb.ToString(); + await Request.Value.ExecuteAsync(); } [RelayCommand] diff --git a/Needlework.Net/ViewModels/Shared/LcuRequestViewModel.cs b/Needlework.Net/ViewModels/Shared/RequestViewModel.cs similarity index 56% rename from Needlework.Net/ViewModels/Shared/LcuRequestViewModel.cs rename to Needlework.Net/ViewModels/Shared/RequestViewModel.cs index fbe9c92..e78bca8 100644 --- a/Needlework.Net/ViewModels/Shared/LcuRequestViewModel.cs +++ b/Needlework.Net/ViewModels/Shared/RequestViewModel.cs @@ -5,6 +5,7 @@ using CommunityToolkit.Mvvm.Messaging; using Microsoft.Extensions.Logging; using Needlework.Net.Messages; using Needlework.Net.ViewModels.MainWindow; +using Needlework.Net.ViewModels.Pages.Endpoints; using System; using System.Net.Http; using System.Text.Json; @@ -12,7 +13,7 @@ using System.Threading.Tasks; namespace Needlework.Net.ViewModels.Shared; -public partial class LcuRequestViewModel : ObservableObject +public partial class RequestViewModel : ObservableObject { [ObservableProperty] private string? _method = "GET"; [ObservableProperty] private SolidColorBrush _color = new(GetColor("GET")); @@ -29,14 +30,18 @@ public partial class LcuRequestViewModel : ObservableObject [ObservableProperty] private string? _responseAuthorization = null; [ObservableProperty] private string? _responseBody = null; - public event EventHandler? RequestText; + public event EventHandler? RequestText; public event EventHandler? UpdateText; - private readonly ILogger _logger; + private readonly ILogger _logger; + private readonly Tab _tab; + private readonly HttpClient _httpClient; - public LcuRequestViewModel(ILogger logger) + public RequestViewModel(ILogger logger, Pages.Endpoints.Tab tab, HttpClient httpClient) { _logger = logger; + _tab = tab; + _httpClient = httpClient; } partial void OnMethodChanged(string? oldValue, string? newValue) @@ -47,25 +52,80 @@ public partial class LcuRequestViewModel : ObservableObject } public async Task ExecuteAsync() + { + switch (_tab) + { + case Tab.LCU: + await ExecuteLcuAsync(); + break; + case Tab.GameClient: + await ExecuteGameClientAsync(); + break; + default: + break; + } + } + + private async Task ExecuteGameClientAsync() { try { IsRequestBusy = true; if (string.IsNullOrEmpty(RequestPath)) throw new Exception("Path is empty."); + var method = GetMethod(); - var method = Method switch + _logger.LogDebug("Sending request: {Tuple}", (Method, RequestPath)); + RequestText?.Invoke(this, this); + var content = new StringContent(RequestBody ?? string.Empty, new System.Net.Http.Headers.MediaTypeHeaderValue("application/json")); + var responsePath = $"https://127.0.0.1:2999{RequestPath}"; + var response = await _httpClient.SendAsync(new HttpRequestMessage(method, responsePath) { Content = content }); + var responseBody = await response.Content.ReadAsByteArrayAsync(); + + var body = responseBody.Length > 0 ? JsonSerializer.Serialize(JsonSerializer.Deserialize(responseBody), App.JsonSerializerOptions) : string.Empty; + if (body.Length > App.MaxCharacters) { - "GET" => HttpMethod.Get, - "POST" => HttpMethod.Post, - "PUT" => HttpMethod.Put, - "DELETE" => HttpMethod.Delete, - "HEAD" => HttpMethod.Head, - "PATCH" => HttpMethod.Patch, - "OPTIONS" => HttpMethod.Options, - "TRACE" => HttpMethod.Trace, - _ => throw new Exception("Method is not selected or missing."), - }; + WeakReferenceMessenger.Default.Send(new OopsiesDialogRequestedMessage(body)); + UpdateText?.Invoke(this, string.Empty); + } + else + { + ResponseBody = body; + UpdateText?.Invoke(this, body); + } + + ResponseStatus = $"{(int)response.StatusCode} {response.StatusCode.ToString()}"; + ResponsePath = responsePath; + + } + catch (Exception ex) + { + _logger.LogError(ex, "Request failed: {Tuple}", (Method, RequestPath)); + WeakReferenceMessenger.Default.Send(new InfoBarUpdateMessage(new InfoBarViewModel("Request Failed", true, ex.Message, FluentAvalonia.UI.Controls.InfoBarSeverity.Error, TimeSpan.FromSeconds(5)))); + UpdateText?.Invoke(this, string.Empty); + + ResponseStatus = null; + ResponsePath = null; + ResponseAuthentication = null; + ResponseAuthorization = null; + ResponseUsername = null; + ResponsePassword = null; + ResponseBody = null; + } + finally + { + IsRequestBusy = false; + } + } + + private async Task ExecuteLcuAsync() + { + try + { + IsRequestBusy = true; + if (string.IsNullOrEmpty(RequestPath)) + throw new Exception("Path is empty."); + var method = GetMethod(); _logger.LogDebug("Sending request: {Tuple}", (Method, RequestPath)); @@ -116,6 +176,22 @@ public partial class LcuRequestViewModel : ObservableObject } } + private HttpMethod GetMethod() + { + return Method switch + { + "GET" => HttpMethod.Get, + "POST" => HttpMethod.Post, + "PUT" => HttpMethod.Put, + "DELETE" => HttpMethod.Delete, + "HEAD" => HttpMethod.Head, + "PATCH" => HttpMethod.Patch, + "OPTIONS" => HttpMethod.Options, + "TRACE" => HttpMethod.Trace, + _ => throw new Exception("Method is not selected or missing."), + }; + } + private static Color GetColor(string method) => method switch { "GET" => Avalonia.Media.Color.FromRgb(95, 99, 186), diff --git a/Needlework.Net/Views/Pages/ConsoleView.axaml b/Needlework.Net/Views/Pages/ConsoleView.axaml index 3deac52..dba20e0 100644 --- a/Needlework.Net/Views/Pages/ConsoleView.axaml +++ b/Needlework.Net/Views/Pages/ConsoleView.axaml @@ -19,13 +19,13 @@ + Text="{Binding Request.ResponsePath}"/> -