2025-07-16 20:25:01 +02:00
|
|
|
#include "client.h"
|
|
|
|
|
|
|
|
|
|
#include <QWebSocket>
|
|
|
|
|
|
|
|
|
|
#include "webserver.h"
|
|
|
|
|
|
|
|
|
|
Client::Client(WebServer &server, std::unique_ptr<QWebSocket> &&socket,
|
|
|
|
|
const QString &serial, const std::set<std::unique_ptr<Client>> &serialClients) :
|
|
|
|
|
QObject{&server},
|
|
|
|
|
m_server{server},
|
|
|
|
|
m_socket{std::move(socket)},
|
|
|
|
|
m_serial{serial}
|
|
|
|
|
{
|
|
|
|
|
qDebug() << "new ws connection!!" << m_socket->requestUrl();
|
|
|
|
|
|
2025-07-16 20:29:30 +02:00
|
|
|
connect(m_socket.get(), &QWebSocket::textMessageReceived,
|
|
|
|
|
this, &Client::textMessageReceived);
|
|
|
|
|
|
2025-07-16 20:25:01 +02:00
|
|
|
m_socket->sendTextMessage(QString{"Hello from server %0, you requested serial %1, there are %2 clients connected"}
|
|
|
|
|
.arg(m_server.m_identity, serial).arg(serialClients.size()));
|
|
|
|
|
|
|
|
|
|
for (auto &other : serialClients)
|
|
|
|
|
{
|
|
|
|
|
other->sendTextMessage(QString{"A new client connected, number of connected clients: %0"}.arg(serialClients.size() + 1));
|
|
|
|
|
|
|
|
|
|
connect(this, &Client::sendTextMessageToOthers,
|
|
|
|
|
other.get(), &Client::sendTextMessage);
|
|
|
|
|
connect(other.get(), &Client::sendTextMessageToOthers,
|
|
|
|
|
this, &Client::sendTextMessage);
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-16 20:29:30 +02:00
|
|
|
connect(m_socket.get(), &QWebSocket::disconnected,
|
|
|
|
|
this, &Client::socketDisconnected);
|
2025-07-16 20:25:01 +02:00
|
|
|
|
2025-07-16 20:29:30 +02:00
|
|
|
connect(m_socket.get(), &QWebSocket::destroyed,
|
|
|
|
|
this, &Client::socketDestroyed);
|
2025-07-16 20:25:01 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Client::~Client() = default;
|
|
|
|
|
|
|
|
|
|
void Client::sendTextMessage(const QString &text)
|
|
|
|
|
{
|
|
|
|
|
qDebug() << text;
|
|
|
|
|
if (m_socket)
|
|
|
|
|
m_socket->sendTextMessage(text);
|
|
|
|
|
else
|
|
|
|
|
qWarning() << "tried to send with invalid socket";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Client::textMessageReceived(const QString &text)
|
|
|
|
|
{
|
|
|
|
|
qDebug() << text;
|
|
|
|
|
emit sendTextMessageToOthers(text);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Client::socketDestroyed()
|
|
|
|
|
{
|
|
|
|
|
qDebug() << "destroyed";
|
|
|
|
|
m_socket.release();
|
|
|
|
|
assert(!m_socket);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Client::socketDisconnected()
|
|
|
|
|
{
|
|
|
|
|
qDebug() << "disconnected";
|
|
|
|
|
|
|
|
|
|
std::set<std::unique_ptr<Client>> &serialClients = m_server.m_clients[m_serial];
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
auto iter = std::find_if(std::begin(serialClients), std::end(serialClients), [this](const auto &ptr){
|
|
|
|
|
return ptr.get() == this;
|
|
|
|
|
});
|
|
|
|
|
if (iter == std::end(serialClients))
|
|
|
|
|
qWarning() << "couldnt fint ourself when trying to erase us";
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
qDebug() << serialClients.size();
|
|
|
|
|
serialClients.extract(iter).value().release()->deleteLater();
|
|
|
|
|
qDebug() << serialClients.size();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (serialClients.empty())
|
2025-07-29 22:02:07 +02:00
|
|
|
{
|
|
|
|
|
#ifdef FEATURE_REDIS
|
2025-07-16 20:25:01 +02:00
|
|
|
m_server.destroyTraefikRoute(m_serial);
|
2025-07-29 22:02:07 +02:00
|
|
|
#endif
|
|
|
|
|
}
|
2025-07-16 20:25:01 +02:00
|
|
|
else for (auto &ptr : serialClients)
|
|
|
|
|
ptr->sendTextMessage(QString{"A client disconnected, number of remaining connected clients: %0"}.arg(serialClients.size()));
|
|
|
|
|
|
|
|
|
|
qDebug() << "done with sending...";
|
|
|
|
|
}
|