Skip to content

Commit 81b488c

Browse files
authored
[Login] Register packets via DI (AAEmu#1301)
* [Login] Register LoginPackets via DI The LoginPacketDescriptor type removes the need for a cast from LoginPacket to the specific packet type accepted by the handler * [Login] Register InternalPackets via DI The InternalPacketDescriptor type removes the need for a cast from InternalPacket to the specific packet type accepted by the handler
1 parent 14777d0 commit 81b488c

32 files changed

+219
-167
lines changed

AAEmu.Login/Core/Network/Connections/LoginConnection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public class LoginConnection
1111
{
1212
private readonly ISession _session;
1313

14-
public ConnectionId Id => new ConnectionId(_session.SessionId);
14+
public ConnectionId Id => new(_session.SessionId);
1515
public IPAddress Ip => _session.Ip;
1616
public InternalConnection? InternalConnection { get; set; }
1717
public PacketStream? LastPacket { get; set; }
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace AAEmu.Login.Core.Network.Internal;
2+
3+
public interface IInternalPacket
4+
{
5+
static abstract ushort TypeId { get; }
6+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using AAEmu.Commons.Network;
2+
using AAEmu.Login.Core.Network.Connections;
3+
4+
namespace AAEmu.Login.Core.Network.Internal;
5+
6+
public interface IInternalPacketDescriptor
7+
{
8+
ushort TypeId { get; }
9+
10+
/// <summary>
11+
/// Reads the packet from the stream and dispatches it to the appropriate handler.
12+
/// </summary>
13+
/// <param name="stream">The stream containing the packet data.</param>
14+
/// <param name="connection">The connection where the packet was received.</param>
15+
void Dispatch(PacketStream stream, InternalConnection connection);
16+
}
Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
11
using AAEmu.Commons.Network;
2-
using AAEmu.Login.Core.PacketHandlers;
32

43
namespace AAEmu.Login.Core.Network.Internal;
54

6-
public interface IInternalProtocolHandler : IBaseProtocolHandler
7-
{
8-
void RegisterPacket<TPacket>(uint type, IInternalPacketHandler<TPacket> packetHandler)
9-
where TPacket : InternalPacket;
10-
}
5+
public interface IInternalProtocolHandler : IBaseProtocolHandler;
Lines changed: 2 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,23 @@
11
using System.Net;
22
using AAEmu.Commons.Network.Core;
3-
using AAEmu.Login.Core.PacketHandlers;
4-
using AAEmu.Login.Core.Packets.G2L;
53
using AAEmu.Login.Models;
64
using NLog;
75

86
namespace AAEmu.Login.Core.Network.Internal;
97

10-
public class InternalNetwork : IInternalNetwork
8+
public class InternalNetwork(IInternalProtocolHandler protocolHandler) : IInternalNetwork
119
{
1210
private static Logger Logger { get; } = LogManager.GetCurrentClassLogger();
1311

1412
private Server? _server;
15-
private readonly IInternalProtocolHandler _handler;
16-
17-
public InternalNetwork(IInternalProtocolHandler protocolHandler,
18-
IInternalPacketHandler<GLRegisterGameServerPacket> registerGameServerPacketHandler,
19-
IInternalPacketHandler<GLPlayerEnterPacket> playerEnterPacketHandler,
20-
IInternalPacketHandler<GLPlayerReconnectPacket> playerReconnectPacketHandler,
21-
IInternalPacketHandler<GLRequestInfoPacket> requestInfoPacketHandler,
22-
IInternalPacketHandler<GLGameServerLoadPacket> gameServerLoadPacketHandler)
23-
{
24-
_handler = protocolHandler;
25-
26-
RegisterPacket(GLOffsets.GLRegisterGameServerPacket, registerGameServerPacketHandler);
27-
RegisterPacket(GLOffsets.GLPlayerEnterPacket, playerEnterPacketHandler);
28-
RegisterPacket(GLOffsets.GLPlayerReconnectPacket, playerReconnectPacketHandler);
29-
RegisterPacket(GLOffsets.GLRequestInfoPacket, requestInfoPacketHandler);
30-
RegisterPacket(GLOffsets.GLGameServerLoadPacket, gameServerLoadPacketHandler);
31-
}
3213

3314
public void Start()
3415
{
3516
var config = AppConfiguration.Instance.InternalNetwork;
3617
var host =
3718
new IPEndPoint(config.Host.Equals("*") ? IPAddress.Any : IPAddress.Parse(config.Host), config.Port);
3819

39-
_server = new Server(host.Address, host.Port, _handler);
20+
_server = new Server(host.Address, host.Port, protocolHandler);
4021
_server.Start();
4122

4223
Logger.Info("InternalNetwork started");
@@ -49,7 +30,4 @@ public void Stop()
4930

5031
Logger.Info("InternalNetwork stoped");
5132
}
52-
53-
private void RegisterPacket<TPacket>(uint type, IInternalPacketHandler<TPacket> packetHandler)
54-
where TPacket : InternalPacket => _handler.RegisterPacket(type, packetHandler);
5533
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using AAEmu.Commons.Network;
2+
using AAEmu.Login.Core.Network.Connections;
3+
using AAEmu.Login.Core.PacketHandlers;
4+
5+
namespace AAEmu.Login.Core.Network.Internal;
6+
7+
public class InternalPacketDescriptor<TPacket>(ushort packetId, IInternalPacketHandler<TPacket> handler)
8+
: IInternalPacketDescriptor
9+
where TPacket : InternalPacket, new()
10+
{
11+
public ushort TypeId { get; } = packetId;
12+
13+
public void Dispatch(PacketStream stream, InternalConnection connection)
14+
{
15+
var packet = new TPacket { Connection = connection };
16+
packet.Decode(stream);
17+
handler.Execute(packet, connection);
18+
}
19+
}

AAEmu.Login/Core/Network/Internal/InternalProtocolHandler.cs

Lines changed: 12 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,21 @@
66
using AAEmu.Commons.Network.Core;
77
using AAEmu.Login.Core.Controllers;
88
using AAEmu.Login.Core.Network.Connections;
9-
using AAEmu.Login.Core.PacketHandlers;
109
using AAEmu.Login.Models;
1110
using NLog;
1211

1312
namespace AAEmu.Login.Core.Network.Internal;
1413

15-
public class InternalProtocolHandler(IGameController gameController, IInternalConnectionTable internalConnectionTable)
14+
public class InternalProtocolHandler(
15+
IEnumerable<IInternalPacketDescriptor> packetDescriptors,
16+
IGameController gameController,
17+
IInternalConnectionTable internalConnectionTable)
1618
: BaseProtocolHandler, IInternalProtocolHandler
1719
{
1820
private static Logger Logger { get; } = LogManager.GetCurrentClassLogger();
1921

20-
private readonly ConcurrentDictionary<uint, (Type Type, IInternalPacketHandler PacketHandler)> _packets = [];
22+
private readonly ConcurrentDictionary<ushort, IInternalPacketDescriptor> _packets =
23+
new(packetDescriptors.ToDictionary(d => d.TypeId));
2124

2225
public override void OnConnect(ISession session)
2326
{
@@ -44,7 +47,7 @@ public override void OnReceive(ISession session, byte[] buf, int offset, int byt
4447
Logger.Error("Connection not found for session {0}", session.SessionId);
4548
return;
4649
}
47-
50+
4851
var stream = new PacketStream();
4952
if (connection.LastPacket != null)
5053
{
@@ -86,33 +89,19 @@ public override void OnReceive(ISession session, byte[] buf, int offset, int byt
8689

8790
stream2.ReadUInt16();
8891
var type = stream2.ReadUInt16();
89-
if (!_packets.TryGetValue(type, out var tuple))
92+
if (!_packets.TryGetValue(type, out var packetDescriptor))
9093
{
91-
HandleUnknownPacket(session, type, stream2);
94+
HandleUnknownPacket(session, type, stream2);
9295
}
9396
else
9497
{
95-
var (classType, packetHandler) = tuple;
9698
try
9799
{
98-
var packet = (InternalPacket)Activator.CreateInstance(classType)!;
99-
packet.Connection = connection;
100-
packet.Decode(stream2);
101-
102-
try
103-
{
104-
packetHandler.Execute(packet, connection);
105-
}
106-
catch (Exception e)
107-
{
108-
Logger.Error("Error on execute packet {0}", type);
109-
Logger.Error(e);
110-
}
100+
packetDescriptor.Dispatch(stream2, connection);
111101
}
112102
catch (Exception e)
113103
{
114-
Logger.Error("Error on decode packet {0}", type);
115-
Logger.Error(e);
104+
Logger.Error(e, "Error on packet dispatch {0}", type);
116105
}
117106
}
118107
}
@@ -125,19 +114,11 @@ public override void OnReceive(ISession session, byte[] buf, int offset, int byt
125114
}
126115
}
127116

128-
public void RegisterPacket<TPacket>(uint type, IInternalPacketHandler<TPacket> packetHandler) where TPacket : InternalPacket
129-
{
130-
_packets.AddOrUpdate(type,
131-
addValueFactory: static (_, arg) => arg,
132-
updateValueFactory: static (_, _, arg) => arg,
133-
factoryArgument: (typeof(TPacket), packetHandler));
134-
}
135-
136117
private static void HandleUnknownPacket(ISession session, uint type, PacketStream stream)
137118
{
138119
var dump = new StringBuilder();
139120
for (var i = stream.Pos; i < stream.Count; i++)
140-
dump.AppendFormat("{0:x2} ", stream.Buffer[i]);
121+
dump.Append($"{stream.Buffer[i]:x2} ");
141122
Logger.Error("Unknown packet 0x{0:x2} from {1}:\n{2}", type, session.Ip, dump);
142123
}
143124
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace AAEmu.Login.Core.Network.Login;
2+
3+
public interface ILoginPacket
4+
{
5+
static abstract ushort TypeId { get; }
6+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using AAEmu.Commons.Network;
2+
using AAEmu.Login.Core.Network.Connections;
3+
4+
namespace AAEmu.Login.Core.Network.Login;
5+
6+
public interface ILoginPacketDescriptor
7+
{
8+
ushort TypeId { get; }
9+
10+
/// <summary>
11+
/// Reads the packet from the stream and dispatches it to the appropriate handler.
12+
/// </summary>
13+
/// <param name="stream">The stream containing the packet data.</param>
14+
/// <param name="connection">The connection where the packet was received.</param>
15+
void Dispatch(PacketStream stream, LoginConnection connection);
16+
}
Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
using AAEmu.Commons.Network;
2-
using AAEmu.Login.Core.PacketHandlers;
32

43
namespace AAEmu.Login.Core.Network.Login;
54

6-
public interface ILoginProtocolHandler : IBaseProtocolHandler
7-
{
8-
void RegisterPacket<TPacket>(uint type, ILoginPacketHandler<TPacket> packetHandler) where TPacket : LoginPacket;
9-
}
5+
public interface ILoginProtocolHandler : IBaseProtocolHandler;

0 commit comments

Comments
 (0)