~ruther/NosSmooth

d6338913782bae75a61222f55419191f496af9b3 — Rutherther 3 years ago 69955f8
fix(core): handle exceptions in packet handler
1 files changed, 57 insertions(+), 35 deletions(-)

M Core/NosSmooth.Core/Packets/PacketHandler.cs
M Core/NosSmooth.Core/Packets/PacketHandler.cs => Core/NosSmooth.Core/Packets/PacketHandler.cs +57 -35
@@ 109,10 109,18 @@ public class PacketHandler : IPacketHandler
        var packetResponders = scope.ServiceProvider.GetServices<IPacketResponder<TPacket>>();
        var genericPacketResponders = scope.ServiceProvider.GetServices<IEveryPacketResponder>();

        var tasks = packetResponders.Select(responder => responder.Respond(packetEventArgs, ct)).ToList();
        tasks.AddRange(genericPacketResponders.Select(responder => responder.Respond(packetEventArgs, ct)));
        Result[] results;
        try
        {
            var tasks = packetResponders.Select(responder => responder.Respond(packetEventArgs, ct)).ToList();
            tasks.AddRange(genericPacketResponders.Select(responder => responder.Respond(packetEventArgs, ct)));

        var results = await Task.WhenAll(tasks);
            results = await Task.WhenAll(tasks);
        }
        catch (Exception e)
        {
            results = new Result[] { e };
        }

        var errors = new List<Result>();
        foreach (var result in results)


@@ 146,27 154,34 @@ public class PacketHandler : IPacketHandler
    )
        where TPacket : IPacket
    {
        var results = await Task.WhenAll
        (
            services.GetServices<IPreExecutionEvent>()
                .Select(x => x.ExecuteBeforeExecutionAsync(client, eventArgs, ct))
        );

        var errorResults = new List<Result>();
        foreach (var result in results)
        try
        {
            if (!result.IsSuccess)
            var results = await Task.WhenAll
            (
                services.GetServices<IPreExecutionEvent>()
                    .Select(x => x.ExecuteBeforeExecutionAsync(client, eventArgs, ct))
            );

            var errorResults = new List<Result>();
            foreach (var result in results)
            {
                errorResults.Add(result);
                if (!result.IsSuccess)
                {
                    errorResults.Add(result);
                }
            }
        }

        return errorResults.Count switch
            return errorResults.Count switch
            {
                1 => errorResults[0],
                0 => Result.FromSuccess(),
                _ => new AggregateError(errorResults.Cast<IResult>().ToArray())
            };
        }
        catch (Exception e)
        {
            1 => errorResults[0],
            0 => Result.FromSuccess(),
            _ => new AggregateError(errorResults.Cast<IResult>().ToArray())
        };
            return e;
        }
    }

    private async Task<Result> ExecuteAfterExecutionAsync<TPacket>


@@ 179,26 194,33 @@ public class PacketHandler : IPacketHandler
    )
        where TPacket : IPacket
    {
        var results = await Task.WhenAll
        (
            services.GetServices<IPostExecutionEvent>()
                .Select(x => x.ExecuteAfterExecutionAsync(client, eventArgs, executionResults, ct))
        );

        var errorResults = new List<Result>();
        foreach (var result in results)
        try
        {
            if (!result.IsSuccess)
            var results = await Task.WhenAll
            (
                services.GetServices<IPostExecutionEvent>()
                    .Select(x => x.ExecuteAfterExecutionAsync(client, eventArgs, executionResults, ct))
            );

            var errorResults = new List<Result>();
            foreach (var result in results)
            {
                errorResults.Add(result);
                if (!result.IsSuccess)
                {
                    errorResults.Add(result);
                }
            }
        }

        return errorResults.Count switch
            return errorResults.Count switch
            {
                1 => errorResults[0],
                0 => Result.FromSuccess(),
                _ => new AggregateError(errorResults.Cast<IResult>().ToArray())
            };
        }
        catch (Exception e)
        {
            1 => errorResults[0],
            0 => Result.FromSuccess(),
            _ => new AggregateError(errorResults.Cast<IResult>().ToArray())
        };
            return e;
        }
    }
}
\ No newline at end of file