summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorlittleblack111 <littleblack11111@gmail.com>2025-06-18 09:07:50 +0800
committerlittleblack111 <littleblack11111@gmail.com>2025-06-18 09:07:50 +0800
commit0804c1285fe16977bce9f69c426a59994bebf594 (patch)
tree26496e5d138c77d819d29a1d22b1bac46cea4bc1 /src
parentb46ba43e06aba714abc0afb29566a56d69891691 (diff)
feat: shutdownClients accepts an optional cb func now
fix: disallow creation of multiple clientManager
Diffstat (limited to 'src')
-rw-r--r--src/server/clients.cpp15
1 files changed, 7 insertions, 8 deletions
diff --git a/src/server/clients.cpp b/src/server/clients.cpp
index 210581a..d3a9908 100644
--- a/src/server/clients.cpp
+++ b/src/server/clients.cpp
@@ -3,22 +3,18 @@
#include <any>
#include <format>
#include <ranges>
+#include <stdexcept>
#include <unistd.h>
#include <utility>
using namespace LibSock::Server;
-void Clients::shutdownClients() {
+void Clients::shutdownClients(std::optional<std::function<std::any(const std::vector<std::pair<std::jthread, SP<Client>>> &)>> cb) {
if (m_vClients.empty())
return;
- for (auto &[thread, client] : m_vClients) {
- if (client) {
- client->write("Server shutting down");
- if (!client->getName().empty())
- broadcast(std::format("{} has left the chat", client->getName()), WP<Client>(client));
- }
- }
+ if (cb)
+ (*cb)(m_vClients);
for (auto &[thread, client] : m_vClients) {
if (thread.joinable())
@@ -34,6 +30,9 @@ Clients::Clients() {
// shutdownClients();
// }))
// void(); // failed to register exit handler...
+ if (pClients)
+ throw std::runtime_error("server:client: ClientManager already exist");
+
pClients = SP<Clients>(this);
};