_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();
_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();
// 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);
}
}
+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)