M src/Core/NosSmooth.Comms.Abstractions/Messages/HandshakeResponse.cs => src/Core/NosSmooth.Comms.Abstractions/Messages/HandshakeResponse.cs +9 -1
@@ 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
M src/Local/NosSmooth.Comms.Inject/DllMain.cs => src/Local/NosSmooth.Comms.Inject/DllMain.cs +2 -1
@@ 114,6 114,7 @@ public class DllMain
s =>
{
s
+ .AddSingleton<ClientState>()
.AddSingleton<CallbackConfigRepository>()
.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);
M src/Local/NosSmooth.Comms.Inject/MessageResponders/HandshakeResponder.cs => src/Local/NosSmooth.Comms.Inject/MessageResponders/HandshakeResponder.cs +5 -1
@@ 18,6 18,7 @@ namespace NosSmooth.Comms.Inject.MessageResponders;
/// </summary>
public class HandshakeResponder : IMessageResponder<HandshakeRequest>
{
+ private readonly ClientState _state;
private readonly NosBrowserManager _browserManager;
private readonly ConnectionHandler _connectionHandler;
private readonly CallbackConfigRepository _config;
@@ 26,18 27,21 @@ public class HandshakeResponder : IMessageResponder<HandshakeRequest>
/// <summary>
/// Initializes a new instance of the <see cref="HandshakeResponder"/> class.
/// </summary>
+ /// <param name="state">The state of the application.</param>
/// <param name="browserManager">The browser manager.</param>
/// <param name="connectionHandler">The connection handler.</param>
/// <param name="config">The config.</param>
/// <param name="logger">The logger.</param>
public HandshakeResponder
(
+ ClientState state,
NosBrowserManager browserManager,
ConnectionHandler connectionHandler,
CallbackConfigRepository config,
ILogger<HandshakeResponder> logger
)
{
+ _state = state;
_browserManager = browserManager;
_connectionHandler = connectionHandler;
_config = config;
@@ 61,7 65,7 @@ public class HandshakeResponder : IMessageResponder<HandshakeRequest>
var result = await _connectionHandler.SendMessageAsync
(
- new HandshakeResponse(playerId, playerName),
+ new HandshakeResponse(_state.IsRunning, _state.InitResult, playerId, playerName),
ct
);
M src/Local/NosSmooth.Comms.Inject/NosSmoothService.cs => src/Local/NosSmooth.Comms.Inject/NosSmoothService.cs +16 -6
@@ 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<NosSmoothService> _logger;
/// <summary>
/// Initializes a new instance of the <see cref="NosSmoothService"/> class.
/// </summary>
/// <param name="services">The services.</param>
+ /// <param name="state">The state of the application.</param>
/// <param name="packetTypesRepository">The packet types repository.</param>
/// <param name="bindingManager">The binding manager.</param>
- /// <param name="lifetime">The lifetime.</param>
/// <param name="logger">The logger.</param>
public NosSmoothService
(
IServiceProvider services,
+ ClientState state,
IPacketTypesRepository packetTypesRepository,
NosBindingManager bindingManager,
- IHostLifetime lifetime,
ILogger<NosSmoothService> 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<INostaleClient>();
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