From 7aaa79956c636af739f0e141d63fcf7eef91c08c Mon Sep 17 00:00:00 2001 From: BlossomiShymae <87099578+BlossomiShymae@users.noreply.github.com> Date: Fri, 6 Dec 2024 22:17:48 -0600 Subject: [PATCH] Add event type selection for event viewer --- .../Pages/Websocket/EventViewModel.cs | 2 +- .../Pages/Websocket/WebsocketViewModel.cs | 91 ++++++++++++++----- .../Views/Pages/WebsocketView.axaml | 18 +++- 3 files changed, 85 insertions(+), 26 deletions(-) diff --git a/Needlework.Net/ViewModels/Pages/Websocket/EventViewModel.cs b/Needlework.Net/ViewModels/Pages/Websocket/EventViewModel.cs index feac14b..47d2503 100644 --- a/Needlework.Net/ViewModels/Pages/Websocket/EventViewModel.cs +++ b/Needlework.Net/ViewModels/Pages/Websocket/EventViewModel.cs @@ -15,7 +15,7 @@ public class EventViewModel : ObservableObject public EventViewModel(EventData eventData) { Time = $"{DateTime.Now:HH:mm:ss.fff}"; - Type = eventData?.EventType.ToUpper() ?? string.Empty; + Type = eventData?.EventType?.ToUpper() ?? string.Empty; Uri = eventData?.Uri ?? string.Empty; } } diff --git a/Needlework.Net/ViewModels/Pages/Websocket/WebsocketViewModel.cs b/Needlework.Net/ViewModels/Pages/Websocket/WebsocketViewModel.cs index 2d636e6..e0e9948 100644 --- a/Needlework.Net/ViewModels/Pages/Websocket/WebsocketViewModel.cs +++ b/Needlework.Net/ViewModels/Pages/Websocket/WebsocketViewModel.cs @@ -1,4 +1,5 @@ -using BlossomiShymae.GrrrLCU; +using Avalonia.Collections; +using BlossomiShymae.GrrrLCU; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Messaging; @@ -8,8 +9,11 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.Linq; +using System.Net.Http; using System.Text.Json; +using System.Text.RegularExpressions; using System.Threading; +using System.Threading.Tasks; using Websocket.Client; namespace Needlework.Net.ViewModels.Pages.Websocket; @@ -25,37 +29,76 @@ public partial class WebsocketViewModel : PageBase [ObservableProperty] private bool _isTail = false; [ObservableProperty] private EventViewModel? _selectedEventLog = null; + [ObservableProperty] private IAvaloniaList _eventTypes = new AvaloniaList(); + [ObservableProperty] private string _eventType = "OnJsonApiEvent"; + private Dictionary _events = []; public WebsocketClient? Client { get; set; } + public List ClientDisposables = []; + + private readonly object _tokenLock = new(); + public CancellationTokenSource TokenSource { get; set; } = new(); + + public HttpClient HttpClient { get; } + public IReadOnlyList FilteredEventLog => string.IsNullOrWhiteSpace(Search) ? EventLog : [.. EventLog.Where(x => x.Key.Contains(Search, StringComparison.InvariantCultureIgnoreCase))]; - public WebsocketViewModel() : base("Event Viewer", "plug", -100) + public WebsocketViewModel(HttpClient httpClient) : base("Event Viewer", "plug", -100) { + HttpClient = httpClient; EventLog.CollectionChanged += (s, e) => OnPropertyChanged(nameof(FilteredEventLog)); - var thread = new Thread(InitializeWebsocket) { IsBackground = true }; - thread.Start(); + Task.Run(async () => + { + await InitializeEventTypes(); + InitializeWebsocket(); + }); + } + + private async Task InitializeEventTypes() + { + var file = await HttpClient.GetStringAsync("https://raw.githubusercontent.com/dysolix/hasagi-types/refs/heads/main/lcu-events.d.ts"); + var matches = EventTypesRegex().Matches(file); + Avalonia.Threading.Dispatcher.UIThread.Invoke(() => EventTypes.AddRange(matches.Select(m => m.Groups[1].Value))); } private void InitializeWebsocket() { - while (true) + lock (_tokenLock) { - try + if (Client != null) { - var client = Connector.CreateLcuWebsocketClient(); - client.EventReceived.Subscribe(OnMessage); - client.DisconnectionHappened.Subscribe(OnDisconnection); - client.ReconnectionHappened.Subscribe(OnReconnection); - - client.Start(); - client.Send(new EventMessage(EventRequestType.Subscribe, EventKinds.OnJsonApiEvent)); - Client = client; - return; + foreach (var disposable in ClientDisposables) + disposable.Dispose(); + ClientDisposables.Clear(); + Client.Dispose(); } - catch (Exception) { } - Thread.Sleep(TimeSpan.FromSeconds(5)); + TokenSource.Cancel(); + var tokenSource = new CancellationTokenSource(); + var thread = new Thread(() => + { + while (!tokenSource.IsCancellationRequested) + { + try + { + var client = Connector.CreateLcuWebsocketClient(); + ClientDisposables.Add(client.EventReceived.Subscribe(OnMessage)); + ClientDisposables.Add(client.DisconnectionHappened.Subscribe(OnDisconnection)); + ClientDisposables.Add(client.ReconnectionHappened.Subscribe(OnReconnection)); + + client.Start(); + client.Send(new EventMessage(EventRequestType.Subscribe, new EventKind() { Prefix = EventType })); + Client = client; + return; + } + catch (Exception) { } + Thread.Sleep(TimeSpan.FromSeconds(5)); + } + }) + { IsBackground = true }; + thread.Start(); + TokenSource = tokenSource; } } @@ -84,10 +127,13 @@ public partial class WebsocketViewModel : PageBase private void OnDisconnection(DisconnectionInfo info) { - Trace.WriteLine($"-- Disconnection --\nType:{info.Type}\nSubProocol:{info.SubProtocol}\nCloseStatus:{info.CloseStatus}\nCloseStatusDescription:{info.CloseStatusDescription}\nExceptionMessage:{info?.Exception?.Message}\n:InnerException:{info?.Exception?.InnerException}"); - Client?.Dispose(); - var thread = new Thread(InitializeWebsocket) { IsBackground = true }; - thread.Start(); + Trace.WriteLine($"-- Disconnection --\nType:{info.Type}\nSubProtocol:{info.SubProtocol}\nCloseStatus:{info.CloseStatus}\nCloseStatusDescription:{info.CloseStatusDescription}\nExceptionMessage:{info?.Exception?.Message}\n:InnerException:{info?.Exception?.InnerException}"); + InitializeWebsocket(); + } + + partial void OnEventTypeChanged(string value) + { + InitializeWebsocket(); } private void OnMessage(EventMessage message) @@ -122,4 +168,7 @@ public partial class WebsocketViewModel : PageBase } }); } + + [GeneratedRegex("\"(.*?)\":")] + public static partial Regex EventTypesRegex(); } diff --git a/Needlework.Net/Views/Pages/WebsocketView.axaml b/Needlework.Net/Views/Pages/WebsocketView.axaml index bcdbcc0..284ee97 100644 --- a/Needlework.Net/Views/Pages/WebsocketView.axaml +++ b/Needlework.Net/Views/Pages/WebsocketView.axaml @@ -10,12 +10,22 @@ - + + + + + ColumnDefinitions="auto,*,auto,auto" + Margin="0 8 0 0">