IServerSocket dispatch
This commit is contained in:
@@ -9,6 +9,9 @@ namespace server {
|
|||||||
|
|
||||||
class IServerSocket {
|
class IServerSocket {
|
||||||
public:
|
public:
|
||||||
|
using PlayerPacketHandlerType = std::unique_ptr<protocol::PacketHandler>(PlayerID);
|
||||||
|
using PlayerPacketHandler = std::function<PlayerPacketHandlerType>;
|
||||||
|
|
||||||
utils::Signal<PlayerID, const protocol::PlayerInfo&> OnPlayerJoin;
|
utils::Signal<PlayerID, const protocol::PlayerInfo&> OnPlayerJoin;
|
||||||
utils::Signal<PlayerID> OnPlayerLeave;
|
utils::Signal<PlayerID> OnPlayerLeave;
|
||||||
utils::Signal<PlayerID, const protocol::PacketBase&> OnReceive;
|
utils::Signal<PlayerID, const protocol::PacketBase&> OnReceive;
|
||||||
@@ -18,11 +21,15 @@ class IServerSocket {
|
|||||||
|
|
||||||
void Disconnect(PlayerID a_PlayerId);
|
void Disconnect(PlayerID a_PlayerId);
|
||||||
|
|
||||||
IServerSocket() {}
|
void RegisterHandler(const PlayerPacketHandler& a_Handler);
|
||||||
|
void UnregisterHandler(const PlayerPacketHandler& a_Handler);
|
||||||
|
|
||||||
|
IServerSocket();
|
||||||
virtual ~IServerSocket() {}
|
virtual ~IServerSocket() {}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
PlayerIds m_Ids;
|
PlayerIds m_Ids;
|
||||||
|
std::vector<PlayerPacketHandler> m_Handlers;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void OnConnectPeer(PeerID a_PeerId);
|
void OnConnectPeer(PeerID a_PeerId);
|
||||||
|
|||||||
@@ -5,6 +5,20 @@
|
|||||||
namespace td {
|
namespace td {
|
||||||
namespace server {
|
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) {
|
void IServerSocket::OnConnectPeer(PeerID a_PeerId) {
|
||||||
// here, the client is not a player yet (we need to wait for auth)
|
// here, the client is not a player yet (we need to wait for auth)
|
||||||
m_Ids.AddConnection(a_PeerId);
|
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) {
|
void IServerSocket::OnReceivePeer(PeerID a_PeerId, const protocol::PacketBase& a_Packet) {
|
||||||
auto playerId = m_Ids.GetPlayerId(a_PeerId);
|
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);
|
OnReceive(playerId, a_Packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user