summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Smith <git@kismith.co.uk>2010-07-23 14:47:48 (GMT)
committerKevin Smith <git@kismith.co.uk>2010-07-23 15:01:33 (GMT)
commit4cc96003c6702168da2faa955e3c771272211e32 (patch)
treeb15355b09676583b2fb468f616f3dd284c52eac9 /Swift/Controllers/Chat/MUCController.cpp
parente00480d2f4326decd23ff7665fcb1af5e752c8ec (diff)
downloadswift-contrib-4cc96003c6702168da2faa955e3c771272211e32.zip
swift-contrib-4cc96003c6702168da2faa955e3c771272211e32.tar.bz2
Recognise when leaving a MUC (disconnect or kick).
Also cleans up some outstanding MUC issues. Resolves: #288 Resolves: #392 Resolves: #279 Resolves: #114
Diffstat (limited to 'Swift/Controllers/Chat/MUCController.cpp')
-rw-r--r--Swift/Controllers/Chat/MUCController.cpp48
1 files changed, 37 insertions, 11 deletions
diff --git a/Swift/Controllers/Chat/MUCController.cpp b/Swift/Controllers/Chat/MUCController.cpp
index 1e790b7..650a915 100644
--- a/Swift/Controllers/Chat/MUCController.cpp
+++ b/Swift/Controllers/Chat/MUCController.cpp
@@ -46,10 +46,9 @@ MUCController::MUCController (
bool useDelayForLatency,
TimerFactory* timerFactory,
EventController* eventController) :
- ChatControllerBase(self, stanzaChannel, iqRouter, chatWindowFactory, muc, presenceOracle, avatarManager, useDelayForLatency, uiEventStream, eventController),
- muc_(new MUC(stanzaChannel, presenceSender, muc)),
- nick_(nick) {
- parting_ = false;
+ ChatControllerBase(self, stanzaChannel, iqRouter, chatWindowFactory, muc, presenceOracle, avatarManager, useDelayForLatency, uiEventStream, eventController), muc_(new MUC(stanzaChannel, presenceSender, muc)), nick_(nick) {
+ parting_ = true;
+ joined_ = false;
events_ = uiEventStream;
roster_ = new Roster(true);
@@ -69,11 +68,9 @@ MUCController::MUCController (
loginCheckTimer_->onTick.connect(boost::bind(&MUCController::handleJoinTimeoutTick, this));
loginCheckTimer_->start();
}
-
- muc_->joinAs(nick);
chatWindow_->convertToMUC();
chatWindow_->addSystemMessage("Trying to join room " + toJID_.toString());
- joined_ = false;
+ rejoin();
if (avatarManager_ != NULL) {
avatarChangedConnection_ = (avatarManager_->onAvatarChanged.connect(boost::bind(&MUCController::handleAvatarChanged, this, _1, _2)));
}
@@ -90,6 +87,17 @@ MUCController::~MUCController() {
delete completer_;
}
+/**
+ * Join the MUC if not already in it.
+ */
+void MUCController::rejoin() {
+ if (parting_) {
+ joined_ = false;
+ parting_ = false;
+ muc_->joinAs(nick_);
+ }
+}
+
void MUCController::handleJoinTimeoutTick() {
receivedActivity();
chatWindow_->addSystemMessage("Room " + toJID_.toString() + " is not responding. This operation may never complete");
@@ -122,7 +130,7 @@ void MUCController::handleJoinFailed(boost::shared_ptr<ErrorPayload> error) {
chatWindow_->addErrorMessage(errorMessage);
if (!rejoinNick.isEmpty()) {
nick_ = rejoinNick;
- muc_->joinAs(rejoinNick);
+ rejoin();
}
}
@@ -132,6 +140,7 @@ void MUCController::handleJoinComplete(const String& nick) {
String joinMessage = "You have joined room " + toJID_.toString() + " as " + nick;
nick_ = nick;
chatWindow_->addSystemMessage(joinMessage);
+ setEnabled(true);
}
void MUCController::handleAvatarChanged(const JID& jid, const String&) {
@@ -194,7 +203,7 @@ bool MUCController::messageTargetsMe(boost::shared_ptr<Message> message) {
void MUCController::preHandleIncomingMessage(boost::shared_ptr<MessageEvent> messageEvent) {
boost::shared_ptr<Message> message = messageEvent->getStanza();
- if (messageTargetsMe(message)) {
+ if (joined_ && messageTargetsMe(message)) {
eventController_->handleIncomingEvent(messageEvent);
}
String nick = message->getFrom().getResource();
@@ -235,15 +244,32 @@ String MUCController::roleToGroupName(MUCOccupant::Role role) {
return result;
}
+void MUCController::setEnabled(bool enabled) {
+ ChatControllerBase::setEnabled(enabled);
+ if (!enabled) {
+ roster_->removeAll();
+ /* handleUserLeft won't throw a part back up unless this is called
+ when it doesn't yet know we've left - which only happens on
+ disconnect, so call with disconnect here so if the signal does
+ bubble back up, it'll be with the right type.*/
+ muc_->handleUserLeft(MUC::Disconnect);
+ }
+}
+
void MUCController::handleOccupantLeft(const MUCOccupant& occupant, MUC::LeavingType, const String& reason) {
completer_->removeWord(occupant.getNick());
- String partMessage = occupant.getNick() + " has left the room";
+ String partMessage = (occupant.getNick() != nick_) ? occupant.getNick() + " has left the room" : "You have left the room";
if (!reason.isEmpty()) {
partMessage += " (" + reason + ")";
}
partMessage += ".";
chatWindow_->addSystemMessage(partMessage);
- roster_->removeContact(JID(toJID_.getNode(), toJID_.getDomain(), occupant.getNick()));
+ if (occupant.getNick() != nick_) {
+ roster_->removeContact(JID(toJID_.getNode(), toJID_.getDomain(), occupant.getNick()));
+ } else {
+ parting_ = true;
+ setEnabled(false);
+ }
}
void MUCController::handleOccupantPresenceChange(boost::shared_ptr<Presence> presence) {