diff options
author | Kevin Smith <git@kismith.co.uk> | 2010-10-03 16:27:38 (GMT) |
---|---|---|
committer | Kevin Smith <git@kismith.co.uk> | 2010-10-03 16:27:38 (GMT) |
commit | d9a1a47e107bba107499db0fc970ac774fac79e9 (patch) | |
tree | 5d000fb457b75035c1768486a1c0592047ac7d74 /Swiften/MUC/MUC.cpp | |
parent | a719c9898cba1e5a618996ae506256a0c2556cc4 (diff) | |
download | swift-contrib-d9a1a47e107bba107499db0fc970ac774fac79e9.zip swift-contrib-d9a1a47e107bba107499db0fc970ac774fac79e9.tar.bz2 |
Don't get confused when people change roles in a MUC.
Resolves: #529
Release-Notes: Being in a MUC with someone who has their role changed will no longer cause them to appear several times in the occupant list.
Diffstat (limited to 'Swiften/MUC/MUC.cpp')
-rw-r--r-- | Swiften/MUC/MUC.cpp | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/Swiften/MUC/MUC.cpp b/Swiften/MUC/MUC.cpp index bcc9e6f..3446849 100644 --- a/Swiften/MUC/MUC.cpp +++ b/Swiften/MUC/MUC.cpp @@ -6,8 +6,6 @@ #include "Swiften/MUC/MUC.h" -#include <iostream> - #include <boost/bind.hpp> #include <boost/shared_ptr.hpp> @@ -110,10 +108,12 @@ void MUC::handleIncomingPresence(boost::shared_ptr<Presence> presence) { } else if (presence->getType() == Presence::Available) { std::map<String, MUCOccupant>::iterator it = occupants.find(nick); MUCOccupant occupant(nick, role, affiliation); + bool isJoin = true; if (realJID) { occupant.setRealJID(realJID.get()); } if (it != occupants.end()) { + isJoin = false; MUCOccupant oldOccupant = it->second; if (oldOccupant.getRole() != role) { onOccupantRoleChanged(nick, occupant, oldOccupant.getRole()); @@ -121,9 +121,10 @@ void MUC::handleIncomingPresence(boost::shared_ptr<Presence> presence) { if (oldOccupant.getAffiliation() != affiliation) { onOccupantAffiliationChanged(nick, affiliation, oldOccupant.getAffiliation()); } + occupants.erase(it); } std::pair<std::map<String, MUCOccupant>::iterator, bool> result = occupants.insert(std::make_pair(nick, occupant)); - if (result.second) { + if (isJoin) { onOccupantJoined(result.first->second); } onOccupantPresenceChange(presence); |