diff --git a/include/transport/WebSocketClient.h b/include/transport/WebSocketClient.h index c078900e..bdfa7dbc 100644 --- a/include/transport/WebSocketClient.h +++ b/include/transport/WebSocketClient.h @@ -61,6 +61,7 @@ class WebSocketClient { boost::signal onPayloadReceived; boost::signal onWebSocketConnected; + boost::signal &error)> onWebSocketDisconnected; private: void handleDNSResult(const std::vector&, boost::optional); diff --git a/libtransport/WebSocketClient.cpp b/libtransport/WebSocketClient.cpp index f21abe27..36c9335e 100644 --- a/libtransport/WebSocketClient.cpp +++ b/libtransport/WebSocketClient.cpp @@ -218,6 +218,7 @@ void WebSocketClient::handleDisconnected(const boost::optionalstart(); } diff --git a/spectrum/src/frontends/slack/SlackRTM.cpp b/spectrum/src/frontends/slack/SlackRTM.cpp index e7280422..98a19205 100644 --- a/spectrum/src/frontends/slack/SlackRTM.cpp +++ b/spectrum/src/frontends/slack/SlackRTM.cpp @@ -42,6 +42,7 @@ SlackRTM::SlackRTM(Component *component, StorageBackend *storageBackend, UserInf m_component = component; m_storageBackend = storageBackend; m_counter = 0; + m_started = false; m_client = new WebSocketClient(component); m_client->onPayloadReceived.connect(boost::bind(&SlackRTM::handlePayloadReceived, this, _1)); m_client->onWebSocketConnected.connect(boost::bind(&SlackRTM::handleWebSocketConnected, this)); @@ -192,11 +193,19 @@ void SlackRTM::handleRTMStart(HTTPRequest *req, bool ok, rapidjson::Document &re LOG4CXX_INFO(logger, data); m_client->connectServer(u); - m_pingTimer->start(); } void SlackRTM::handleWebSocketConnected() { - onRTMStarted(); + if (!m_started) { + onRTMStarted(); + m_started = true; + } + + m_pingTimer->start(); +} + +void SlackRTM::handleWebSocketDisconnected(const boost::optional &error) { + m_pingTimer->stop(); } diff --git a/spectrum/src/frontends/slack/SlackRTM.h b/spectrum/src/frontends/slack/SlackRTM.h index c8cc7e25..e244718a 100644 --- a/spectrum/src/frontends/slack/SlackRTM.h +++ b/spectrum/src/frontends/slack/SlackRTM.h @@ -32,6 +32,7 @@ #include #include #include +#include #include #include "Swiften/Network/Timer.h" #include "Swiften/Version.h" @@ -92,6 +93,7 @@ class SlackRTM { void handlePayloadReceived(const std::string &payload); void handleRTMStart(HTTPRequest *req, bool ok, rapidjson::Document &resp, const std::string &data); void handleWebSocketConnected(); + void handleWebSocketDisconnected(const boost::optional &error); private: std::map m_channels; @@ -108,6 +110,7 @@ class SlackRTM { unsigned long m_counter; Swift::Timer::ref m_pingTimer; SlackAPI *m_api; + bool m_started; }; }