diff --git a/include/server/IServerSocket.h b/include/server/IServerSocket.h index 5fd4aa3..baee286 100644 --- a/include/server/IServerSocket.h +++ b/include/server/IServerSocket.h @@ -9,6 +9,9 @@ namespace server { class IServerSocket { public: + using PlayerPacketHandlerType = std::unique_ptr(PlayerID); + using PlayerPacketHandler = std::function; + utils::Signal OnPlayerJoin; utils::Signal OnPlayerLeave; utils::Signal OnReceive; @@ -18,11 +21,15 @@ class IServerSocket { void Disconnect(PlayerID a_PlayerId); - IServerSocket() {} + void RegisterHandler(const PlayerPacketHandler& a_Handler); + void UnregisterHandler(const PlayerPacketHandler& a_Handler); + + IServerSocket(); virtual ~IServerSocket() {} private: PlayerIds m_Ids; + std::vector m_Handlers; protected: void OnConnectPeer(PeerID a_PeerId); diff --git a/src/server/IServerSocket.cpp b/src/server/IServerSocket.cpp index acecd9f..88e5027 100644 --- a/src/server/IServerSocket.cpp +++ b/src/server/IServerSocket.cpp @@ -5,6 +5,20 @@ namespace td { namespace server { +IServerSocket::IServerSocket() { + RegisterHandler([this](PlayerID a_PlayerId) { return std::make_unique(*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() == handler.template target(); }); + 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); }