diff options
Diffstat (limited to 'Swift/Controllers/ChatController.cpp')
| -rw-r--r-- | Swift/Controllers/ChatController.cpp | 32 | 
1 files changed, 32 insertions, 0 deletions
| diff --git a/Swift/Controllers/ChatController.cpp b/Swift/Controllers/ChatController.cpp index a8b8ab1..32fc0c2 100644 --- a/Swift/Controllers/ChatController.cpp +++ b/Swift/Controllers/ChatController.cpp @@ -1,5 +1,7 @@  #include "Swift/Controllers/ChatController.h" +#include <boost/bind.hpp> +  #include "Swiften/Avatars/AvatarManager.h"  #include "Swift/Controllers/ChatWindow.h"  #include "Swift/Controllers/ChatWindowFactory.h" @@ -13,6 +15,7 @@ namespace Swift {  ChatController::ChatController(const JID& self, StanzaChannel* stanzaChannel, IQRouter* iqRouter, ChatWindowFactory* chatWindowFactory, const JID &contact, NickResolver* nickResolver, PresenceOracle* presenceOracle, AvatarManager* avatarManager)   : ChatControllerBase(self, stanzaChannel, iqRouter, chatWindowFactory, contact, presenceOracle, avatarManager) {  	nickResolver_ = nickResolver; +	presenceOracle_->onPresenceChange.connect(boost::bind(&ChatController::handlePresenceChange, this, _1, _2));  }  bool ChatController::isIncomingMessageFromMe(boost::shared_ptr<Message>) { @@ -36,4 +39,33 @@ String ChatController::senderDisplayNameFromMessage(const JID& from) {  	return nickResolver_->jidToNick(from);  } +String ChatController::getStatusChangeString(boost::shared_ptr<Presence> presence) { +	String nick = senderDisplayNameFromMessage(presence->getFrom()); +	if (presence->getType() == Presence::Unavailable) { +		return nick + " has gone offline."; +	} else if (presence->getType() == Presence::Available) { +		StatusShow::Type show = presence->getShow(); +		if (show == StatusShow::Online || show == StatusShow::FFC) { +			return nick + " has become available."; +		} else if (show == StatusShow::Away || show == StatusShow::XA) { +			return nick + " has gone away."; +		} else if (show == StatusShow::DND) { +			return nick + " is now busy."; +		}  +	} + +	return ""; +} + +void ChatController::handlePresenceChange(boost::shared_ptr<Presence> newPresence, boost::shared_ptr<Presence> previousPresence) { +	if (!(toJID_.isBare() && newPresence->getFrom().equals(toJID_, JID::WithoutResource)) && newPresence->getFrom() != toJID_) { +		return; +	} +	String newStatusChangeString = getStatusChangeString(newPresence); +	if (!previousPresence || newStatusChangeString != getStatusChangeString(previousPresence)) { +		chatWindow_->addSystemMessage(newStatusChangeString); +	} +} + +  } | 
 Swift
 Swift