fixes #526 - session restore takes now care of last away state and user modes
authorMarcus Eggenberger <egs@quassel-irc.org>
Wed, 11 Feb 2009 13:28:30 +0000 (14:28 +0100)
committerMarcus Eggenberger <egs@quassel-irc.org>
Wed, 11 Feb 2009 13:28:30 +0000 (14:28 +0100)
src/core/corenetwork.cpp
src/core/corenetwork.h

index 314f3d2..7d62b76 100644 (file)
@@ -386,6 +386,20 @@ void CoreNetwork::networkInitialized() {
     _autoReconnectCount = autoReconnectRetries();
   }
 
     _autoReconnectCount = autoReconnectRetries();
   }
 
+  // restore away state
+  userInputHandler()->handleAway(BufferInfo(), Core::awayMessage(userId(), networkId()));
+
+  // restore old user modes if server default mode is set.
+  IrcUser *me_ = me();
+  if(me_) {
+    if(!me_->userModes().isEmpty()) {
+      restoreUserModes();
+    } else {
+      connect(me_, SIGNAL(userModesSet(QString)), this, SLOT(restoreUserModes()));
+      connect(me_, SIGNAL(userModesAdded(QString)), this, SLOT(restoreUserModes()));
+    }
+  }
+
   sendPerform();
 
   _pingTimer.start();
   sendPerform();
 
   _pingTimer.start();
@@ -431,6 +445,27 @@ void CoreNetwork::sendPerform() {
   }
 }
 
   }
 }
 
+void CoreNetwork::restoreUserModes() {
+  IrcUser *me_ = me();
+  Q_ASSERT(me_);
+
+  disconnect(me_, SIGNAL(userModesSet(QString)), this, SLOT(restoreUserModes()));
+  disconnect(me_, SIGNAL(userModesAdded(QString)), this, SLOT(restoreUserModes()));
+
+  QString removeModes;
+  QString addModes = Core::userModes(userId(), networkId());
+  QString currentModes = me_->userModes();
+
+  removeModes = currentModes;
+  removeModes.remove(QRegExp(QString("[%1]").arg(addModes)));
+  addModes.remove(QRegExp(QString("[%1]").arg(currentModes)));
+
+  removeModes = QString("%1 -%2").arg(me_->nick(), removeModes);
+  addModes = QString("%1 +%2").arg(me_->nick(), addModes);
+  userInputHandler()->handleMode(BufferInfo(), removeModes);
+  userInputHandler()->handleMode(BufferInfo(), addModes);
+}
+
 void CoreNetwork::setUseAutoReconnect(bool use) {
   Network::setUseAutoReconnect(use);
   if(!use)
 void CoreNetwork::setUseAutoReconnect(bool use) {
   Network::setUseAutoReconnect(use);
   if(!use)
index f088707..6c6f978 100644 (file)
@@ -129,6 +129,7 @@ private slots:
   void networkInitialized();
 
   void sendPerform();
   void networkInitialized();
 
   void sendPerform();
+  void restoreUserModes();
   void doAutoReconnect();
   void sendPing();
   void sendAutoWho();
   void doAutoReconnect();
   void sendPing();
   void sendAutoWho();