From fadd8571cd6689a2127cf709ef1d02d9e379417d Mon Sep 17 00:00:00 2001 From: David Ganz Date: Sun, 14 Dec 2025 16:55:23 +0100 Subject: [PATCH 1/2] feat: ability to register callbacks for when clients connect/disconnect --- GhostServer/networkmanager.cpp | 13 +++++++++++++ GhostServer/networkmanager.h | 19 +++++++++++++------ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/GhostServer/networkmanager.cpp b/GhostServer/networkmanager.cpp index 9fc7e38..b3f8590 100644 --- a/GhostServer/networkmanager.cpp +++ b/GhostServer/networkmanager.cpp @@ -235,6 +235,7 @@ void NetworkManager::DisconnectPlayer(Client& c, const char *reason) if (toErase != -1) { this->clients.erase(this->clients.begin() + toErase); UI_EVENT("client_change"); + OnConnectedClientsChanged(); } } @@ -374,6 +375,7 @@ void NetworkManager::CheckConnection() UI_EVENT("client_change"); GHOST_LOG("Connection: " + client.name + " (" + (client.spectator ? "spectator" : "player") + ") @ " + client.IP.toString() + ":" + std::to_string(client.port)); + OnConnectedClientsChanged(); this->clients.push_back(std::move(client)); } @@ -658,3 +660,14 @@ bool NetworkManager::IsOnWhitelist(std::string name, sf::IpAddress IP) { return index != whitelist.end(); } + +void NetworkManager::OnConnectedClientsChanged() { + for (auto const& [id, callback] : connectedClientsChangedCallbacks) { + callback(); + } +} + +int NetworkManager::RegisterConnectedClientsChangedCallback(std::function callback) { + connectedClientsChangedCallbacks.insert({connectedClientsChangedCallbackId++, callback}); + return connectedClientsChangedCallbackId - 1; +} \ No newline at end of file diff --git a/GhostServer/networkmanager.h b/GhostServer/networkmanager.h index 1f90a33..13efbc5 100644 --- a/GhostServer/networkmanager.h +++ b/GhostServer/networkmanager.h @@ -2,13 +2,14 @@ #include -#include -#include -#include #include -#include #include #include +#include +#include +#include +#include +#include #ifdef GHOST_GUI #include @@ -104,8 +105,13 @@ class NetworkManager sf::Clock clock; + std::map> connectedClientsChangedCallbacks; + int connectedClientsChangedCallbackId = 1; + void DoHeartbeats(); + void OnConnectedClientsChanged(); + public: NetworkManager(const char *logfile = "ghost_log.log"); ~NetworkManager(); @@ -144,11 +150,12 @@ class NetworkManager bool IsOnWhitelist(std::string name, sf::IpAddress IP); + int RegisterConnectedClientsChangedCallback(std::function callback); + void UnregisterConnectedClientsChangedCallback(int id) { connectedClientsChangedCallbacks.erase(id); } + #ifdef GHOST_GUI signals: void OnNewEvent(QString log); void UIEvent(std::string event); #endif - - }; From 754e39667638cd8e6dd1d40c438b4600cdbbc443 Mon Sep 17 00:00:00 2001 From: ThisAMJ <69196954+ThisAMJ@users.noreply.github.com> Date: Mon, 15 Dec 2025 11:23:47 +1100 Subject: [PATCH 2/2] feat: allow registering handlers to any ui event --- GhostServer/networkmanager.cpp | 26 ++++++++++++++------------ GhostServer/networkmanager.h | 11 +++++------ 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/GhostServer/networkmanager.cpp b/GhostServer/networkmanager.cpp index b3f8590..a1fd04c 100644 --- a/GhostServer/networkmanager.cpp +++ b/GhostServer/networkmanager.cpp @@ -23,11 +23,9 @@ static void file_log(std::string str) { #ifdef GHOST_GUI # include # define GHOST_LOG(x) (file_log(x), emit this->OnNewEvent(QString::fromStdString(x))) -# define UI_EVENT(x) (emit this->UIEvent(x)) #else # include # define GHOST_LOG(x) (file_log(x), printf("[LOG] %s\n", std::string(x).c_str())) -# define UI_EVENT(x) ((void)0) #endif #define HEARTBEAT_RATE 5000 @@ -235,7 +233,6 @@ void NetworkManager::DisconnectPlayer(Client& c, const char *reason) if (toErase != -1) { this->clients.erase(this->clients.begin() + toErase); UI_EVENT("client_change"); - OnConnectedClientsChanged(); } } @@ -373,11 +370,11 @@ void NetworkManager::CheckConnection() c.tcpSocket->send(packet_notify_all); } - UI_EVENT("client_change"); GHOST_LOG("Connection: " + client.name + " (" + (client.spectator ? "spectator" : "player") + ") @ " + client.IP.toString() + ":" + std::to_string(client.port)); - OnConnectedClientsChanged(); this->clients.push_back(std::move(client)); + + UI_EVENT("client_change"); } void NetworkManager::ReceiveUDPUpdates(std::vector>& buffer) @@ -661,13 +658,18 @@ bool NetworkManager::IsOnWhitelist(std::string name, sf::IpAddress IP) { return index != whitelist.end(); } -void NetworkManager::OnConnectedClientsChanged() { - for (auto const& [id, callback] : connectedClientsChangedCallbacks) { - callback(); + +void NetworkManager::UI_EVENT(std::string event) { + for (auto item : uiEventCallbacks) { + auto [type, callback] = item.second; + if (type == event) callback(); } +#ifdef GHOST_GUI + emit this->UIEvent(event); +#endif } -int NetworkManager::RegisterConnectedClientsChangedCallback(std::function callback) { - connectedClientsChangedCallbacks.insert({connectedClientsChangedCallbackId++, callback}); - return connectedClientsChangedCallbackId - 1; -} \ No newline at end of file +int NetworkManager::RegisterEventCallback(std::string type, std::function callback) { + uiEventCallbacks.insert({uiEventCallbackId++, {type, callback}}); + return uiEventCallbackId - 1; +} diff --git a/GhostServer/networkmanager.h b/GhostServer/networkmanager.h index 13efbc5..0bece3f 100644 --- a/GhostServer/networkmanager.h +++ b/GhostServer/networkmanager.h @@ -105,13 +105,11 @@ class NetworkManager sf::Clock clock; - std::map> connectedClientsChangedCallbacks; - int connectedClientsChangedCallbackId = 1; + std::map>> uiEventCallbacks; + int uiEventCallbackId = 1; void DoHeartbeats(); - void OnConnectedClientsChanged(); - public: NetworkManager(const char *logfile = "ghost_log.log"); ~NetworkManager(); @@ -150,8 +148,9 @@ class NetworkManager bool IsOnWhitelist(std::string name, sf::IpAddress IP); - int RegisterConnectedClientsChangedCallback(std::function callback); - void UnregisterConnectedClientsChangedCallback(int id) { connectedClientsChangedCallbacks.erase(id); } + void UI_EVENT(std::string event); + int RegisterEventCallback(std::string type, std::function callback); + void UnregisterEventCallback(int id) { uiEventCallbacks.erase(id); } #ifdef GHOST_GUI signals: