using Microsoft.Extensions.Logging; using Tiger.Communication.Messages.Incoming; using Tiger.Communication.Messages.Interfaces; using Tiger.Communication.Messages.Types; using Tiger.Networking.Game.Sessions; namespace Tiger.Communication.Messages; public class MessageHandler : IMessageHandler { private readonly ILogger _logger; private readonly IDictionary _messageEvents; private readonly IDictionary _messageNames; public MessageHandler(ILogger logger, IEnumerable messageEvents) { _logger = logger; _messageEvents = messageEvents.ToDictionary(messageEvent => (short)messageEvent.Header); _messageNames = new Dictionary(); foreach (var name in Enum.GetNames(typeof(IncomingHeaders))) { _messageNames.Add((short)Enum.Parse(typeof(IncomingHeaders), name), name); } } public async Task TryHandleAsync(GameSession session, ClientMessage request) { if (request.Header == null) { return; } if (_messageEvents.TryGetValue(request.Header.Value, out var messageEvent)) { _logger.LogInformation("Handling header ID {Header} on class {Class}", request.Header.Value, messageEvent.GetType()); await messageEvent.HandleAsync(session, request); } else { _logger.LogWarning("Unregistered header {Header} {Name}", request.Header.Value, _messageNames.TryGetValue(request.Header.Value, out var messageName) ? messageName : string.Empty); } } }