#include "client.h" #include #include "webserver.h" Client::Client(WebServer &server, std::unique_ptr &&socket, const QString &serial, const std::set> &serialClients) : QObject{&server}, m_server{server}, m_socket{std::move(socket)}, m_serial{serial} { qDebug() << "new ws connection!!" << m_socket->requestUrl(); connect(m_socket.get(), &QWebSocket::textMessageReceived, this, &Client::textMessageReceived); 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); } connect(m_socket.get(), &QWebSocket::disconnected, this, &Client::socketDisconnected); connect(m_socket.get(), &QWebSocket::destroyed, this, &Client::socketDestroyed); } 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> &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()) { #ifdef FEATURE_REDIS m_server.destroyTraefikRoute(m_serial); #endif } else for (auto &ptr : serialClients) ptr->sendTextMessage(QString{"A client disconnected, number of remaining connected clients: %0"}.arg(serialClients.size())); qDebug() << "done with sending..."; }