Supercell.GUT/Supercell.GUT.Server/Protocol/Handlers/MessageHandlerBase.cs

37 lines
1.1 KiB
C#
Raw Normal View History

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