]> Nutra Git (v2) - gamesguru/feather.git/commitdiff
Websocket: fix unnecessary reconnect
authortobtoht <thotbot@protonmail.com>
Thu, 14 Oct 2021 13:41:14 +0000 (15:41 +0200)
committertobtoht <thotbot@protonmail.com>
Thu, 14 Oct 2021 13:41:14 +0000 (15:41 +0200)
src/WindowManager.cpp
src/utils/WebsocketClient.cpp
src/utils/WebsocketClient.h

index c4c6025ef96f3b4fd069a741878e596a554f307b..a20ece0a5bc0a34b52ebb2515a5e77883d45dd3a 100644 (file)
@@ -460,8 +460,6 @@ void WindowManager::initTor() {
     torManager()->init();
     torManager()->start();
 
-    connect(torManager(), &TorManager::connectionStateChanged, &websocketNotifier()->websocketClient, &WebsocketClient::onToggleConnect);
-
     this->onTorSettingsChanged();
 }
 
index 5855f95d0acefb64aa8428538b230dfa7a002219..7087a17491760e6522ee872ba7bbbe1d38e4f1c8 100644 (file)
@@ -9,76 +9,59 @@
 WebsocketClient::WebsocketClient(QObject *parent)
     : QObject(parent)
 {
-    connect(&webSocket, &QWebSocket::binaryMessageReceived, this, &WebsocketClient::onbinaryMessageReceived);
     connect(&webSocket, &QWebSocket::connected, this, &WebsocketClient::onConnected);
-    connect(&webSocket, &QWebSocket::disconnected, this, &WebsocketClient::closed);
+    connect(&webSocket, &QWebSocket::disconnected, this, &WebsocketClient::onDisconnected);
     connect(&webSocket, QOverload<QAbstractSocket::SocketError>::of(&QWebSocket::error), this, &WebsocketClient::onError);
-    connect(&m_connectionTimer, &QTimer::timeout, this, &WebsocketClient::checkConnection);
+
+    connect(&webSocket, &QWebSocket::binaryMessageReceived, this, &WebsocketClient::onbinaryMessageReceived);
 
     // Keep websocket connection alive
     connect(&m_pingTimer, &QTimer::timeout, [this]{
-        if (webSocket.state() == QAbstractSocket::ConnectedState)
+        if (webSocket.state() == QAbstractSocket::ConnectedState) {
             webSocket.ping();
+        }
     });
     m_pingTimer.setInterval(30 * 1000);
     m_pingTimer.start();
 }
 
 void WebsocketClient::sendMsg(const QByteArray &data) {
-    if (webSocket.state() == QAbstractSocket::ConnectedState)
+    if (webSocket.state() == QAbstractSocket::ConnectedState) {
         webSocket.sendBinaryMessage(data);
-}
-
-void WebsocketClient::onToggleConnect(bool connect) {
-    m_connect = connect;
-    if (m_connect)
-        checkConnection();
+    }
 }
 
 void WebsocketClient::start() {
     // connect & reconnect on errors/close
-#ifdef QT_DEBUG
     qDebug() << "WebSocket connect:" << m_url.url();
-#endif
 
-    if (m_connect)
+    auto state = webSocket.state();
+    if (state != QAbstractSocket::ConnectedState && state != QAbstractSocket::ConnectingState) {
         webSocket.open(m_url);
-
-    if (!m_connectionTimer.isActive()) {
-        m_connectionTimer.start(2000);
-    }
-}
-
-void WebsocketClient::checkConnection() {
-    if (!m_connect)
-        return;
-
-    if (webSocket.state() == QAbstractSocket::UnconnectedState) {
-#ifdef QT_DEBUG
-        qDebug() << "WebSocket reconnect";
-#endif
-        this->start();
     }
 }
 
 void WebsocketClient::onConnected() {
-#ifdef QT_DEBUG
     qDebug() << "WebSocket connected";
-#endif
     emit connectionEstablished();
 }
 
+void WebsocketClient::onDisconnected() {
+    qDebug() << "WebSocket disconnected";
+    QTimer::singleShot(1000, [this]{this->start();});
+}
+
 void WebsocketClient::onError(QAbstractSocket::SocketError error) {
     qCritical() << "WebSocket error: " << error;
     auto state = webSocket.state();
-    if (state == QAbstractSocket::ConnectedState || state == QAbstractSocket::ConnectingState)
+    if (state == QAbstractSocket::ConnectedState || state == QAbstractSocket::ConnectingState) {
         webSocket.abort();
+    }
 }
 
 void WebsocketClient::onbinaryMessageReceived(const QByteArray &message) {
-#ifdef QT_DEBUG
     qDebug() << "WebSocket received:" << message;
-#endif
+
     if (!Utils::validateJSON(message)) {
         qCritical() << "Could not interpret WebSocket message as JSON";
         return;
index c9e098db98f17bd582151de1a5d6e4c716514480..f9aaefc90b8e04a34c31d174d92f4e136fc850d4 100644 (file)
@@ -20,24 +20,18 @@ public:
 
     QWebSocket webSocket;
 
-public slots:
-    void onToggleConnect(bool connect);
-
 signals:
-    void closed();
     void connectionEstablished();
     void WSMessage(QJsonObject message);
 
 private slots:
     void onConnected();
+    void onDisconnected();
     void onbinaryMessageReceived(const QByteArray &message);
-    void checkConnection();
     void onError(QAbstractSocket::SocketError error);
 
 private:
-    bool m_connect = false;
     QUrl m_url = constants::websocketUrl;
-    QTimer m_connectionTimer;
     QTimer m_pingTimer;
 };