debug--
[quassel.git] / src / core / ircserverhandler.cpp
index 6dfb838..33445c2 100644 (file)
@@ -36,11 +36,11 @@ IrcServerHandler::IrcServerHandler(CoreNetwork *parent)
   : BasicHandler(parent),
     _whois(false)
 {
+  connect(parent, SIGNAL(disconnected(NetworkId)), this, SLOT(destroyNetsplits()));
 }
 
 IrcServerHandler::~IrcServerHandler() {
-  if(!_netsplits.empty())
-    qDeleteAll(_netsplits);
+  destroyNetsplits();
 }
 
 /*! Handle a raw message string sent by the server. We try to find a suitable handler, otherwise we call a default handler. */
@@ -265,22 +265,26 @@ void IrcServerHandler::handleMode(const QString &prefix, const QList<QByteArray>
         // user channel modes (op, voice, etc...)
         if(paramOffset < params.count()) {
           IrcUser *ircUser = network()->ircUser(params[paramOffset]);
-          if(add) {
-            bool handledByNetsplit = false;
-            if(!_netsplits.empty()) {
-              foreach(Netsplit* n, _netsplits) {
-                handledByNetsplit = n->userAlreadyJoined(ircUser->hostmask(), channel->name());
-                if(handledByNetsplit) {
-                  n->addMode(ircUser->hostmask(), channel->name(), QString(modes[c]));
-                  break;
+          if(!ircUser) {
+            qWarning() << Q_FUNC_INFO << "Unknown IrcUser:" << params[paramOffset];
+          } else {
+            if(add) {
+              bool handledByNetsplit = false;
+              if(!_netsplits.empty()) {
+                foreach(Netsplit* n, _netsplits) {
+                  handledByNetsplit = n->userAlreadyJoined(ircUser->hostmask(), channel->name());
+                  if(handledByNetsplit) {
+                    n->addMode(ircUser->hostmask(), channel->name(), QString(modes[c]));
+                    break;
+                  }
                 }
               }
+              if(!handledByNetsplit)
+                channel->addUserMode(ircUser, QString(modes[c]));
             }
-            if(!handledByNetsplit)
-              channel->addUserMode(ircUser, QString(modes[c]));
+            else
+              channel->removeUserMode(ircUser, QString(modes[c]));
           }
-          else
-            channel->removeUserMode(ircUser, QString(modes[c]));
         } else {
           qWarning() << "Received MODE with too few parameters:" << serverDecode(params);
         }
@@ -1160,6 +1164,10 @@ bool IrcServerHandler::checkParamCount(const QString &methodName, const QList<QB
   }
 }
 
+void IrcServerHandler::destroyNetsplits() {
+  qDeleteAll(_netsplits);
+  _netsplits.clear();
+}
 
 /***********************************************************************************/