From d9a1a47e107bba107499db0fc970ac774fac79e9 Mon Sep 17 00:00:00 2001
From: Kevin Smith <git@kismith.co.uk>
Date: Sun, 3 Oct 2010 17:27:38 +0100
Subject: 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.

diff --git a/Swift/QtUI/QtChatWindow.h b/Swift/QtUI/QtChatWindow.h
index 2b64f83..20c8685 100644
--- a/Swift/QtUI/QtChatWindow.h
+++ b/Swift/QtUI/QtChatWindow.h
@@ -57,7 +57,6 @@ namespace Swift {
 
 		signals:
 			void geometryChanged();
-			void requestFlash();
 
 		protected slots:
 			void qAppFocusChanged(QWidget* old, QWidget* now);
diff --git a/Swift/QtUI/QtTabbable.h b/Swift/QtUI/QtTabbable.h
index 1a1170f..e236a0b 100644
--- a/Swift/QtUI/QtTabbable.h
+++ b/Swift/QtUI/QtTabbable.h
@@ -30,5 +30,6 @@ namespace Swift {
 			void requestPreviousTab();
 			void requestNextTab();
 			void requestActiveTab();
+			void requestFlash();
 	};
 }
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);
diff --git a/Swiften/MUC/MUCOccupant.cpp b/Swiften/MUC/MUCOccupant.cpp
index 3e907ab..33a5fcc 100644
--- a/Swiften/MUC/MUCOccupant.cpp
+++ b/Swiften/MUC/MUCOccupant.cpp
@@ -14,6 +14,10 @@ MUCOccupant::MUCOccupant(const String &nick, Role role, Affiliation affiliation)
 MUCOccupant::~MUCOccupant() {
 }
 
+MUCOccupant::MUCOccupant(const MUCOccupant& other) : nick_(other.getNick()), role_(other.getRole()), affiliation_(other.getAffiliation()), realJID_(other.getRealJID()) {
+
+}
+
 String MUCOccupant::getNick() const {
 	return nick_;
 }
diff --git a/Swiften/MUC/MUCOccupant.h b/Swiften/MUC/MUCOccupant.h
index c9551de..96ac5ad 100644
--- a/Swiften/MUC/MUCOccupant.h
+++ b/Swiften/MUC/MUCOccupant.h
@@ -20,6 +20,7 @@ namespace Swift {
 			enum Affiliation {Owner, Admin, Member, Outcast, NoAffiliation};
 
 			MUCOccupant(const String &nick, Role role, Affiliation affiliation);
+			MUCOccupant(const MUCOccupant& other);
 			~MUCOccupant();
 
 			String getNick() const;
@@ -34,6 +35,7 @@ namespace Swift {
 			Role role_;
 			Affiliation affiliation_;
 			boost::optional<JID> realJID_;
+			/* If you add a field, remember to update the const copy constructor */
 	};
 }
 
-- 
cgit v0.10.2-6-g49f6