~ruther/NosSmooth.Comms

124b6767ce00335c3691c77bbe6a65f2189a6003 — Rutherther 2 years ago 3bb0ccd
feat: add possibility to report an error using a HandshakeResponse
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

Do not follow this link