diff --git a/include/transport/User.h b/include/transport/User.h index c845fa03..3c245093 100644 --- a/include/transport/User.h +++ b/include/transport/User.h @@ -134,6 +134,10 @@ class User { return m_cacheMessages; } + void setReconnectLimit(int limit) { + m_reconnectLimit = limit; + } + boost::signal onReadyToConnect; boost::signal onPresenceChanged; boost::signal onRawPresenceReceived; @@ -165,6 +169,7 @@ class User { std::list m_joinedRooms; std::map m_settings; bool m_cacheMessages; + int m_reconnectLimit; }; } diff --git a/spectrum/src/frontends/slack/SlackFrontend.cpp b/spectrum/src/frontends/slack/SlackFrontend.cpp index d69f7fa4..826f312e 100644 --- a/spectrum/src/frontends/slack/SlackFrontend.cpp +++ b/spectrum/src/frontends/slack/SlackFrontend.cpp @@ -98,7 +98,9 @@ RosterManager *SlackFrontend::createRosterManager(User *user, Component *compone } User *SlackFrontend::createUser(const Swift::JID &jid, UserInfo &userInfo, Component *component, UserManager *userManager) { - return new SlackUser(jid, userInfo, component, userManager); + SlackUser *user = new SlackUser(jid, userInfo, component, userManager); + user->setReconnectLimit(-1); + return user; } UserManager *SlackFrontend::createUserManager(Component *component, UserRegistry *userRegistry, StorageBackend *storageBackend) { diff --git a/spectrum/src/frontends/slack/SlackFrontendPlugin.cpp b/spectrum/src/frontends/slack/SlackFrontendPlugin.cpp index 1dcbf15b..ba165ccb 100644 --- a/spectrum/src/frontends/slack/SlackFrontendPlugin.cpp +++ b/spectrum/src/frontends/slack/SlackFrontendPlugin.cpp @@ -34,7 +34,7 @@ SlackFrontendPlugin::~SlackFrontendPlugin() { } std::string SlackFrontendPlugin::name() const { - return "xmpp"; + return "slack"; } Frontend *SlackFrontendPlugin::createFrontend() { diff --git a/spectrum/src/frontends/slack/SlackSession.cpp b/spectrum/src/frontends/slack/SlackSession.cpp index ab3e8acc..bfcb4090 100644 --- a/spectrum/src/frontends/slack/SlackSession.cpp +++ b/spectrum/src/frontends/slack/SlackSession.cpp @@ -91,6 +91,16 @@ void SlackSession::sendOnlineBuddies() { m_onlineBuddiesTimer->start(); } +void SlackSession::sendMessageToAll(const std::string &msg) { + std::vector channels; + for (std::map::const_iterator it = m_jid2channel.begin(); it != m_jid2channel.end(); it++) { + if (std::find(channels.begin(), channels.end(), it->second) == channels.end()) { + channels.push_back(it->second); + m_rtm->getAPI()->sendMessage("Soectrum 2", it->second, msg); + } + } +} + void SlackSession::sendMessage(boost::shared_ptr message) { if (m_user) { std::map convs = m_user->getConversationManager()->getConversations(); diff --git a/spectrum/src/frontends/slack/SlackSession.h b/spectrum/src/frontends/slack/SlackSession.h index e8bfa77c..d8bfc8e2 100644 --- a/spectrum/src/frontends/slack/SlackSession.h +++ b/spectrum/src/frontends/slack/SlackSession.h @@ -51,6 +51,8 @@ class SlackSession { void sendMessage(boost::shared_ptr message); + void sendMessageToAll(const std::string &msg); + void setPurpose(const std::string &purpose, const std::string &channel = ""); void setUser(User *user) { diff --git a/spectrum/src/frontends/slack/SlackUser.cpp b/spectrum/src/frontends/slack/SlackUser.cpp index 13216ce3..ed45bf2e 100644 --- a/spectrum/src/frontends/slack/SlackUser.cpp +++ b/spectrum/src/frontends/slack/SlackUser.cpp @@ -55,7 +55,19 @@ SlackUser::~SlackUser(){ } void SlackUser::disconnectUser(const std::string &error, Swift::SpectrumErrorPayload::Error e) { + if (!m_session) { + return; + } + if (!error.empty()) { + m_session->sendMessageToAll(error); + } + else { + m_session->sendMessageToAll("Disconnected from 3rd-party network for unknown reason."); + } + m_session->sendMessageToAll("Try using ```.spectrum2 reconnect``` to reconnect."); + static_cast(m_userManager)->moveTempSession(m_jid.toString(), m_session); + m_session = NULL; } diff --git a/spectrum/src/frontends/slack/SlackUserManager.cpp b/spectrum/src/frontends/slack/SlackUserManager.cpp index 37963d47..92024c45 100644 --- a/spectrum/src/frontends/slack/SlackUserManager.cpp +++ b/spectrum/src/frontends/slack/SlackUserManager.cpp @@ -77,6 +77,10 @@ SlackSession *SlackUserManager::moveTempSession(const std::string &user) { return NULL; } +void SlackUserManager::moveTempSession(const std::string &user, SlackSession *session) { + m_tempSessions[user] = session; +} + UserRegistration *SlackUserManager::getUserRegistration() { return m_userRegistration; diff --git a/spectrum/src/frontends/slack/SlackUserManager.h b/spectrum/src/frontends/slack/SlackUserManager.h index fc3821fb..5705787f 100644 --- a/spectrum/src/frontends/slack/SlackUserManager.h +++ b/spectrum/src/frontends/slack/SlackUserManager.h @@ -60,6 +60,7 @@ class SlackUserManager : public UserManager { void sendMessage(boost::shared_ptr message); SlackSession *moveTempSession(const std::string &user); + void moveTempSession(const std::string &user, SlackSession *session); private: Component *m_component; diff --git a/src/User.cpp b/src/User.cpp index 8363440b..1bf6a6e6 100644 --- a/src/User.cpp +++ b/src/User.cpp @@ -397,7 +397,7 @@ void User::handleDisconnected(const std::string &error, Swift::SpectrumErrorPayl } if (e == Swift::SpectrumErrorPayload::CONNECTION_ERROR_OTHER_ERROR || e == Swift::SpectrumErrorPayload::CONNECTION_ERROR_NETWORK_ERROR) { - if (m_reconnectCounter < 3) { + if (m_reconnectLimit < 0 || m_reconnectCounter < m_reconnectLimit) { m_reconnectCounter++; LOG4CXX_INFO(logger, m_jid.toString() << ": Disconnecting from legacy network " << error << ", trying to reconnect automatically."); // Simulate destruction/resurrection :)