X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fcorenetwork.cpp;h=b9e82e44a4710e2147d55bc36c7ac710d000a930;hp=7a34d659d3455469dd89af00c5c686604e6bde6c;hb=841df8c7cc71ff1b8099d49296c8e997c92bdd60;hpb=f824db0e31b54969e0b7fa0b5405b1e9173d482c diff --git a/src/core/corenetwork.cpp b/src/core/corenetwork.cpp index 7a34d659..b9e82e44 100644 --- a/src/core/corenetwork.cpp +++ b/src/core/corenetwork.cpp @@ -137,6 +137,10 @@ void CoreNetwork::connectToIrc(bool reconnecting) { qWarning() << "Invalid identity configures, ignoring connect request!"; return; } + + // cleaning up old quit reason + _quitReason.clear(); + // use a random server? if(useRandomServer()) { _lastUsedServerIndex = qrand() % serverList().size(); @@ -181,6 +185,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(); @@ -192,7 +206,11 @@ void CoreNetwork::disconnectFromIrc(bool requested, const QString &reason) { socketDisconnected(); } else { // quit gracefully if it's user requested quit - userInputHandler()->issueQuit(reason); + if(reason.isEmpty() && identityPtr()) + _quitReason = identityPtr()->quitReason(); + else + _quitReason = reason; + userInputHandler()->issueQuit(_quitReason); // the irc server has 10 seconds to close the socket _socketCloseTimer.start(10000); } @@ -327,7 +345,7 @@ void CoreNetwork::socketDisconnected() { IrcUser *me_ = me(); if(me_) { foreach(QString channel, me_->channels()) - emit displayMsg(Message::Quit, BufferInfo::ChannelBuffer, channel, "", me_->hostmask()); + emit displayMsg(Message::Quit, BufferInfo::ChannelBuffer, channel, _quitReason, me_->hostmask()); } setConnected(false); @@ -376,6 +394,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(); @@ -404,19 +436,42 @@ void CoreNetwork::sendPerform() { } // rejoin channels we've been in - QStringList channels, keys; - foreach(QString chan, persistentChannels()) { - QString key = channelKey(chan); - if(!key.isEmpty()) { - channels.prepend(chan); - keys.prepend(key); - } else { - channels.append(chan); + if(rejoinChannels()) { + QStringList channels, keys; + foreach(QString chan, coreSession()->persistentChannels(networkId()).keys()) { + QString key = channelKey(chan); + if(!key.isEmpty()) { + channels.prepend(chan); + keys.prepend(key); + } else { + channels.append(chan); + } } + QString joinString = QString("%1 %2").arg(channels.join(",")).arg(keys.join(",")).trimmed(); + if(!joinString.isEmpty()) + userInputHandler()->handleJoin(statusBuf, joinString); } - QString joinString = QString("%1 %2").arg(channels.join(",")).arg(keys.join(",")).trimmed(); - if(!joinString.isEmpty()) - userInputHandler()->handleJoin(statusBuf, joinString); +} + +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) {