// // RawPacketResponder.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 Microsoft.Extensions.Logging; using NosSmooth.Comms.Data.Messages; using NosSmooth.Comms.Data.Responders; using NosSmooth.Core.Client; using NosSmooth.Core.Extensions; using NosSmooth.Core.Packets; using NosSmooth.Packets; using NosSmooth.PacketSerializer; using NosSmooth.PacketSerializer.Errors; using Remora.Results; namespace NosSmooth.Comms.Local.MessageResponders; /// /// Responds to raw packets. /// public class RawPacketResponder : IMessageResponder { private readonly INostaleClient _client; private readonly PacketHandler _packetHandler; private readonly IPacketSerializer _serializer; private readonly ILogger _logger; /// /// Initializes a new instance of the class. /// /// The nostale client. /// The packet handler. /// The serializer. /// The logger. public RawPacketResponder(INostaleClient client, PacketHandler packetHandler, IPacketSerializer serializer, ILogger logger) { _client = client; _packetHandler = packetHandler; _serializer = serializer; _logger = logger; } /// public Task Respond(RawPacketMessage message, CancellationToken ct = default) { var deserializedResult = _serializer.Deserialize(message.Packet, message.Source); IPacket packet; if (!deserializedResult.IsSuccess) { if (deserializedResult.Error is not PacketConverterNotFoundError) { _logger.LogWarning("Could not parse {Packet}. Reason:", message.Packet); _logger.LogResultError(deserializedResult); packet = new ParsingFailedPacket(deserializedResult, message.Packet); } else { packet = new UnresolvedPacket(message.Packet.Split(' ')[0], message.Packet); } } else { packet = deserializedResult.Entity; } return _packetHandler.HandlePacketAsync ( _client, message.Source, packet, message.Packet, ct ); } }