using System.Collections.Immutable; using System.Reflection; using Supercell.GUT.Server.Protocol.Attributes; using Supercell.GUT.Titan.Message; namespace Supercell.GUT.Server.Protocol.Handlers; internal abstract class MessageHandlerBase { private readonly ImmutableDictionary _handlerMethods; public MessageHandlerBase() { var builder = ImmutableDictionary.CreateBuilder(); foreach (var method in GetType().GetMethods()) { MessageHandlerAttribute? attribute = method.GetCustomAttribute(); if (attribute == null) continue; builder.Add(attribute.MessageType, method); } _handlerMethods = builder.ToImmutable(); } public async Task HandleMessage(PiranhaMessage message) { if (_handlerMethods.TryGetValue(message.GetMessageType(), out var method)) { await (Task)method.Invoke(this, new object[] { message })!; return true; } return false; } }