summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/libsock/server/client.hpp5
-rw-r--r--src/server/client.cpp22
-rw-r--r--src/server/clients.cpp2
3 files changed, 19 insertions, 10 deletions
diff --git a/include/libsock/server/client.hpp b/include/libsock/server/client.hpp
index 0579a38..f7d9889 100644
--- a/include/libsock/server/client.hpp
+++ b/include/libsock/server/client.hpp
@@ -43,7 +43,8 @@ class Client {
template <typename... Args>
bool write(std::format_string<Args...> fmt, Args &&...args);
- void run();
+ void resumeHistory();
+ void runLoop(bool resumeHistory = true, std::optional<std::function<std::any(const SRecvData &)>> cb = std::nullopt);
bool isValid();
@@ -61,7 +62,7 @@ class Client {
std::optional<std::string> m_szReading = std::nullopt;
- void recvLoop();
+ void recvLoop(std::optional<std::function<std::any(const SRecvData &)>> cb = std::nullopt);
friend class Clients;
};
diff --git a/src/server/client.cpp b/src/server/client.cpp
index d89aea0..f3d601a 100644
--- a/src/server/client.cpp
+++ b/src/server/client.cpp
@@ -40,7 +40,7 @@ Client::~Client() {
m_sockfd.reset();
}
-void Client::recvLoop() {
+void Client::recvLoop(std::optional<std::function<std::any(const SRecvData &)>> cb) {
while (true) {
auto recvData = read();
if (!recvData->good)
@@ -51,6 +51,9 @@ void Client::recvLoop() {
continue;
pClients->m_vDatas.push_back({recvData->data, self});
+
+ if (cb)
+ (*cb)(*recvData);
}
}
@@ -98,13 +101,18 @@ UP<SRecvData> Client::read(const std::string &msg, std::optional<std::function<s
return read(cb);
}
-void Client::run() {
- for (const auto &chat : pClients->getDatas()) {
- write(chat.msg);
- recvLoop();
+void Client::runLoop(bool resumeHist, std::optional<std::function<std::any(const SRecvData &)>> cb) {
+ if (resumeHist)
+ resumeHistory();
- pClients->kick(self);
- }
+ recvLoop();
+
+ pClients->kick(self);
+}
+
+void Client::resumeHistory() {
+ for (const auto &chat : pClients->getDatas())
+ write(chat.msg);
}
bool Client::isValid() {
diff --git a/src/server/clients.cpp b/src/server/clients.cpp
index ac3546e..6f3f4e4 100644
--- a/src/server/clients.cpp
+++ b/src/server/clients.cpp
@@ -60,7 +60,7 @@ Clients::~Clients() {
WP<Client> Clients::newClient(SP<Server> server, std::optional<std::function<std::any(WP<Client>)>> cb) {
SP client = SP<Client>(new Client(server, shared_from_this()));
- auto &instance = m_vClients.emplace_back(std::jthread([client]() { client->run(); }), client);
+ auto &instance = m_vClients.emplace_back(std::jthread([&client]() { client->runLoop(); }), client);
instance.second->self = std::weak_ptr<Client>(instance.second);
if (cb)
(*cb)(instance.second);