57 lines
1.6 KiB
C++
57 lines
1.6 KiB
C++
#include <server/IServerSocket.h>
|
|
|
|
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<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);
|
|
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
|