Properly handle unlimited IRC reconnection retries
[quassel.git] / src / core / corenetwork.cpp
index dedd819..40b4740 100644 (file)
@@ -192,6 +192,7 @@ void CoreNetwork::disconnectFromIrc(bool requested, const QString &reason, bool
     _autoReconnectCount = 0; // prohibiting auto reconnect
   }
   disablePingTimeout();
+  _msgQueue.clear();
 
   IrcUser *me_ = me();
   if(me_) {
@@ -327,10 +328,10 @@ void CoreNetwork::socketInitialized() {
   }
 
   // TokenBucket to avoid sending too much at once
-  _messagesPerSecond = 1;
+  _messageDelay = 2200;    // this seems to be a safe value (2.2 seconds delay)
   _burstSize = 5;
-  _tokenBucket = 5; // init with a full bucket
-  _tokenBucketTimer.start(_messagesPerSecond * 1000);
+  _tokenBucket = _burstSize; // init with a full bucket
+  _tokenBucketTimer.start(_messageDelay);
 
   if(!server.password.isEmpty()) {
     putRawLine(serverEncode(QString("PASS %1").arg(server.password)));
@@ -341,6 +342,7 @@ void CoreNetwork::socketInitialized() {
 
 void CoreNetwork::socketDisconnected() {
   disablePingTimeout();
+  _msgQueue.clear();
 
   _autoWhoCycleTimer.stop();
   _autoWhoTimer.stop();
@@ -364,7 +366,7 @@ void CoreNetwork::socketDisconnected() {
     Core::setNetworkConnected(userId(), networkId(), false);
   } else if(_autoReconnectCount != 0) {
     setConnectionState(Network::Reconnecting);
-    if(_autoReconnectCount == autoReconnectRetries())
+    if(_autoReconnectCount == -1 || _autoReconnectCount == autoReconnectRetries())
       doAutoReconnect(); // first try is immediate
     else
       _autoReconnectTimer.start();
@@ -400,7 +402,7 @@ void CoreNetwork::networkInitialized() {
 
   if(useAutoReconnect()) {
     // reset counter
-    _autoReconnectCount = autoReconnectRetries();
+    _autoReconnectCount = unlimitedReconnectRetries() ? -1 : autoReconnectRetries();
   }
 
   // restore away state
@@ -511,8 +513,8 @@ void CoreNetwork::doAutoReconnect() {
     qWarning() << "CoreNetwork::doAutoReconnect(): Cannot reconnect while not being disconnected!";
     return;
   }
-  if(_autoReconnectCount > 0)
-    _autoReconnectCount--;
+  if(_autoReconnectCount > 0 || _autoReconnectCount == -1)
+    _autoReconnectCount--; // -2 means we delay the next reconnect
   connectToIrc(true);
 }