From 33f2fbd983519549fd3c76fac96713b53a76274f Mon Sep 17 00:00:00 2001 From: Marcus Eggenberger Date: Wed, 19 Nov 2008 16:59:06 +0100 Subject: [PATCH] Fixing BR #231 - show own quit in all channels --- src/core/networkconnection.cpp | 21 ++++++++++++++++----- src/core/networkconnection.h | 2 +- src/core/userinputhandler.cpp | 9 +++++---- src/core/userinputhandler.h | 2 ++ 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/core/networkconnection.cpp b/src/core/networkconnection.cpp index 5d279655..d177d4c1 100644 --- a/src/core/networkconnection.cpp +++ b/src/core/networkconnection.cpp @@ -253,19 +253,24 @@ void NetworkConnection::sendPerform() { if(!joinString.isEmpty()) userInputHandler()->handleJoin(statusBuf, joinString); } -void NetworkConnection::disconnectFromIrc(bool requested) { +void NetworkConnection::disconnectFromIrc(bool requested, const QString &reason) { _quitRequested = requested; // see socketDisconnected(); _autoReconnectTimer.stop(); _autoReconnectCount = 0; // prohibiting auto reconnect displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("Disconnecting.")); if(socket.state() == QAbstractSocket::UnconnectedState) { socketDisconnected(); - } else if(socket.state() < QAbstractSocket::ConnectedState) { + } else if(socket.state() < QAbstractSocket::ConnectedState || !requested) { + // we might be in a state waiting for a timeout... + // or (!requested) this is a core shutdown... + // in both cases we don't really care... set a disconnected state socket.close(); - // we might be in a state waiting for a timeout... we don't care... set a disconnected state socketDisconnected(); } else { - _socketCloseTimer.start(10000); // the irc server has 10 seconds to close the socket + // quit gracefully if it's user requested quit + userInputHandler()->issueQuit(reason); + // the irc server has 10 seconds to close the socket + _socketCloseTimer.start(10000); } } @@ -381,7 +386,13 @@ void NetworkConnection::socketDisconnected() { _autoWhoInProgress.clear(); _socketCloseTimer.stop(); - + + IrcUser *me = network()->me(); + if(me) { + foreach(QString channel, me->channels()) + emit displayMsg(Message::Quit, BufferInfo::ChannelBuffer, channel, "", me->hostmask()); + } + network()->setConnected(false); emit disconnected(networkId()); if(_quitRequested) { diff --git a/src/core/networkconnection.h b/src/core/networkconnection.h index 0d8d837a..d9474557 100644 --- a/src/core/networkconnection.h +++ b/src/core/networkconnection.h @@ -89,7 +89,7 @@ public: public slots: // void setServerOptions(); void connectToIrc(bool reconnecting = false); - void disconnectFromIrc(bool requested = true); + void disconnectFromIrc(bool requested = true, const QString &reason = QString()); void userInput(BufferInfo bufferInfo, QString msg); void putRawLine(QByteArray input); diff --git a/src/core/userinputhandler.cpp b/src/core/userinputhandler.cpp index 5315768b..44373b60 100644 --- a/src/core/userinputhandler.cpp +++ b/src/core/userinputhandler.cpp @@ -317,15 +317,16 @@ void UserInputHandler::handleQuery(const BufferInfo &bufferInfo, const QString & void UserInputHandler::handleQuit(const BufferInfo &bufferInfo, const QString &msg) { Q_UNUSED(bufferInfo) + networkConnection()->disconnectFromIrc(true, msg); +} +void UserInputHandler::issueQuit(const QString &reason) { QString quitReason; - if(msg.isEmpty()) + if(reason.isEmpty()) quitReason = networkConnection()->identity()->quitReason(); else - quitReason = msg; - + quitReason = reason; emit putCmd("QUIT", serverEncode(quitReason)); - networkConnection()->disconnectFromIrc(); } void UserInputHandler::handleQuote(const BufferInfo &bufferInfo, const QString &msg) { diff --git a/src/core/userinputhandler.h b/src/core/userinputhandler.h index fdfed9ed..f8f936f0 100644 --- a/src/core/userinputhandler.h +++ b/src/core/userinputhandler.h @@ -66,6 +66,8 @@ public slots: void defaultHandler(QString cmd, const BufferInfo &bufferInfo, const QString &text); + void issueQuit(const QString &reason); + private: void expand(const QString &alias, const BufferInfo &bufferInfo, const QString &msg); void banOrUnban(const BufferInfo &bufferInfo, const QString &text, bool ban); -- 2.20.1