X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fcore%2Fircserverhandler.cpp;h=97e00587c15207b270174cd93d2d3007f07bc853;hb=580662426b8b734566b37de61deccf5b89970c6e;hp=6dfb838372811baaf7bef7064868246d0ef4d833;hpb=57d23cf77236e4ba25eb2bddb0eb343fe7f5b5df;p=quassel.git diff --git a/src/core/ircserverhandler.cpp b/src/core/ircserverhandler.cpp index 6dfb8383..97e00587 100644 --- a/src/core/ircserverhandler.cpp +++ b/src/core/ircserverhandler.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-09 by the Quassel Project * + * Copyright (C) 2005-10 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -33,14 +33,14 @@ #include IrcServerHandler::IrcServerHandler(CoreNetwork *parent) - : BasicHandler(parent), + : CoreBasicHandler(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 // 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); } @@ -1073,17 +1077,20 @@ void IrcServerHandler::handleNetsplitJoin(const QString &channel, const QStringL } QList ircUsers; QStringList newModes = modes; + QStringList newUsers = users; foreach(QString user, users) { - IrcUser *iu = network()->updateNickFromMask(user); + IrcUser *iu = network()->ircUser(nickFromMask(user)); if(iu) ircUsers.append(iu); - else { - newModes.removeAt(users.indexOf(user)); + else { // the user already quit + int idx = users.indexOf(user); + newUsers.removeAt(idx); + newModes.removeAt(idx); } } - QString msg = users.join("#:#").append("#:#").append(quitMessage); + QString msg = newUsers.join("#:#").append("#:#").append(quitMessage); emit displayMsg(Message::NetsplitJoin, BufferInfo::ChannelBuffer, channel, msg); ircChannel->joinIrcUsers(ircUsers, newModes); } @@ -1160,6 +1167,10 @@ bool IrcServerHandler::checkParamCount(const QString &methodName, const QList