14 Commits

Author SHA1 Message Date
BlossomiShymae
e0a2685dcf Increment version for fix 2024-08-13 02:44:49 -05:00
BlossomiShymae
ca2f8c4852 Fix events processing too quickly 2024-08-13 02:43:47 -05:00
BlossomiShymae
8f81aa526e Add update checker 2024-08-13 02:41:02 -05:00
BlossomiShymae
360a0f28c7 Fix responses not being set to empty on oopsies 2024-08-10 06:09:48 -05:00
BlossomiShymae
4d6e04acb8 Fix bug where parameter types weren't correct 2024-08-10 05:56:06 -05:00
BlossomiShymae
dc538ee5ce Fix bug where parameters weren't showing up 2024-08-10 05:52:42 -05:00
BlossomiShymae
16d18878e0 Increment version 2024-08-10 05:04:47 -05:00
BlossomiShymae
893f226463 Add search for endpoint operations 2024-08-10 05:01:09 -05:00
BlossomiShymae
90a2a1747a Increment version 2024-08-10 02:22:03 -05:00
BlossomiShymae
1e9e466194 Change event viewer style 2024-08-10 02:20:54 -05:00
BlossomiShymae
6dd0476cea Fix event viewer incorrectly displaying JSON 2024-08-10 02:19:00 -05:00
Blossomi Shymae
c98ce85583 Update README.md 2024-08-09 18:52:01 -05:00
Blossomi Shymae
0e3456f006 Update README.md 2024-08-09 18:45:14 -05:00
Blossomi Shymae
fe6de3fa15 Update README.md 2024-08-09 18:39:42 -05:00
10 changed files with 109 additions and 22 deletions

View File

@@ -0,0 +1,12 @@
using System.Text.Json.Serialization;
namespace Needlework.Net.Desktop
{
public class GithubRelease
{
[JsonPropertyName("tag_name")]
public string TagName { get; set; } = string.Empty;
public bool IsLatest(int version) => int.Parse(TagName.Replace(".", "")) > version;
}
}

View File

@@ -9,10 +9,10 @@
</PropertyGroup>
<PropertyGroup Label="Avalonia">
<AvaloniaXamlIlDebuggerLaunch>False</AvaloniaXamlIlDebuggerLaunch>
<ApplicationIcon>app.ico</ApplicationIcon>
<ApplicationIcon>app.ico</ApplicationIcon>
<AssemblyName>NeedleworkDotNet</AssemblyName>
<AssemblyVersion>0.1.0.0</AssemblyVersion>
<FileVersion>0.1.0.0</FileVersion>
<AssemblyVersion>0.3.1.0</AssemblyVersion>
<FileVersion>0.3.1.0</FileVersion>
<AvaloniaXamlVerboseExceptions>False</AvaloniaXamlVerboseExceptions>
</PropertyGroup>
@@ -27,7 +27,7 @@
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="11.1.0-beta2" />
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.1.0-beta2" />
<PackageReference Include="AvaloniaEdit.TextMate" Version="11.0.6" />
<PackageReference Include="BlossomiShymae.GrrrLCU" Version="0.8.0" />
<PackageReference Include="BlossomiShymae.GrrrLCU" Version="0.9.0" />
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.2" />
<PackageReference Include="Material.Icons.Avalonia" Version="2.1.10" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />

View File

@@ -66,7 +66,11 @@ namespace Needlework.Net.Desktop.ViewModels
var body = await response.Content.ReadAsStringAsync();
body = !string.IsNullOrEmpty(body) ? JsonSerializer.Serialize(JsonSerializer.Deserialize<object>(body), App.JsonSerializerOptions) : string.Empty;
if (body.Length >= App.MaxCharacters) WindowService.ShowOopsiesWindow(body);
if (body.Length >= App.MaxCharacters)
{
WindowService.ShowOopsiesWindow(body);
WeakReferenceMessenger.Default.Send(new ResponseUpdatedMessage(string.Empty), nameof(ConsoleViewModel));
}
else WeakReferenceMessenger.Default.Send(new ResponseUpdatedMessage(body), nameof(ConsoleViewModel));
ResponseStatus = $"{(int)response.StatusCode} {response.StatusCode.ToString()}";

View File

@@ -12,15 +12,31 @@ namespace Needlework.Net.Desktop.ViewModels
public string Endpoint { get; }
public string Title => Endpoint;
[ObservableProperty] private IAvaloniaReadOnlyList<PathOperationViewModel> _pathOperations;
[ObservableProperty] private PathOperationViewModel? _selectedPathOperation;
[ObservableProperty] private string? _search;
[ObservableProperty] private IAvaloniaReadOnlyList<PathOperationViewModel> _filteredPathOperations;
public EndpointViewModel(string endpoint)
{
Endpoint = endpoint;
var handler = WeakReferenceMessenger.Default.Send<DataRequestMessage>().Response;
PathOperations = new AvaloniaList<PathOperationViewModel>(handler.Plugins[endpoint].Select(x => new PathOperationViewModel(x)));
FilteredPathOperations = new AvaloniaList<PathOperationViewModel>(PathOperations);
}
partial void OnSearchChanged(string? value)
{
if (string.IsNullOrWhiteSpace(value))
{
FilteredPathOperations = new AvaloniaList<PathOperationViewModel>(PathOperations);
return;
}
FilteredPathOperations = new AvaloniaList<PathOperationViewModel>(PathOperations.Where(o => o.Path.ToLower().Contains(value.ToLower())));
}
}
}

View File

@@ -12,7 +12,9 @@ using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Json;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
namespace Needlework.Net.Desktop.ViewModels
@@ -28,6 +30,7 @@ namespace Needlework.Net.Desktop.ViewModels
public OpenApiDocument? HostDocument { get; set; }
[ObservableProperty] private bool _isBusy = true;
[ObservableProperty] private bool _isUpdateShown = false;
public MainWindowViewModel(IEnumerable<PageBase> pages, HttpClient httpClient, WindowService windowService)
{
@@ -36,7 +39,44 @@ namespace Needlework.Net.Desktop.ViewModels
WindowService = windowService;
WeakReferenceMessenger.Default.RegisterAll(this);
Task.Run(FetchDataAsync);
new Thread(ProcessEvents) { IsBackground = true }.Start();
}
private void ProcessEvents(object? obj)
{
while (true)
{
Task.Run(CheckLatestVersionAsync);
Thread.Sleep(TimeSpan.FromSeconds(60));
}
}
private async Task CheckLatestVersionAsync()
{
try
{
var request = new HttpRequestMessage(HttpMethod.Get, "https://api.github.com/repos/BlossomiShymae/Needlework.Net/releases/latest");
request.Headers.UserAgent.Add(new System.Net.Http.Headers.ProductInfoHeaderValue("Needlework.Net", Version));
var response = await HttpClient.SendAsync(request);
var release = await response.Content.ReadFromJsonAsync<GithubRelease>();
if (release == null) return;
var currentVersion = int.Parse(Version.Replace(".", ""));
if (release.IsLatest(currentVersion) && !IsUpdateShown)
{
await Avalonia.Threading.Dispatcher.UIThread.InvokeAsync(async () =>
{
await SukiHost.ShowToast("Needlework.Net Update", $"There is a new version available: {release.TagName}.", SukiUI.Enums.NotificationType.Info, TimeSpan.FromSeconds(10), () => OpenUrl("https://github.com/BlossomiShymae/Needlework.Net/releases"));
IsUpdateShown = true;
});
}
}
catch (Exception) { }
}
private async Task FetchDataAsync()
@@ -74,12 +114,6 @@ namespace Needlework.Net.Desktop.ViewModels
process.Start();
}
[RelayCommand]
private void OpenConsole()
{
}
public void Receive(OopsiesWindowRequestedMessage message)
{
WindowService.ShowOopsiesWindow(message.Value);

View File

@@ -48,8 +48,8 @@ namespace Needlework.Net.Desktop.ViewModels
var pathParameters = new AvaloniaList<ParameterViewModel>();
foreach (var parameter in parameters)
{
if (parameter.In != location) break;
pathParameters.Add(new ParameterViewModel(parameter.Name, parameter.Schema.Type, parameter.Required));
if (parameter.In != location) continue;
pathParameters.Add(new ParameterViewModel(parameter.Name, GetSchemaType(parameter.Schema), parameter.Required));
}
return pathParameters;

View File

@@ -99,7 +99,11 @@ namespace Needlework.Net.Desktop.ViewModels
var responseBody = await response.Content.ReadAsStringAsync();
responseBody = !string.IsNullOrEmpty(responseBody) ? JsonSerializer.Serialize(JsonSerializer.Deserialize<object>(responseBody), App.JsonSerializerOptions) : string.Empty;
if (responseBody.Length >= App.MaxCharacters) WeakReferenceMessenger.Default.Send(new OopsiesWindowRequestedMessage(responseBody));
if (responseBody.Length >= App.MaxCharacters)
{
WeakReferenceMessenger.Default.Send(new OopsiesWindowRequestedMessage(responseBody));
WeakReferenceMessenger.Default.Send(new EditorUpdateMessage(new(string.Empty, "EndpointResponseEditor")));
}
else WeakReferenceMessenger.Default.Send(new EditorUpdateMessage(new(responseBody, "EndpointResponseEditor")));
ResponseStatus = $"{(int)response.StatusCode} {response.StatusCode}";

View File

@@ -3,6 +3,7 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:suki="clr-namespace:SukiUI.Controls;assembly=SukiUI"
xmlns:materialIcons="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia"
xmlns:theme="clr-namespace:SukiUI.Theme;assembly=SukiUI"
xmlns:vm="using:Needlework.Net.Desktop.ViewModels"
xmlns:avalonEdit="https://github.com/avaloniaui/avaloniaedit"
@@ -12,15 +13,22 @@
<Grid RowDefinitions="auto,*" ColumnDefinitions="3*,2,4*,2,4*">
<Grid Grid.Row="0"
Grid.Column="0"
Grid.RowSpan="2"
RowDefinitions="auto,*"
RowDefinitions="*"
ColumnDefinitions="auto,*">
<TextBox Text="{Binding Search}"
Grid.Row="0"
Grid.Column="0"
Grid.ColumnSpan="2"/>
</Grid>
<Grid Grid.Row="1"
Grid.Column="0"
RowDefinitions="*"
ColumnDefinitions="*">
<ListBox ItemsSource="{Binding PathOperations}"
<ListBox ItemsSource="{Binding FilteredPathOperations}"
SelectedItem="{Binding SelectedPathOperation}"
ScrollViewer.HorizontalScrollBarVisibility="Visible"
Margin="0 0 0 0"
Grid.Row="0"
Grid.RowSpan="2"
Grid.Row="1"
Grid.Column="0">
<ListBox.ItemTemplate>
<DataTemplate>

View File

@@ -58,10 +58,11 @@
<suki:GlassCard>
<avaloniaEdit:TextEditor
Name="ResponseEditor"
ShowLineNumbers="True"
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Visible"
Text=""
FontSize="14"/>
FontSize="12"/>
</suki:GlassCard>
</Border>
</Grid>

View File

@@ -4,9 +4,13 @@
Needlework.Net is an open-source helper tool for the LCU that provides documented endpoints and can send requests without any code setup. Created using .NET! 🌠
# Requirements
- Windows x64
- .NET 8 runtime. [It can be downloaded here.](https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/runtime-desktop-8.0.7-windows-x64-installer)
## Download
[Needlework can be downloaded from the latest release for Windows!](https://github.com/BlossomiShymae/Needlework/releases)
[Needlework can be downloaded from the latest release for Windows!](https://github.com/BlossomiShymae/Needlework.Net/releases)
## Contributors
@@ -16,6 +20,10 @@ Needlework.Net is an open-source helper tool for the LCU that provides documente
## Credits
### GrrrLCU
A simple wrapper for the LCU.
- [Repository](https://github.com/BlossomiShymae/GrrrLCU)
### LCU Explorer
This project was inspired by LCU Explorer, an application created by the HextechDocs team! 💚
@@ -31,7 +39,7 @@ Endpoints and schemas are provided by dysolix's [generated OpenAPI file.](https:
THE PROGRAM IS PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGMENT, OR OF FITNESS FOR A PARTICULAR PURPOSE. LICENSOR DOES NOT WARRANT THAT THE FUNCTIONS CONTAINED IN THE PROGRAM WILL MEET YOUR REQUIREMENTS OR THAT OPERATION WILL BE UNINTERRUPTED OR ERROR FREE. LICENSOR MAKES NO WARRANTIES RESPECTING ANY HARM THAT MAY BE CAUSED BY MALICIOUS USE OF THIS SOFTWARE. LICENSOR FURTHER EXPRESSLY DISCLAIMS ANY WARRANTY OR REPRESENTATION TO AUTHORIZED USERS OR TO ANY THIRD PARTY.
Needlework isn't endorsed by Riot Games and doesn't
Needlework.Net isn't endorsed by Riot Games and doesn't
reflect the views or opinions of Riot Games or anyone officially
involved in producing or managing Riot Games properties. Riot Games,
and all associated properties are trademarks or registered