Changeset - 6cfc7e743431
[Not reviewed]
0 4 0
Jan Kaluza - 10 years ago 2015-11-25 17:02:51
jkaluza@redhat.com
Do not start SlackRTM until we are really connected to WebSocket and the connection is upgraded
4 files changed with 8 insertions and 0 deletions:
0 comments (0 inline, 0 general)
include/transport/WebSocketClient.h
Show inline comments
 
@@ -57,12 +57,14 @@ class WebSocketClient {
 
		void connectServer(const std::string &u);
 

	
 
		void write(const std::string &data);
 

	
 
		boost::signal<void (const std::string &payload)> onPayloadReceived;
 

	
 
		boost::signal<void ()> onWebSocketConnected;
 

	
 
	private:
 
		void handleDNSResult(const std::vector<Swift::HostAddress>&, boost::optional<Swift::DomainNameResolveError>);
 
		void handleDataRead(boost::shared_ptr<Swift::SafeByteArray> data);
 
		void handleConnected(bool error);
 

	
 
		void connectServer();
spectrum/src/frontends/slack/SlackRTM.cpp
Show inline comments
 
@@ -40,12 +40,14 @@ DEFINE_LOGGER(logger, "SlackRTM");
 
SlackRTM::SlackRTM(Component *component, StorageBackend *storageBackend, UserInfo uinfo) : m_uinfo(uinfo) {
 
	m_component = component;
 
	m_storageBackend = storageBackend;
 
	m_counter = 0;
 
	m_client = new WebSocketClient(component);
 
	m_client->onPayloadReceived.connect(boost::bind(&SlackRTM::handlePayloadReceived, this, _1));
 
	m_client->onWebSocketConnected.connect(boost::bind(&SlackRTM::handleWebSocketConnected, this));
 

	
 
	m_pingTimer = m_component->getNetworkFactories()->getTimerFactory()->createTimer(20000);
 
	m_pingTimer->onTick.connect(boost::bind(&SlackRTM::sendPing, this));
 

	
 
	int type = (int) TYPE_STRING;
 
	m_storageBackend->getUserSetting(m_uinfo.id, "bot_token", type, m_token);
 

	
 
@@ -124,12 +126,14 @@ void SlackRTM::handleRTMStart(HTTPRequest *req, bool ok, rapidjson::Document &re
 
	std::string u = url.GetString();
 
	LOG4CXX_INFO(logger, "Started RTM, WebSocket URL is " << u);
 
	LOG4CXX_INFO(logger, data);
 

	
 
	m_client->connectServer(u);
 
	m_pingTimer->start();
 
}
 

	
 
void SlackRTM::handleWebSocketConnected() {
 
	onRTMStarted();
 
}
 

	
 

	
 
}
spectrum/src/frontends/slack/SlackRTM.h
Show inline comments
 
@@ -82,12 +82,13 @@ class SlackRTM {
 

	
 
		boost::signal<void (const std::string &channel, const std::string &user, const std::string &text)> onMessageReceived;
 

	
 
	private:
 
		void handlePayloadReceived(const std::string &payload);
 
		void handleRTMStart(HTTPRequest *req, bool ok, rapidjson::Document &resp, const std::string &data);
 
		void handleWebSocketConnected();
 

	
 
	private:
 
		std::map<std::string, SlackChannelInfo> m_channels;
 
		std::map<std::string, SlackImInfo> m_ims;
 
		std::map<std::string, SlackUserInfo> m_users;
 

	
src/WebSocketClient.cpp
Show inline comments
 
@@ -119,12 +119,13 @@ void WebSocketClient::handleDataRead(boost::shared_ptr<Swift::SafeByteArray> dat
 
	m_buffer += d;
 

	
 
	if (!m_upgraded) {
 
		if (m_buffer.find("\r\n\r\n") != std::string::npos) {
 
			m_buffer.erase(0, m_buffer.find("\r\n\r\n") + 4);
 
			m_upgraded = true;
 
			onWebSocketConnected();
 
		}
 
		else {
 
			return;
 
		}
 
	}
 

	
0 comments (0 inline, 0 general)