#include namespace td { namespace server { IServerSocket::IServerSocket() { } 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); OnPlayerConnect(m_Ids.GetPlayerId(a_PeerId)); } void IServerSocket::OnDisconnectPeer(PeerID a_PeerId) { OnPlayerDisconnect(m_Ids.GetPlayerId(a_PeerId)); m_Ids.RemovePeer(a_PeerId); } void IServerSocket::OnReceivePeer(PeerID a_PeerId, const protocol::PacketBase& a_Packet) { auto playerId = m_Ids.GetPlayerId(a_PeerId); for (const auto& factory : m_Handlers) { auto handler = factory(playerId); a_Packet.Dispatch(*handler); } OnReceive(playerId, a_Packet); } void IServerSocket::Send(PlayerID a_PlayerId, const protocol::PacketBase& a_Packet) { SendPeer(m_Ids.GetPeerId(a_PlayerId), a_Packet); } void IServerSocket::Broadcast(const protocol::PacketBase& a_Packet) { for (auto [peerId, playerId] : m_Ids) { SendPeer(peerId, a_Packet); } } void IServerSocket::Disconnect(PlayerID a_PlayerId) { OnDisconnectPeer(m_Ids.GetPeerId(a_PlayerId)); } } // namespace server } // namespace td