summaryrefslogtreecommitdiff
path: root/include/libsock/server/clients.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/libsock/server/clients.hpp')
-rw-r--r--include/libsock/server/clients.hpp51
1 files changed, 51 insertions, 0 deletions
diff --git a/include/libsock/server/clients.hpp b/include/libsock/server/clients.hpp
new file mode 100644
index 0000000..9b94127
--- /dev/null
+++ b/include/libsock/server/clients.hpp
@@ -0,0 +1,51 @@
+#pragma once
+
+#include "../types.hpp"
+#include <any>
+#include <functional>
+#include <optional>
+#include <string>
+#include <thread>
+#include <vector>
+
+namespace LibSock {
+namespace Server {
+
+class Client;
+
+struct SData {
+ std::string msg;
+ std::optional<WP<Client>> sender = std::nullopt;
+};
+class Clients {
+ public:
+ Clients();
+ ~Clients();
+
+ WP<Client> newClient(
+ std::optional<std::function<std::any(WP<Client>)>> cb = std::nullopt
+ );
+
+ void broadcast(const std::string &msg,
+ std::optional<WP<Client>> self = std::nullopt); // second param only specified when we
+ // want to exclude the sender
+ void kick(WP<Client> client, const bool kill = false, const std::string &reason = "", std::optional<std::function<std::any(const std::vector<std::pair<std::jthread, SP<Client>>>::iterator &)>> cb = std::nullopt);
+ void addClient(const Client &client);
+
+ void shutdownClients(std::optional<std::function<std::any(const std::vector<std::pair<std::jthread, SP<Client>>> &)>> cb = std::nullopt);
+
+ SP<Client> getByIp(const std::string &ip) const;
+ std::vector<SP<Client>> getClients() const;
+ std::vector<SData> getDatas() const;
+
+ private:
+ void broadcast(const SData &msg);
+
+ std::vector<std::pair<std::jthread, SP<Client>>> m_vClients;
+ std::vector<SData> m_vDatas;
+
+ friend class Client;
+};
+
+} // namespace Server
+} // namespace LibSock