Changeset - 00c5273fbb13
[Not reviewed]
0 6 0
Jan Kaluza - 9 years ago 2016-02-20 07:23:07
jkaluza@redhat.com
Slack: Handle channels starting with hash, do not reconnect to Slack RTM when URL expired
6 files changed with 43 insertions and 3 deletions:
0 comments (0 inline, 0 general)
backends/libpurple/main.cpp
Show inline comments
 
@@ -2083,15 +2083,18 @@ static void transportDataReceived(gpointer data, gint source, PurpleInputConditi
 
			firstPing = false;
 
			NetworkPlugin::PluginConfig cfg;			
 
			cfg.setSupportMUC(true);
 
			if (CONFIG_STRING(config, "service.protocol") == "prpl-telegram") {
 
				cfg.setNeedPassword(false);
 
			}
 
			if (CONFIG_STRING(config, "service.protocol") != "prpl-irc") {
 
			if (CONFIG_STRING(config, "service.protocol") == "prpl-irc") {
 
				cfg.setNeedRegistration(false);
 
			}
 
			else {
 
				cfg.setNeedRegistration(true);
 
			}
 
			np->sendConfig(cfg);
 
		}
 

	
 
		np->handleDataRead(d);
 
	}
 
	else {
include/transport/WebSocketClient.h
Show inline comments
 
@@ -52,12 +52,13 @@ class WebSocketClient {
 
	public:
 
		WebSocketClient(Component *component, const std::string &user);
 

	
 
		virtual ~WebSocketClient();
 

	
 
		void connectServer(const std::string &u);
 
		void disconnectServer();
 

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

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

	
 
		boost::signal<void ()> onWebSocketConnected;
libtransport/WebSocketClient.cpp
Show inline comments
 
@@ -79,12 +79,19 @@ void WebSocketClient::connectServer(const std::string &url) {
 
	std::string u = url.substr(6);
 
	m_host = u.substr(0, u.find("/"));
 
	m_path = u.substr(u.find("/"));
 
	connectServer();
 
}
 

	
 
void WebSocketClient::disconnectServer() {
 
	if (m_conn) {
 
		m_conn->onDataRead.disconnect(boost::bind(&WebSocketClient::handleDataRead, this, _1));
 
		m_conn->disconnect();
 
	}
 
}
 

	
 
void WebSocketClient::write(const std::string &data) {
 
	if (!m_conn) {
 
		return;
 
	}
 

	
 
	uint8_t opcode = 129; // UTF8
spectrum/src/frontends/slack/SlackRTM.cpp
Show inline comments
 
@@ -89,12 +89,20 @@ void SlackRTM::start() {
 
#define GET_OBJECT(FROM, NAME) rapidjson::Value &NAME = FROM[#NAME]; \
 
	if (!NAME.IsObject()) { \
 
		LOG4CXX_ERROR(logger, "No '" << #NAME << "' object in the reply."); \
 
		return; \
 
	}
 

	
 
#define STORE_INT(FROM, NAME) rapidjson::Value &NAME##_tmp = FROM[#NAME]; \
 
	if (!NAME##_tmp.IsInt()) {  \
 
		LOG4CXX_ERROR(logger, "No '" << #NAME << "' number in the reply."); \
 
		LOG4CXX_ERROR(logger, payload); \
 
		return; \
 
	} \
 
	int NAME = NAME##_tmp.GetInt();
 

	
 
void SlackRTM::handlePayloadReceived(const std::string &payload) {
 
	rapidjson::Document d;
 
	if (d.Parse<0>(payload.c_str()).HasParseError()) {
 
		LOG4CXX_ERROR(logger, "Error while parsing JSON");
 
		LOG4CXX_ERROR(logger, payload);
 
		return;
 
@@ -141,12 +149,23 @@ void SlackRTM::handlePayloadReceived(const std::string &payload) {
 
	}
 
	else if (type == "channel_joined"
 
		  || type == "channel_created") {
 
		std::map<std::string, SlackChannelInfo> &channels = m_idManager->getChannels();
 
		SlackAPI::getSlackChannelInfo(NULL, true, d, payload, channels);
 
	}
 
	else if (type == "error") {
 
		GET_OBJECT(d, error);
 
		STORE_INT(error, code);
 

	
 
		if (code == 1) {
 
			LOG4CXX_INFO(logger, "Reconnecting to Slack network");
 
			m_pingTimer->stop();
 
			m_client->disconnectServer();
 
			start();
 
		}
 
	}
 
}
 

	
 
void SlackRTM::sendMessage(const std::string &channel, const std::string &message) {
 
	m_counter++;
 

	
 
	std::string m = message;
spectrum/src/frontends/slack/SlackSession.cpp
Show inline comments
 
@@ -197,12 +197,15 @@ void SlackSession::handleJoinRoomCreated(const std::string &channelId, std::vect
 
	m_component->getFrontend()->onPresenceReceived(presence);
 

	
 
	m_onlineBuddiesTimer->start();
 
}
 

	
 
void SlackSession::handleJoinMessage(const std::string &message, std::vector<std::string> &args, bool quiet) {
 
	if (args[5][0] == '#') {
 
		args[5].erase(0, 1);
 
	}
 
	LOG4CXX_INFO(logger, m_uinfo.jid << ": Going to join the room " << args[3] << "@" << args[4] << ", transporting it to channel " << args[5]);
 
	m_api->createChannel(args[5], m_idManager->getSelfId(), boost::bind(&SlackSession::handleJoinRoomCreated, this, _1, args));
 
}
 

	
 
void SlackSession::handleSlackChannelCreated(const std::string &channelId) {
 
	m_slackChannel = channelId;
 
@@ -213,13 +216,17 @@ void SlackSession::handleSlackChannelCreated(const std::string &channelId) {
 
	presence->setTo(m_component->getJID());
 
	presence->setType(Swift::Presence::Available);
 
	presence->addPayload(boost::shared_ptr<Swift::Payload>(new Swift::MUCPayload()));
 
	m_component->getFrontend()->onPresenceReceived(presence);
 
}
 

	
 
void SlackSession::leaveRoom(const std::string &channel) {
 
void SlackSession::leaveRoom(const std::string &channel_) {
 
	std::string channel = channel_;
 
	if (channel[0] == '#') {
 
		channel.erase(0, 1);
 
	}
 
	std::string channelId = m_idManager->getId(channel);
 
	std::string to = m_channel2jid[channelId];
 
	if (to.empty()) {
 
		LOG4CXX_ERROR(logger, "Spectrum 2 is not configured to transport this Slack channel.")
 
		return;
 
	}
spectrum/src/frontends/slack/SlackUserRegistration.cpp
Show inline comments
 
@@ -72,13 +72,13 @@ std::string SlackUserRegistration::createOAuth2URL(const std::vector<std::string
 
	std::string url = oauth2->generateAuthURL();
 

	
 
	m_auths[oauth2->getState()] = oauth2;
 
	m_authsData[oauth2->getState()] = args;
 

	
 
	if (args.size() >= 3) {
 
		LOG4CXX_INFO(logger, "Generating OAUth2 URL with slack_channel=" << args[0] << ", 3rd_party_account=" << args[1]);
 
		LOG4CXX_INFO(logger, "Generating OAUth2 URL with slack_channel=" << args[1] << ", 3rd_party_account=" << args[2]);
 
	}
 
	else {
 
		LOG4CXX_WARN(logger, "Generating OAUth2 URL with too few arguments");
 
	}
 

	
 
	return url;
 
@@ -177,12 +177,15 @@ std::string SlackUserRegistration::handleOAuth2Code(const std::string &code, con
 

	
 
	registerUser(user, true);
 

	
 
	m_storageBackend->getUser(user.jid, user);
 

	
 
	if (!slackChannel.empty()) {
 
		if (slackChannel[0] == '#') {
 
			slackChannel.erase(0, 1);
 
		}
 
		m_storageBackend->getUserSetting(user.id, "slack_channel", type, slackChannel);
 
	}
 

	
 
	value = token;
 
	m_storageBackend->getUserSetting(user.id, "bot_token", type, value);
 

	
0 comments (0 inline, 0 general)