~ruther/NosSmooth.Comms

ref: ecfc8cd7dc9143e9550044f3f5971bf8631f51b7 NosSmooth.Comms/src/Local/NosSmooth.Comms.Inject/PacketResponders/EveryPacketResponder.cs -rw-r--r-- 2.2 KiB
ecfc8cd7 — Rutherther feat: add local injectable and injector to allow making connections to nostale processes 2 years ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//
//  EveryPacketResponder.cs
//
//  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 NosSmooth.Comms.Core;
using NosSmooth.Comms.Data.Messages;
using NosSmooth.Core.Packets;
using NosSmooth.Packets;
using Remora.Results;

namespace NosSmooth.Comms.Inject.PacketResponders;

/// <inheritdoc />
public class EveryPacketResponder : IEveryPacketResponder
{
    private readonly CallbackConfigRepository _config;
    private readonly ServerManager _serverManager;

    /// <summary>
    /// Initializes a new instance of the <see cref="EveryPacketResponder"/> class.
    /// </summary>
    /// <param name="config">The configuration.</param>
    /// <param name="serverManager">The server manager.</param>
    public EveryPacketResponder(CallbackConfigRepository config, ServerManager serverManager)
    {
        _config = config;
        _serverManager = serverManager;
    }

    /// <inheritdoc />
    public async Task<Result> Respond<TPacket>(PacketEventArgs<TPacket> packetArgs, CancellationToken ct = default)
        where TPacket : IPacket
    {
        var errors = new List<IResult>();

        foreach (var connectionHandler in _serverManager.ConnectionHandlers)
        {
            var config = _config.GetConfig(connectionHandler);
            if (config.SendRawPackets)
            {
                var result = await connectionHandler.SendMessageAsync
                    (new RawPacketMessage(packetArgs.Source, packetArgs.PacketString), ct);

                if (!result.IsSuccess)
                {
                    errors.Add(Result.FromError(result));
                }
            }

            if (config.SendDeserializedPackets)
            {
                var result = await connectionHandler.SendMessageAsync(new PacketMessage(packetArgs.Source, packetArgs.Packet), ct);

                if (!result.IsSuccess)
                {
                    errors.Add(Result.FromError(result));
                }
            }
        }

        return errors.Count switch
        {
            0 => Result.FromSuccess(),
            1 => (Result)errors[0],
            _ => new AggregateError(errors)
        };
    }
}
Do not follow this link