Skip to content

Commit fadd857

Browse files
committed
feat: ability to register callbacks for when clients connect/disconnect
1 parent 6caacee commit fadd857

File tree

2 files changed

+26
-6
lines changed

2 files changed

+26
-6
lines changed

GhostServer/networkmanager.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ void NetworkManager::DisconnectPlayer(Client& c, const char *reason)
235235
if (toErase != -1) {
236236
this->clients.erase(this->clients.begin() + toErase);
237237
UI_EVENT("client_change");
238+
OnConnectedClientsChanged();
238239
}
239240
}
240241

@@ -374,6 +375,7 @@ void NetworkManager::CheckConnection()
374375

375376
UI_EVENT("client_change");
376377
GHOST_LOG("Connection: " + client.name + " (" + (client.spectator ? "spectator" : "player") + ") @ " + client.IP.toString() + ":" + std::to_string(client.port));
378+
OnConnectedClientsChanged();
377379

378380
this->clients.push_back(std::move(client));
379381
}
@@ -658,3 +660,14 @@ bool NetworkManager::IsOnWhitelist(std::string name, sf::IpAddress IP) {
658660

659661
return index != whitelist.end();
660662
}
663+
664+
void NetworkManager::OnConnectedClientsChanged() {
665+
for (auto const& [id, callback] : connectedClientsChangedCallbacks) {
666+
callback();
667+
}
668+
}
669+
670+
int NetworkManager::RegisterConnectedClientsChangedCallback(std::function<void()> callback) {
671+
connectedClientsChangedCallbacks.insert({connectedClientsChangedCallbackId++, callback});
672+
return connectedClientsChangedCallbackId - 1;
673+
}

GhostServer/networkmanager.h

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22

33
#include <SFML/Network.hpp>
44

5-
#include <vector>
6-
#include <set>
7-
#include <mutex>
85
#include <atomic>
9-
#include <thread>
106
#include <cstdint>
117
#include <functional>
8+
#include <map>
9+
#include <mutex>
10+
#include <set>
11+
#include <thread>
12+
#include <vector>
1213

1314
#ifdef GHOST_GUI
1415
#include <QObject>
@@ -104,8 +105,13 @@ class NetworkManager
104105

105106
sf::Clock clock;
106107

108+
std::map<int, std::function<void()>> connectedClientsChangedCallbacks;
109+
int connectedClientsChangedCallbackId = 1;
110+
107111
void DoHeartbeats();
108112

113+
void OnConnectedClientsChanged();
114+
109115
public:
110116
NetworkManager(const char *logfile = "ghost_log.log");
111117
~NetworkManager();
@@ -144,11 +150,12 @@ class NetworkManager
144150

145151
bool IsOnWhitelist(std::string name, sf::IpAddress IP);
146152

153+
int RegisterConnectedClientsChangedCallback(std::function<void()> callback);
154+
void UnregisterConnectedClientsChangedCallback(int id) { connectedClientsChangedCallbacks.erase(id); }
155+
147156
#ifdef GHOST_GUI
148157
signals:
149158
void OnNewEvent(QString log);
150159
void UIEvent(std::string event);
151160
#endif
152-
153-
154161
};

0 commit comments

Comments
 (0)