From 384d4bfcd0c1f18199720c21c4489834289b12ba Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Wed, 27 Jan 2016 15:01:39 +0100 Subject: [PATCH] Create main slack channel after registering to Slack --- .../src/frontends/slack/SlackFrontend.cpp | 2 +- spectrum/src/frontends/slack/SlackSession.cpp | 41 ++++++++++++++++--- spectrum/src/frontends/slack/SlackSession.h | 3 ++ .../frontends/slack/SlackUserRegistration.cpp | 10 ++++- 4 files changed, 47 insertions(+), 9 deletions(-) diff --git a/spectrum/src/frontends/slack/SlackFrontend.cpp b/spectrum/src/frontends/slack/SlackFrontend.cpp index 7d07bbe6..c9219668 100644 --- a/spectrum/src/frontends/slack/SlackFrontend.cpp +++ b/spectrum/src/frontends/slack/SlackFrontend.cpp @@ -123,7 +123,7 @@ std::string SlackFrontend::getOAuth2URL(const std::vector &args) { } std::string SlackFrontend::getRegistrationFields() { - return "Slack team name\n3rd-party network username\n3rd-party network password"; + return "Main Slack channel\n3rd-party network username\n3rd-party network password"; } bool SlackFrontend::handleAdminMessage(Swift::Message::ref message) { diff --git a/spectrum/src/frontends/slack/SlackSession.cpp b/spectrum/src/frontends/slack/SlackSession.cpp index 35dccaf4..1b2d5929 100644 --- a/spectrum/src/frontends/slack/SlackSession.cpp +++ b/spectrum/src/frontends/slack/SlackSession.cpp @@ -215,6 +215,40 @@ void SlackSession::handleJoinMessage(const std::string &message, std::vectorchannelsList(boost::bind(&SlackSession::handleJoinRoomList, this, _1, _2, _3, _4, args)); } +void SlackSession::handleSlackChannelCreate(HTTPRequest *req, bool ok, rapidjson::Document &resp, const std::string &data) { + std::string channelId = m_api->getChannelId(req, ok, resp, data); + if (channelId.empty()) { + LOG4CXX_INFO(logger,"Error creating channel " << m_slackChannel << "."); + return; + } + + m_slackChannel = channelId; + Swift::Presence::ref presence = Swift::Presence::create(); + presence->setFrom(Swift::JID("", m_uinfo.jid, "default")); + presence->setTo(m_component->getJID()); + presence->setType(Swift::Presence::Available); + presence->addPayload(boost::shared_ptr(new Swift::MUCPayload())); + m_component->getFrontend()->onPresenceReceived(presence); +} + +void SlackSession::handleSlackChannelList(HTTPRequest *req, bool ok, rapidjson::Document &resp, const std::string &data) { + std::map channels; + SlackAPI::getSlackChannelInfo(req, ok, resp, data, channels); + + if (channels.find(m_slackChannel) != channels.end()) { + m_slackChannel = channels[m_slackChannel].id; + Swift::Presence::ref presence = Swift::Presence::create(); + presence->setFrom(Swift::JID("", m_uinfo.jid, "default")); + presence->setTo(m_component->getJID()); + presence->setType(Swift::Presence::Available); + presence->addPayload(boost::shared_ptr(new Swift::MUCPayload())); + m_component->getFrontend()->onPresenceReceived(presence); + } + else { + m_api->channelsCreate(m_slackChannel, boost::bind(&SlackSession::handleSlackChannelCreate, this, _1, _2, _3, _4)); + } +} + void SlackSession::handleLeaveMessage(const std::string &message, std::vector &args, bool quiet) { // .spectrum2 leave.room channel std::string slackChannel = SlackAPI::SlackObjectToPlainText(args[2], true); @@ -452,12 +486,7 @@ void SlackSession::handleImOpen(HTTPRequest *req, bool ok, rapidjson::Document & else { m_storageBackend->getUserSetting(m_uinfo.id, "slack_channel", type, m_slackChannel); if (!m_slackChannel.empty()) { - Swift::Presence::ref presence = Swift::Presence::create(); - presence->setFrom(Swift::JID("", m_uinfo.jid, "default")); - presence->setTo(m_component->getJID()); - presence->setType(Swift::Presence::Available); - presence->addPayload(boost::shared_ptr(new Swift::MUCPayload())); - m_component->getFrontend()->onPresenceReceived(presence); + m_api->channelsList(boost::bind(&SlackSession::handleSlackChannelList, this, _1, _2, _3, _4)); } else { std::string msg; diff --git a/spectrum/src/frontends/slack/SlackSession.h b/spectrum/src/frontends/slack/SlackSession.h index fd08468d..7cb39628 100644 --- a/spectrum/src/frontends/slack/SlackSession.h +++ b/spectrum/src/frontends/slack/SlackSession.h @@ -73,6 +73,9 @@ class SlackSession { void handleJoinRoomCreate(HTTPRequest *req, bool ok, rapidjson::Document &resp, const std::string &data, std::vector args); void handleJoinRoomList(HTTPRequest *req, bool ok, rapidjson::Document &resp, const std::string &data, std::vector args); + void handleSlackChannelCreate(HTTPRequest *req, bool ok, rapidjson::Document &resp, const std::string &data); + void handleSlackChannelList(HTTPRequest *req, bool ok, rapidjson::Document &resp, const std::string &data); + void sendOnlineBuddies(); private: diff --git a/spectrum/src/frontends/slack/SlackUserRegistration.cpp b/spectrum/src/frontends/slack/SlackUserRegistration.cpp index 95854924..12143ee1 100644 --- a/spectrum/src/frontends/slack/SlackUserRegistration.cpp +++ b/spectrum/src/frontends/slack/SlackUserRegistration.cpp @@ -112,6 +112,8 @@ std::string SlackUserRegistration::handleOAuth2Code(const std::string &code, con std::string token; std::string access_token; std::vector data; + std::string value; + int type = (int) TYPE_STRING; if (state == "use_bot_token") { token = code; @@ -148,6 +150,7 @@ std::string SlackUserRegistration::handleOAuth2Code(const std::string &code, con user.id = 0; m_storageBackend->getUser(domain, user); + value = user.jid; user.jid = domain; user.language = "en"; user.encoding = ""; @@ -157,8 +160,11 @@ std::string SlackUserRegistration::handleOAuth2Code(const std::string &code, con m_storageBackend->getUser(user.jid, user); - std::string value = token; - int type = (int) TYPE_STRING; + if (!value.empty()) { + m_storageBackend->getUserSetting(user.id, "slack_channel", type, value); + } + + value = token; m_storageBackend->getUserSetting(user.id, "bot_token", type, value); value = access_token;