diff options
| author | Kevin Smith <git@kismith.co.uk> | 2010-10-22 16:26:11 (GMT) | 
|---|---|---|
| committer | Kevin Smith <git@kismith.co.uk> | 2010-10-22 16:26:11 (GMT) | 
| commit | 7cac59f3ec12e3440341bb561ab3c8e6c3fe80e0 (patch) | |
| tree | 7198b2fb67e8376c6247d645e793d3e567ec5aed | |
| parent | 991f0774c006a2c9a0998090dae4729059cc72b6 (diff) | |
| download | swift-7cac59f3ec12e3440341bb561ab3c8e6c3fe80e0.zip swift-7cac59f3ec12e3440341bb561ab3c8e6c3fe80e0.tar.bz2 | |
Be smarter about combining JoinParts in MUCs.
Resolves: 620
Release-Notes: Joins and parts in MUCs will now be merged in a more natural way.
| -rw-r--r-- | Swift/Controllers/Chat/MUCController.cpp | 44 | ||||
| -rw-r--r-- | Swift/Controllers/Chat/MUCController.h | 4 | ||||
| -rw-r--r-- | Swift/Controllers/Chat/UnitTest/MUCControllerTest.cpp | 12 | 
3 files changed, 45 insertions, 15 deletions
| diff --git a/Swift/Controllers/Chat/MUCController.cpp b/Swift/Controllers/Chat/MUCController.cpp index 8b9f3fa..ff102e7 100644 --- a/Swift/Controllers/Chat/MUCController.cpp +++ b/Swift/Controllers/Chat/MUCController.cpp @@ -382,7 +382,7 @@ void MUCController::appendToJoinParts(std::vector<NickJoinPart>& joinParts, cons  	}  } -String MUCController::generateJoinPartString(std::vector<NickJoinPart> joinParts) { +String MUCController::concatenateListOfNames(const std::vector<NickJoinPart>& joinParts) {  	String result;  	for (size_t i = 0; i < joinParts.size(); i++) {  		if (i > 0) { @@ -394,15 +394,43 @@ String MUCController::generateJoinPartString(std::vector<NickJoinPart> joinParts  		}  		NickJoinPart event = joinParts[i];  		result += event.nick; -		switch (event.type) { -			case Join: result += " has joined";break; -			case Part: result += " has left";break; -			case JoinThenPart: result += " joined then left";break; -			case PartThenJoin: result += " left then rejoined";break; +	} +	return result; +} + +String MUCController::generateJoinPartString(const std::vector<NickJoinPart>& joinParts) { +	std::vector<NickJoinPart> sorted[4]; +	String eventStrings[4]; +	foreach (NickJoinPart event, joinParts) { +		sorted[event.type].push_back(event); +	} +	String result; +	std::vector<JoinPart> populatedEvents; +	for (size_t i = 0; i < 4; i++) { +		String eventString = concatenateListOfNames(sorted[i]); +		if (!eventString.isEmpty()) { +			String haveHas = sorted[i].size() > 1 ? " have" : " has"; +			switch (i) { +				case Join: eventString += haveHas + " joined";break; +				case Part: eventString += haveHas + " left";break; +				case JoinThenPart: eventString += " joined then left";break; +				case PartThenJoin: eventString += " left then rejoined";break; +			} +			populatedEvents.push_back(static_cast<JoinPart>(i)); +			eventStrings[i] = eventString; +		} +	} +	for (size_t i = 0; i < populatedEvents.size(); i++) { +		if (i > 0) { +			if (i < populatedEvents.size() - 1) { +				result += ", "; +			} else { +				result += " and "; +			}  		} -		result += " the room"; +		result += eventStrings[populatedEvents[i]];  	} -	result += "."; +	result += " the room.";  	return result;  } diff --git a/Swift/Controllers/Chat/MUCController.h b/Swift/Controllers/Chat/MUCController.h index 6924b48..2a6536c 100644 --- a/Swift/Controllers/Chat/MUCController.h +++ b/Swift/Controllers/Chat/MUCController.h @@ -47,7 +47,8 @@ namespace Swift {  			virtual void setOnline(bool online);  			void rejoin();  			static void appendToJoinParts(std::vector<NickJoinPart>& joinParts, const NickJoinPart& newEvent); -			static String generateJoinPartString(std::vector<NickJoinPart> joinParts); +			static String generateJoinPartString(const std::vector<NickJoinPart>& joinParts); +			static String concatenateListOfNames(const std::vector<NickJoinPart>& joinParts);  		protected:  			void preSendMessageRequest(boost::shared_ptr<Message> message); @@ -77,6 +78,7 @@ namespace Swift {  			bool shouldUpdateJoinParts();  			void dayTicked() {lastWasPresence_ = false;}  			void processUserPart(); +  		private:  			MUC* muc_;  			UIEventStream* events_; diff --git a/Swift/Controllers/Chat/UnitTest/MUCControllerTest.cpp b/Swift/Controllers/Chat/UnitTest/MUCControllerTest.cpp index aeae562..19e5c36 100644 --- a/Swift/Controllers/Chat/UnitTest/MUCControllerTest.cpp +++ b/Swift/Controllers/Chat/UnitTest/MUCControllerTest.cpp @@ -179,11 +179,11 @@ public:  		list.push_back(NickJoinPart("Kev", Join));  		CPPUNIT_ASSERT_EQUAL(String("Kev has joined the room."), MUCController::generateJoinPartString(list));  		list.push_back(NickJoinPart("Remko", Part)); -		CPPUNIT_ASSERT_EQUAL(String("Kev has joined the room and Remko has left the room."), MUCController::generateJoinPartString(list)); +		CPPUNIT_ASSERT_EQUAL(String("Kev has joined and Remko has left the room."), MUCController::generateJoinPartString(list));  		list.push_back(NickJoinPart("Bert", Join)); -		CPPUNIT_ASSERT_EQUAL(String("Kev has joined the room, Remko has left the room and Bert has joined the room."), MUCController::generateJoinPartString(list)); +		CPPUNIT_ASSERT_EQUAL(String("Kev and Bert have joined and Remko has left the room."), MUCController::generateJoinPartString(list));  		list.push_back(NickJoinPart("Ernie", Join)); -		CPPUNIT_ASSERT_EQUAL(String("Kev has joined the room, Remko has left the room, Bert has joined the room and Ernie has joined the room."), MUCController::generateJoinPartString(list)); +		CPPUNIT_ASSERT_EQUAL(String("Kev, Bert and Ernie have joined and Remko has left the room."), MUCController::generateJoinPartString(list));  	}  	void testJoinPartStringContructionMixed() { @@ -191,11 +191,11 @@ public:  		list.push_back(NickJoinPart("Kev", JoinThenPart));  		CPPUNIT_ASSERT_EQUAL(String("Kev joined then left the room."), MUCController::generateJoinPartString(list));  		list.push_back(NickJoinPart("Remko", Part)); -		CPPUNIT_ASSERT_EQUAL(String("Kev joined then left the room and Remko has left the room."), MUCController::generateJoinPartString(list)); +		CPPUNIT_ASSERT_EQUAL(String("Remko has left and Kev joined then left the room."), MUCController::generateJoinPartString(list));  		list.push_back(NickJoinPart("Bert", PartThenJoin)); -		CPPUNIT_ASSERT_EQUAL(String("Kev joined then left the room, Remko has left the room and Bert left then rejoined the room."), MUCController::generateJoinPartString(list)); +		CPPUNIT_ASSERT_EQUAL(String("Remko has left, Kev joined then left and Bert left then rejoined the room."), MUCController::generateJoinPartString(list));  		list.push_back(NickJoinPart("Ernie", JoinThenPart)); -		CPPUNIT_ASSERT_EQUAL(String("Kev joined then left the room, Remko has left the room, Bert left then rejoined the room and Ernie joined then left the room."), MUCController::generateJoinPartString(list)); +		CPPUNIT_ASSERT_EQUAL(String("Remko has left, Kev and Ernie joined then left and Bert left then rejoined the room."), MUCController::generateJoinPartString(list));  	}  private: | 
 Swift
 Swift