From 124b6767ce00335c3691c77bbe6a65f2189a6003 Mon Sep 17 00:00:00 2001 From: Rutherther Date: Sat, 4 Feb 2023 20:34:29 +0100 Subject: [PATCH] feat: add possibility to report an error using a HandshakeResponse --- .../Messages/HandshakeResponse.cs | 10 ++++++++- src/Local/NosSmooth.Comms.Inject/DllMain.cs | 3 ++- .../MessageResponders/HandshakeResponder.cs | 6 ++++- .../NosSmoothService.cs | 22 ++++++++++++++----- 4 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/Core/NosSmooth.Comms.Abstractions/Messages/HandshakeResponse.cs b/src/Core/NosSmooth.Comms.Abstractions/Messages/HandshakeResponse.cs index 663967a..2e429df 100644 --- a/src/Core/NosSmooth.Comms.Abstractions/Messages/HandshakeResponse.cs +++ b/src/Core/NosSmooth.Comms.Abstractions/Messages/HandshakeResponse.cs @@ -4,6 +4,14 @@ // Copyright (c) František Boháček. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. +using Remora.Results; + namespace NosSmooth.Comms.Data.Messages; -public record HandshakeResponse(long? CharacterId, string? CharacterName); \ No newline at end of file +public record HandshakeResponse +( + bool ClientRunning, + Result? InitializationErrorfulResult, + long? CharacterId, + string? CharacterName +); \ No newline at end of file diff --git a/src/Local/NosSmooth.Comms.Inject/DllMain.cs b/src/Local/NosSmooth.Comms.Inject/DllMain.cs index e8c3411..88e6fa3 100644 --- a/src/Local/NosSmooth.Comms.Inject/DllMain.cs +++ b/src/Local/NosSmooth.Comms.Inject/DllMain.cs @@ -114,6 +114,7 @@ public class DllMain s => { s + .AddSingleton() .AddSingleton() .AddNostaleCore() .AddLocalClient() @@ -131,7 +132,7 @@ public class DllMain ).Build(); await _host.StartAsync(); - var hostTask = _host.RunAsync(); + var hostTask = _host.WaitForShutdownAsync(); var serverTask = host(_host); await Task.WhenAll(hostTask, serverTask); diff --git a/src/Local/NosSmooth.Comms.Inject/MessageResponders/HandshakeResponder.cs b/src/Local/NosSmooth.Comms.Inject/MessageResponders/HandshakeResponder.cs index d34524a..1eafcab 100644 --- a/src/Local/NosSmooth.Comms.Inject/MessageResponders/HandshakeResponder.cs +++ b/src/Local/NosSmooth.Comms.Inject/MessageResponders/HandshakeResponder.cs @@ -18,6 +18,7 @@ namespace NosSmooth.Comms.Inject.MessageResponders; /// public class HandshakeResponder : IMessageResponder { + private readonly ClientState _state; private readonly NosBrowserManager _browserManager; private readonly ConnectionHandler _connectionHandler; private readonly CallbackConfigRepository _config; @@ -26,18 +27,21 @@ public class HandshakeResponder : IMessageResponder /// /// Initializes a new instance of the class. /// + /// The state of the application. /// The browser manager. /// The connection handler. /// The config. /// The logger. public HandshakeResponder ( + ClientState state, NosBrowserManager browserManager, ConnectionHandler connectionHandler, CallbackConfigRepository config, ILogger logger ) { + _state = state; _browserManager = browserManager; _connectionHandler = connectionHandler; _config = config; @@ -61,7 +65,7 @@ public class HandshakeResponder : IMessageResponder var result = await _connectionHandler.SendMessageAsync ( - new HandshakeResponse(playerId, playerName), + new HandshakeResponse(_state.IsRunning, _state.InitResult, playerId, playerName), ct ); diff --git a/src/Local/NosSmooth.Comms.Inject/NosSmoothService.cs b/src/Local/NosSmooth.Comms.Inject/NosSmoothService.cs index dd04dda..2c4b4b7 100644 --- a/src/Local/NosSmooth.Comms.Inject/NosSmoothService.cs +++ b/src/Local/NosSmooth.Comms.Inject/NosSmoothService.cs @@ -13,6 +13,7 @@ using NosSmooth.Core.Extensions; using NosSmooth.LocalBinding; using NosSmooth.PacketSerializer.Extensions; using NosSmooth.PacketSerializer.Packets; +using Remora.Results; namespace NosSmooth.Comms.Inject; @@ -22,32 +23,32 @@ namespace NosSmooth.Comms.Inject; public class NosSmoothService : BackgroundService { private readonly IServiceProvider _services; + private readonly ClientState _state; private readonly IPacketTypesRepository _packetTypesRepository; private readonly NosBindingManager _bindingManager; - private readonly IHostLifetime _lifetime; private readonly ILogger _logger; /// /// Initializes a new instance of the class. /// /// The services. + /// The state of the application. /// The packet types repository. /// The binding manager. - /// The lifetime. /// The logger. public NosSmoothService ( IServiceProvider services, + ClientState state, IPacketTypesRepository packetTypesRepository, NosBindingManager bindingManager, - IHostLifetime lifetime, ILogger logger ) { _services = services; + _state = state; _packetTypesRepository = packetTypesRepository; _bindingManager = bindingManager; - _lifetime = lifetime; _logger = logger; } @@ -57,23 +58,32 @@ public class NosSmoothService : BackgroundService var packetResult = _packetTypesRepository.AddDefaultPackets(); if (!packetResult.IsSuccess) { + _state.InitResult = packetResult; + _logger.LogError + ("Could not initialize the packet types (will still work fine if only raw packets are used)"); _logger.LogResultError(packetResult); - return; } var bindingResult = _bindingManager.Initialize(); if (!bindingResult.IsSuccess) { + _state.InitResult = Result.FromError(bindingResult.Error); + _logger.LogError("Could not initialize the binding manager"); _logger.LogResultError(bindingResult); + await Task.Delay(-1, stoppingToken); return; } + _state.IsRunning = true; var nostaleClient = _services.GetRequiredService(); var runResult = await nostaleClient.RunAsync(stoppingToken); + _state.IsRunning = false; if (!runResult.IsSuccess) { + _state.InitResult = runResult; _logger.LogResultError(runResult); - await _lifetime.StopAsync(default); } + + await Task.Delay(-1, stoppingToken); } } \ No newline at end of file -- 2.48.1