fixes #526 - session restore takes now care of last away state and user modes
[quassel.git] / src / core / corenetwork.cpp
index ba152a4..7d62b76 100644 (file)
@@ -181,6 +181,16 @@ void CoreNetwork::disconnectFromIrc(bool requested, const QString &reason) {
   _quitRequested = requested; // see socketDisconnected();
   _autoReconnectTimer.stop();
   _autoReconnectCount = 0; // prohibiting auto reconnect
+
+  IrcUser *me_ = me();
+  if(me_) {
+    QString awayMsg;
+    if(me_->isAway())
+      awayMsg = me_->awayMessage();
+    Core::setAwayMessage(userId(), networkId(), awayMsg);
+    Core::setUserModes(userId(), networkId(), me_->userModes());
+  }
+
   displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("Disconnecting."));
   if(socket.state() == QAbstractSocket::UnconnectedState) {
     socketDisconnected();
@@ -376,6 +386,20 @@ void CoreNetwork::networkInitialized() {
     _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();
@@ -406,7 +430,7 @@ void CoreNetwork::sendPerform() {
   // rejoin channels we've been in
   if(rejoinChannels()) {
     QStringList channels, keys;
-    foreach(QString chan, persistentChannels()) {
+    foreach(QString chan, coreSession()->persistentChannels(networkId()).keys()) {
       QString key = channelKey(chan);
       if(!key.isEmpty()) {
         channels.prepend(chan);
@@ -421,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)