Files
less_shitty_proxyjs/client.cpp

94 lines
2.7 KiB
C++

#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();
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<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())
{
#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...";
}