From e0ea6762c78cc1c289ad450fa621a5e1b6baa50b Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Wed, 25 Nov 2015 19:20:19 +0100 Subject: [PATCH] Rename SlackInstallation to SlackSession. Allow SlackUser to move SlackSession from SlackUserManager once the SlackUser is created. --- ...SlackInstallation.cpp => SlackSession.cpp} | 22 +++++------ .../{SlackInstallation.h => SlackSession.h} | 6 +-- spectrum/src/frontends/slack/SlackUser.cpp | 7 ++++ spectrum/src/frontends/slack/SlackUser.h | 6 +++ .../src/frontends/slack/SlackUserManager.cpp | 38 ++++++++++--------- .../src/frontends/slack/SlackUserManager.h | 6 ++- 6 files changed, 51 insertions(+), 34 deletions(-) rename spectrum/src/frontends/slack/{SlackInstallation.cpp => SlackSession.cpp} (83%) rename spectrum/src/frontends/slack/{SlackInstallation.h => SlackSession.h} (92%) diff --git a/spectrum/src/frontends/slack/SlackInstallation.cpp b/spectrum/src/frontends/slack/SlackSession.cpp similarity index 83% rename from spectrum/src/frontends/slack/SlackInstallation.cpp rename to spectrum/src/frontends/slack/SlackSession.cpp index 5ddd5eb9..0112380e 100644 --- a/spectrum/src/frontends/slack/SlackInstallation.cpp +++ b/spectrum/src/frontends/slack/SlackSession.cpp @@ -18,7 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ -#include "SlackInstallation.h" +#include "SlackSession.h" #include "SlackFrontend.h" #include "SlackUser.h" #include "SlackRTM.h" @@ -40,25 +40,25 @@ namespace Transport { -DEFINE_LOGGER(logger, "SlackInstallation"); +DEFINE_LOGGER(logger, "SlackSession"); -SlackInstallation::SlackInstallation(Component *component, StorageBackend *storageBackend, UserInfo uinfo) : m_uinfo(uinfo) { +SlackSession::SlackSession(Component *component, StorageBackend *storageBackend, UserInfo uinfo) : m_uinfo(uinfo) { m_component = component; m_storageBackend = storageBackend; m_rtm = new SlackRTM(component, storageBackend, uinfo); - m_rtm->onRTMStarted.connect(boost::bind(&SlackInstallation::handleRTMStarted, this)); - m_rtm->onMessageReceived.connect(boost::bind(&SlackInstallation::handleMessageReceived, this, _1, _2, _3)); + m_rtm->onRTMStarted.connect(boost::bind(&SlackSession::handleRTMStarted, this)); + m_rtm->onMessageReceived.connect(boost::bind(&SlackSession::handleMessageReceived, this, _1, _2, _3)); // m_api = new SlackAPI(component, m_uinfo.encoding); } -SlackInstallation::~SlackInstallation() { +SlackSession::~SlackSession() { delete m_rtm; // delete m_api; } -void SlackInstallation::sendMessage(boost::shared_ptr message) { +void SlackSession::sendMessage(boost::shared_ptr message) { LOG4CXX_INFO(logger, "SEND MESSAGE"); if (message->getFrom().getResource() == "myfavouritebot") { return; @@ -66,7 +66,7 @@ void SlackInstallation::sendMessage(boost::shared_ptr message) { m_rtm->getAPI()->sendMessage(message->getFrom().getResource(), m_jid2channel[message->getFrom().toBare().toString()], message->getBody()); } -void SlackInstallation::handleMessageReceived(const std::string &channel, const std::string &user, const std::string &message) { +void SlackSession::handleMessageReceived(const std::string &channel, const std::string &user, const std::string &message) { if (m_ownerChannel != channel) { std::string to = m_channel2jid[channel]; if (!to.empty()) { @@ -131,7 +131,7 @@ void SlackInstallation::handleMessageReceived(const std::string &channel, const } } -void SlackInstallation::handleImOpen(HTTPRequest *req, bool ok, rapidjson::Document &resp, const std::string &data) { +void SlackSession::handleImOpen(HTTPRequest *req, bool ok, rapidjson::Document &resp, const std::string &data) { m_ownerChannel = m_rtm->getAPI()->getChannelId(req, ok, resp, data); LOG4CXX_INFO(logger, "Opened channel with team owner: " << m_ownerChannel); @@ -143,7 +143,7 @@ void SlackInstallation::handleImOpen(HTTPRequest *req, bool ok, rapidjson::Docum m_rtm->sendMessage(m_ownerChannel, msg); } -void SlackInstallation::handleRTMStarted() { +void SlackSession::handleRTMStarted() { std::string ownerId; std::map &users = m_rtm->getUsers(); for (std::map::iterator it = users.begin(); it != users.end(); it++) { @@ -154,7 +154,7 @@ void SlackInstallation::handleRTMStarted() { } } - m_rtm->getAPI()->imOpen(ownerId, boost::bind(&SlackInstallation::handleImOpen, this, _1, _2, _3, _4)); + m_rtm->getAPI()->imOpen(ownerId, boost::bind(&SlackSession::handleImOpen, this, _1, _2, _3, _4)); } diff --git a/spectrum/src/frontends/slack/SlackInstallation.h b/spectrum/src/frontends/slack/SlackSession.h similarity index 92% rename from spectrum/src/frontends/slack/SlackInstallation.h rename to spectrum/src/frontends/slack/SlackSession.h index 8f76cf13..00287c98 100644 --- a/spectrum/src/frontends/slack/SlackInstallation.h +++ b/spectrum/src/frontends/slack/SlackSession.h @@ -39,11 +39,11 @@ class HTTPRequest; class SlackRTM; class SlackAPI; -class SlackInstallation { +class SlackSession { public: - SlackInstallation(Component *component, StorageBackend *storageBackend, UserInfo uinfo); + SlackSession(Component *component, StorageBackend *storageBackend, UserInfo uinfo); - virtual ~SlackInstallation(); + virtual ~SlackSession(); boost::signal onInstallationDone; diff --git a/spectrum/src/frontends/slack/SlackUser.cpp b/spectrum/src/frontends/slack/SlackUser.cpp index c1b35524..0ff46c6b 100644 --- a/spectrum/src/frontends/slack/SlackUser.cpp +++ b/spectrum/src/frontends/slack/SlackUser.cpp @@ -20,6 +20,8 @@ #include "SlackUser.h" #include "SlackFrontend.h" +#include "SlackSession.h" +#include "SlackUserManager.h" #include "transport/Transport.h" #include "transport/UserManager.h" @@ -41,9 +43,14 @@ SlackUser::SlackUser(const Swift::JID &jid, UserInfo &userInfo, Component *compo m_component = component; m_userManager = userManager; m_userInfo = userInfo; + + m_session = static_cast(userManager)->moveTempSession(m_jid.toString()); } SlackUser::~SlackUser(){ + if (m_session) { + delete m_session; + } } void SlackUser::disconnectUser(const std::string &error, Swift::SpectrumErrorPayload::Error e) { diff --git a/spectrum/src/frontends/slack/SlackUser.h b/spectrum/src/frontends/slack/SlackUser.h index 038fcb85..4a685895 100644 --- a/spectrum/src/frontends/slack/SlackUser.h +++ b/spectrum/src/frontends/slack/SlackUser.h @@ -32,6 +32,7 @@ class ConversationManager; class UserManager; class PresenceOracle; struct UserInfo; +class SlackSession; class SlackUser : public User { public: @@ -41,11 +42,16 @@ class SlackUser : public User { void disconnectUser(const std::string &error, Swift::SpectrumErrorPayload::Error e); + SlackSession *getSession() { + return m_session; + } + private: Swift::JID m_jid; Component *m_component; UserManager *m_userManager; UserInfo m_userInfo; + SlackSession *m_session; }; } diff --git a/spectrum/src/frontends/slack/SlackUserManager.cpp b/spectrum/src/frontends/slack/SlackUserManager.cpp index 20cee001..37963d47 100644 --- a/spectrum/src/frontends/slack/SlackUserManager.cpp +++ b/spectrum/src/frontends/slack/SlackUserManager.cpp @@ -21,7 +21,8 @@ #include "SlackUserManager.h" #include "SlackUserRegistration.h" #include "SlackFrontend.h" -#include "SlackInstallation.h" +#include "SlackSession.h" +#include "SlackUser.h" #include "transport/User.h" #include "transport/Transport.h" @@ -49,21 +50,8 @@ void SlackUserManager::reconnectUser(const std::string &user) { return; } -// if (!uinfo.uin.empty()) { -// LOG4CXX_INFO(logger, "Reconnecting user " << user); -// Swift::Presence::ref response = Swift::Presence::create(); -// response->setTo(m_component->getJID()); -// response->setFrom(user + "@" + m_component->getJID().toString()); -// response->setType(Swift::Presence::Available); -// } -// else { - LOG4CXX_INFO(logger, "Cannot reconnect user " << user << "," - "because he does not have legacy network configured. " - "Continuing in Installation mode for this user until " - "he configures the legacy network."); - m_installations[user] = new SlackInstallation(m_component, m_storageBackend, uinfo); - m_installations[user]->onInstallationDone.connect(boost::bind(&SlackUserManager::reconnectUser, this, _1)); -// } + LOG4CXX_INFO(logger, "Connecting user " << user << " to Slack network."); + m_tempSessions[user] = new SlackSession(m_component, m_storageBackend, uinfo); } void SlackUserManager::sendVCard(unsigned int id, Swift::VCard::ref vcard) { @@ -71,8 +59,22 @@ void SlackUserManager::sendVCard(unsigned int id, Swift::VCard::ref vcard) { } void SlackUserManager::sendMessage(boost::shared_ptr message) { - LOG4CXX_INFO(logger, message->getTo().toBare().toString()); - m_installations[message->getTo().toBare().toString()]->sendMessage(message); + User *user = getUser(message->getTo().toBare().toString()); + if (!user) { + LOG4CXX_ERROR(logger, "Received message for unknown user " << message->getTo().toBare().toString()); + return; + } + + static_cast(user)->getSession()->sendMessage(message); +} + +SlackSession *SlackUserManager::moveTempSession(const std::string &user) { + if (m_tempSessions.find(user) != m_tempSessions.end()) { + SlackSession *session = m_tempSessions[user]; + m_tempSessions.erase(user); + return session; + } + return NULL; } diff --git a/spectrum/src/frontends/slack/SlackUserManager.h b/spectrum/src/frontends/slack/SlackUserManager.h index 711379cd..fc3821fb 100644 --- a/spectrum/src/frontends/slack/SlackUserManager.h +++ b/spectrum/src/frontends/slack/SlackUserManager.h @@ -39,7 +39,7 @@ class XMPPUserRegistration; class GatewayResponder; class AdHocManager; class SettingsAdHocCommandFactory; -class SlackInstallation; +class SlackSession; class SlackUserManager : public UserManager { public: @@ -59,11 +59,13 @@ class SlackUserManager : public UserManager { void sendMessage(boost::shared_ptr message); + SlackSession *moveTempSession(const std::string &user); + private: Component *m_component; UserRegistration *m_userRegistration; StorageBackend *m_storageBackend; - std::map m_installations; + std::map m_tempSessions; }; }