diff --git a/src/user.cpp b/src/user.cpp index 56f53f72095e541dda06b296b8da50d9ec108327..f791b992d69704d6fa5ec761aae3705b5aae1c5a 100644 --- a/src/user.cpp +++ b/src/user.cpp @@ -218,10 +218,17 @@ void User::handlePresence(Swift::Presence::ref presence) { if (isMUC) { if (presence->getType() == Swift::Presence::Unavailable) { std::string room = Buddy::JIDToLegacyName(presence->getTo()); + Conversation *conv = m_conversationManager->getConversation(room); + if (conv) { + conv->removeJID(presence->getFrom()); + if (!conv->getJIDs().empty()) { + return; + } + } + LOG4CXX_INFO(logger, m_jid.toString() << ": Going to left room " << room); onRoomLeft(room); - Conversation *conv = m_conversationManager->getConversation(room); if (conv) { m_conversationManager->removeConversation(conv); delete conv; @@ -235,8 +242,15 @@ void User::handlePresence(Swift::Presence::ref presence) { onReadyToConnect(); } std::string room = Buddy::JIDToLegacyName(presence->getTo()); - if (m_conversationManager->getConversation(room) != NULL) { - LOG4CXX_INFO(logger, m_jid.toString() << ": User has already tried to join room " << room << " as " << presence->getTo().getResource()); + Conversation *conv = m_conversationManager->getConversation(room); + if (conv != NULL) { + if (std::find(conv->getJIDs().begin(), conv->getJIDs().end(), presence->getFrom()) != conv->getJIDs().end()) { + LOG4CXX_INFO(logger, m_jid.toString() << ": User has already tried to join room " << room << " as " << presence->getTo().getResource()); + } + else { + conv->addJID(presence->getFrom()); + conv->sendParticipants(presence->getFrom()); + } return; } @@ -249,6 +263,10 @@ void User::handlePresence(Swift::Presence::ref presence) { } return; } + + if (presence->getType() == Swift::Presence::Unavailable) { + m_conversationManager->removeJID(presence->getFrom()); + } // User wants to disconnect this resource @@ -266,13 +284,14 @@ void User::handlePresence(Swift::Presence::ref presence) { } else { sendCurrentPresence(); - // This resource is new, so we have to send buddies presences - if (currentResourcesCount != m_resources) { - m_rosterManager->sendCurrentPresences(presence->getFrom()); - } } } + // This resource is new, so we have to send buddies presences + if (presence->getType() != Swift::Presence::Unavailable && currentResourcesCount != m_resources) { + m_rosterManager->sendCurrentPresences(presence->getFrom()); + } + m_resources = currentResourcesCount;