IServerSocket dispatch

This commit is contained in:
2025-08-19 18:30:42 +02:00
parent 53d2e3cf6b
commit 631e14e66e
2 changed files with 28 additions and 3 deletions

View File

@@ -5,6 +5,20 @@
namespace td {
namespace server {
IServerSocket::IServerSocket() {
RegisterHandler([this](PlayerID a_PlayerId) { return std::make_unique<ConnectionHandler>(*this, a_PlayerId); });
}
void IServerSocket::RegisterHandler(const PlayerPacketHandler& a_Handler) {
m_Handlers.push_back(a_Handler);
}
void IServerSocket::UnregisterHandler(const PlayerPacketHandler& a_Handler) {
auto it = std::find_if(m_Handlers.begin(), m_Handlers.end(),
[&a_Handler](PlayerPacketHandler& handler) { return a_Handler.template target<PlayerPacketHandlerType>() == handler.template target<PlayerPacketHandlerType>(); });
m_Handlers.erase(it);
}
void IServerSocket::OnConnectPeer(PeerID a_PeerId) {
// here, the client is not a player yet (we need to wait for auth)
m_Ids.AddConnection(a_PeerId);
@@ -17,8 +31,12 @@ void IServerSocket::OnDisconnectPeer(PeerID a_PeerId) {
void IServerSocket::OnReceivePeer(PeerID a_PeerId, const protocol::PacketBase& a_Packet) {
auto playerId = m_Ids.GetPlayerId(a_PeerId);
ConnectionHandler handler(*this, playerId);
a_Packet.Dispatch(handler);
for (const auto& factory : m_Handlers) {
auto handler = factory(playerId);
a_Packet.Dispatch(*handler);
}
OnReceive(playerId, a_Packet);
}