/***************************************************************************
- * 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 *
#include <QDebug>
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. */
// 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);
}
}
QList<IrcUser *> 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);
}
}
}
+void IrcServerHandler::destroyNetsplits() {
+ qDeleteAll(_netsplits);
+ _netsplits.clear();
+}
/***********************************************************************************/