diff options
Diffstat (limited to 'Swift/Controllers/Chat/MUCController.cpp')
| -rw-r--r-- | Swift/Controllers/Chat/MUCController.cpp | 92 | 
1 files changed, 68 insertions, 24 deletions
diff --git a/Swift/Controllers/Chat/MUCController.cpp b/Swift/Controllers/Chat/MUCController.cpp index 2914116..aa0a1e7 100644 --- a/Swift/Controllers/Chat/MUCController.cpp +++ b/Swift/Controllers/Chat/MUCController.cpp @@ -4,7 +4,7 @@   * See Documentation/Licenses/GPLv3.txt for more information.   */ -#include "Swift/Controllers/Chat/MUCController.h" +#include <Swift/Controllers/Chat/MUCController.h>  #include <boost/bind.hpp>  #include <boost/regex.hpp> @@ -12,23 +12,25 @@  #include <Swift/Controllers/Intl.h>  #include <Swiften/Base/format.h> -#include "Swiften/Network/Timer.h" -#include "Swiften/Network/TimerFactory.h" -#include "Swiften/Base/foreach.h" -#include "SwifTools/TabComplete.h" -#include "Swiften/Base/foreach.h" -#include "Swift/Controllers/XMPPEvents/EventController.h" -#include "Swift/Controllers/UIInterfaces/ChatWindow.h" -#include "Swift/Controllers/UIInterfaces/ChatWindowFactory.h" -#include "Swift/Controllers/UIEvents/UIEventStream.h" -#include "Swift/Controllers/UIEvents/RequestChatUIEvent.h" -#include "Swiften/Avatars/AvatarManager.h" -#include "Swiften/Elements/Delay.h" -#include "Swiften/MUC/MUC.h" -#include "Swiften/Client/StanzaChannel.h" -#include "Swift/Controllers/Roster/Roster.h" -#include "Swift/Controllers/Roster/SetAvatar.h" -#include "Swift/Controllers/Roster/SetPresence.h" +#include <Swiften/Network/Timer.h> +#include <Swiften/Network/TimerFactory.h> +#include <Swiften/Base/foreach.h> +#include <SwifTools/TabComplete.h> +#include <Swiften/Base/foreach.h> +#include <Swift/Controllers/XMPPEvents/EventController.h> +#include <Swift/Controllers/UIInterfaces/ChatWindow.h> +#include <Swift/Controllers/UIInterfaces/ChatWindowFactory.h> +#include <Swift/Controllers/UIEvents/UIEventStream.h> +#include <Swift/Controllers/UIEvents/RequestChatUIEvent.h> +#include <Swift/Controllers/Roster/GroupRosterItem.h> +#include <Swiften/Avatars/AvatarManager.h> +#include <Swiften/Elements/Delay.h> +#include <Swiften/MUC/MUC.h> +#include <Swiften/Client/StanzaChannel.h> +#include <Swift/Controllers/Roster/Roster.h> +#include <Swift/Controllers/Roster/SetAvatar.h> +#include <Swift/Controllers/Roster/SetPresence.h> +#include <Swiften/Disco/EntityCapsProvider.h>  #define MUC_JOIN_WARNING_TIMEOUT_MILLISECONDS 60000 @@ -50,8 +52,9 @@ MUCController::MUCController (  		UIEventStream* uiEventStream,  		bool useDelayForLatency,  		TimerFactory* timerFactory, -		EventController* eventController) : -			ChatControllerBase(self, stanzaChannel, iqRouter, chatWindowFactory, muc->getJID(), presenceOracle, avatarManager, useDelayForLatency, uiEventStream, eventController, timerFactory), muc_(muc), nick_(nick), desiredNick_(nick) { +		EventController* eventController, +		EntityCapsProvider* entityCapsProvider) : +			ChatControllerBase(self, stanzaChannel, iqRouter, chatWindowFactory, muc->getJID(), presenceOracle, avatarManager, useDelayForLatency, uiEventStream, eventController, timerFactory, entityCapsProvider), muc_(muc), nick_(nick), desiredNick_(nick) {  	parting_ = true;  	joined_ = false;  	lastWasPresence_ = false; @@ -81,6 +84,7 @@ MUCController::MUCController (  	if (avatarManager_ != NULL) {  		avatarChangedConnection_ = (avatarManager_->onAvatarChanged.connect(boost::bind(&MUCController::handleAvatarChanged, this, _1)));  	}  +	handleBareJIDCapsChanged(muc->getJID());  }  MUCController::~MUCController() { @@ -93,6 +97,23 @@ MUCController::~MUCController() {  	delete completer_;  } +void MUCController::handleBareJIDCapsChanged(const JID& /*jid*/) { +	ChatWindow::Tristate support = ChatWindow::Yes; +	bool any = false; +	foreach (const std::string& nick, currentOccupants_) { +		DiscoInfo::ref disco = entityCapsProvider_->getCaps(toJID_.toBare().toString() + "/" + nick); +		if (disco && disco->hasFeature(DiscoInfo::MessageCorrectionFeature)) { +			any = true; +		} else { +			support = ChatWindow::Maybe; +		} +	} +	if (!any) { +		support = ChatWindow::No; +	} +	chatWindow_->setCorrectionEnabled(support); +} +  /**   * Join the MUC if not already in it.   */ @@ -109,6 +130,14 @@ void MUCController::rejoin() {  	}  } +bool MUCController::isJoined() { +	return joined_; +} + +const std::string& MUCController::getNick() { +	return nick_; +} +  void MUCController::handleJoinTimeoutTick() {  	receivedActivity();  	chatWindow_->addSystemMessage(str(format(QT_TRANSLATE_NOOP("", "Room %1% is not responding. This operation may never complete.")) % toJID_.toString())); @@ -158,7 +187,7 @@ void MUCController::handleJoinFailed(boost::shared_ptr<ErrorPayload> error) {  		default: break;  		}  	} -	errorMessage += "."; +	errorMessage = str(format(QT_TRANSLATE_NOOP("", "Couldn't join room: %1%.")) % errorMessage);  	chatWindow_->addErrorMessage(errorMessage);  	if (!rejoinNick.empty()) {  		nick_ = rejoinNick; @@ -176,6 +205,7 @@ void MUCController::handleJoinComplete(const std::string& nick) {  	clearPresenceQueue();  	shouldJoinOnReconnect_ = true;  	setEnabled(true); +	onUserJoined();  }  void MUCController::handleAvatarChanged(const JID& jid) { @@ -206,7 +236,9 @@ void MUCController::handleOccupantJoined(const MUCOccupant& occupant) {  	currentOccupants_.insert(occupant.getNick());  	NickJoinPart event(occupant.getNick(), Join);  	appendToJoinParts(joinParts_, event); -	roster_->addContact(jid, realJID, occupant.getNick(), roleToGroupName(occupant.getRole()), avatarManager_->getAvatarPath(jid).string()); +	std::string groupName(roleToGroupName(occupant.getRole())); +	roster_->addContact(jid, realJID, occupant.getNick(), groupName, avatarManager_->getAvatarPath(jid).string()); +	roster_->getGroup(groupName)->setManualSort(roleToSortName(occupant.getRole()));  	if (joined_) {  		std::string joinString;  		MUCOccupant::Role role = occupant.getRole(); @@ -248,6 +280,16 @@ std::string MUCController::roleToFriendlyName(MUCOccupant::Role role) {  	return "";  } +std::string MUCController::roleToSortName(MUCOccupant::Role role) { +	switch (role) { +	case MUCOccupant::Moderator: return "1"; +	case MUCOccupant::Participant: return "2"; +	case MUCOccupant::Visitor: return "3"; +	case MUCOccupant::NoRole: return "4"; +	} +	return "5"; +} +  JID MUCController::nickToJID(const std::string& nick) {  	return JID(toJID_.getNode(), toJID_.getDomain(), nick);  } @@ -309,7 +351,9 @@ void MUCController::handleOccupantRoleChanged(const std::string& nick, const MUC  	if (occupant.getRealJID()) {  		realJID = occupant.getRealJID().get();  	} -	roster_->addContact(jid, realJID, nick, roleToGroupName(occupant.getRole()), avatarManager_->getAvatarPath(jid).string()); +	std::string group(roleToGroupName(occupant.getRole())); +	roster_->addContact(jid, realJID, nick, group, avatarManager_->getAvatarPath(jid).string()); +	roster_->getGroup(group)->setManualSort(roleToSortName(occupant.getRole()));  	chatWindow_->addSystemMessage(str(format(QT_TRANSLATE_NOOP("", "%1% is now a %2%")) % nick % roleToFriendlyName(occupant.getRole())));  } @@ -411,7 +455,7 @@ void MUCController::updateJoinParts() {  void MUCController::appendToJoinParts(std::vector<NickJoinPart>& joinParts, const NickJoinPart& newEvent) {  	std::vector<NickJoinPart>::iterator it = joinParts.begin();  	bool matched = false; -	for (; it != joinParts.end(); it++) { +	for (; it != joinParts.end(); ++it) {  		if ((*it).nick == newEvent.nick) {  			matched = true;  			JoinPart type = (*it).type;  | 
 Swift