diff --git a/src/user.cpp b/src/user.cpp index a142fefcf4c8685845ae8e8a57178dbc57f228ac..43234bcff64f7c0d17ab4fd2cad31419b11a21df 100644 --- a/src/user.cpp +++ b/src/user.cpp @@ -26,7 +26,6 @@ #include "transport/conversationmanager.h" #include "transport/presenceoracle.h" #include "transport/logging.h" -#include "Swiften/Swiften.h" #include "Swiften/Server/ServerStanzaChannel.h" #include "Swiften/Elements/StreamError.h" #include "Swiften/Elements/MUCPayload.h" @@ -195,11 +194,6 @@ void User::setCacheMessages(bool cacheMessages) { } void User::handlePresence(Swift::Presence::ref presence, bool forceJoin) { - - int currentResourcesCount = m_presenceOracle->getAllPresence(m_jid).size(); - - m_conversationManager->resetResources(); - LOG4CXX_INFO(logger, "PRESENCE " << presence->getFrom().toString() << " " << presence->getTo().toString()); if (!m_connected) { // we are not connected to legacy network, so we should do it when disco#info arrive :) @@ -231,8 +225,9 @@ void User::handlePresence(Swift::Presence::ref presence, bool forceJoin) { } } - bool isMUC = presence->getPayload() != NULL || *presence->getTo().getNode().c_str() == '#'; - if (isMUC) { + + if (!presence->getTo().getNode().empty()) { + bool isMUC = presence->getPayload() != NULL || *presence->getTo().getNode().c_str() == '#'; if (presence->getType() == Swift::Presence::Unavailable) { std::string room = Buddy::JIDToLegacyName(presence->getTo()); Conversation *conv = m_conversationManager->getConversation(room); @@ -242,6 +237,9 @@ void User::handlePresence(Swift::Presence::ref presence, bool forceJoin) { return; } } + else { + return; + } if (getUserSetting("stay_connected") != "1") { LOG4CXX_INFO(logger, m_jid.toString() << ": Going to left room " << room); @@ -260,7 +258,7 @@ void User::handlePresence(Swift::Presence::ref presence, bool forceJoin) { } } } - else { + else if (isMUC) { // force connection to legacy network to let backend to handle auto-join on connect. if (!m_readyForConnect) { LOG4CXX_INFO(logger, m_jid.toString() << ": Ready to be connected to legacy network"); @@ -317,9 +315,29 @@ void User::handlePresence(Swift::Presence::ref presence, bool forceJoin) { } return; } - + + int currentResourcesCount = m_presenceOracle->getAllPresence(m_jid).size(); + + m_conversationManager->resetResources(); + + if (presence->getType() == Swift::Presence::Unavailable) { m_conversationManager->removeJID(presence->getFrom()); + + std::string presences; + std::vector ps = m_presenceOracle->getAllPresence(m_jid); + BOOST_FOREACH(Swift::Presence::ref p, ps) { + if (p != presence) { + presences += p->getFrom().toString() + " "; + } + }; + + if (!presences.empty()) { + LOG4CXX_INFO(logger, m_jid.toString() << ": User is still connected from following clients: " << presences); + } + else { + LOG4CXX_INFO(logger, m_jid.toString() << ": Last client disconnected"); + } }