X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fircserverhandler.cpp;h=92eaf68d705db77b0440623605d8fac043658777;hp=8a093f623528a38b2eb57c41bf2b3d19c25b4864;hb=7f5b1f4ce671afc43762b93d09c2664180df5ef9;hpb=e1d4e2bf7c368d84d853f33e5f55a72945cc7f6a diff --git a/src/core/ircserverhandler.cpp b/src/core/ircserverhandler.cpp index 8a093f62..92eaf68d 100644 --- a/src/core/ircserverhandler.cpp +++ b/src/core/ircserverhandler.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-08 by the Quassel Project * + * Copyright (C) 2005-09 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -88,12 +88,17 @@ void IrcServerHandler::handleServerMsg(QByteArray msg) { uint num = cmd.toUInt(); if(num > 0) { if(params.count() == 0) { - qWarning() << "Message received from server violates RFC and is ignored!"; + qWarning() << "Message received from server violates RFC and is ignored!" << msg; return; } - params.removeFirst(); + _target = serverDecode(params.takeFirst()); + } else { + _target = QString(); } + // note that the IRC server is still alive + network()->resetPingTimeout(); + // Now we try to find a handler for this message. BTW, I do love the Trolltech guys ;-) handle(cmd, Q_ARG(QString, prefix), Q_ARG(QList, params)); } @@ -119,12 +124,12 @@ void IrcServerHandler::defaultHandler(QString cmd, const QString &prefix, const break; // Server error messages, display them in red. First param will be appended. case 401: { - QString target = params.takeFirst(); - displayMsg(Message::Error, target, params.join(" ") + " " + target, prefix, Message::Redirected); - break; + QString target = params.takeFirst(); + emit displayMsg(Message::Error, target, params.join(" ") + " " + target, prefix, Message::Redirected); + break; } case 402: case 403: case 404: case 406: case 408: case 415: case 421: case 442: { - QString channelName = params.takeFirst(); + QString channelName = params.takeFirst(); emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", params.join(" ") + " " + channelName, prefix); break; } @@ -132,7 +137,8 @@ void IrcServerHandler::defaultHandler(QString cmd, const QString &prefix, const case 413: case 414: case 423: case 441: case 444: case 461: // FIXME see below for the 47x codes case 467: case 471: case 473: case 474: case 475: case 476: case 477: case 478: case 482: case 436: // ERR_NICKCOLLISION - { QString p = params.takeFirst(); + { + QString p = params.takeFirst(); emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", p + ": " + params.join(" ")); break; } @@ -142,15 +148,15 @@ void IrcServerHandler::defaultHandler(QString cmd, const QString &prefix, const // Everything else will be marked in red, so we can add them somewhere. default: - if(_whois) { - // many nets define their own WHOIS fields. we fetch those not in need of special attention here: - emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", "[Whois] " + params.join(" "), prefix); - } else { - if(coreSession()->ircListHelper()->requestInProgress(network()->networkId())) - coreSession()->ircListHelper()->reportError(params.join(" ")); - else - emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", cmd + " " + params.join(" "), prefix); - } + if(_whois) { + // many nets define their own WHOIS fields. we fetch those not in need of special attention here: + emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", "[Whois] " + params.join(" "), prefix); + } else { + if(coreSession()->ircListHelper()->requestInProgress(network()->networkId())) + coreSession()->ircListHelper()->reportError(params.join(" ")); + else + emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", cmd + " " + params.join(" "), prefix); + } } //qDebug() << prefix <<":"< int paramOffset = 2; for(int c = 0; c < modes.length(); c++) { if(modes[c] == '+') { - add = true; - continue; + add = true; + continue; } if(modes[c] == '-') { - add = false; - continue; + add = false; + continue; } if(network()->prefixModes().contains(modes[c])) { - // user channel modes (op, voice, etc...) - if(paramOffset < params.count()) { - IrcUser *ircUser = network()->ircUser(params[paramOffset]); - if(add) - channel->addUserMode(ircUser, QString(modes[c])); - else - channel->removeUserMode(ircUser, QString(modes[c])); - } else { - qWarning() << "Received MODE with too few parameters:" << serverDecode(params); - } - paramOffset++; + // user channel modes (op, voice, etc...) + if(paramOffset < params.count()) { + IrcUser *ircUser = network()->ircUser(params[paramOffset]); + if(add) + channel->addUserMode(ircUser, QString(modes[c])); + else + channel->removeUserMode(ircUser, QString(modes[c])); + } else { + qWarning() << "Received MODE with too few parameters:" << serverDecode(params); + } + paramOffset++; } else { - // regular channel modes - QString value; - Network::ChannelModeType modeType = network()->channelModeType(modes[c]); - if(modeType == Network::A_CHANMODE || modeType == Network::B_CHANMODE || (modeType == Network::C_CHANMODE && add)) { - if(paramOffset < params.count()) { - value = params[paramOffset]; - } else { - qWarning() << "Received MODE with too few parameters:" << serverDecode(params); - } - paramOffset++; - } - - if(add) - channel->addChannelMode(modes[c], value); - else - channel->removeChannelMode(modes[c], value); + // regular channel modes + QString value; + Network::ChannelModeType modeType = network()->channelModeType(modes[c]); + if(modeType == Network::A_CHANMODE || modeType == Network::B_CHANMODE || (modeType == Network::C_CHANMODE && add)) { + if(paramOffset < params.count()) { + value = params[paramOffset]; + } else { + qWarning() << "Received MODE with too few parameters:" << serverDecode(params); + } + paramOffset++; + } + + if(add) + channel->addChannelMode(modes[c], value); + else + channel->removeChannelMode(modes[c], value); } } @@ -268,17 +274,17 @@ void IrcServerHandler::handleMode(const QString &prefix, const QList bool add = false; for(int c = 0; c < modeString.count(); c++) { if(modeString[c] == '+') { - add = true; - continue; + add = true; + continue; } if(modeString[c] == '-') { - add = false; - continue; + add = false; + continue; } if(add) - addModes += modeString[c]; + addModes += modeString[c]; else - removeModes += modeString[c]; + removeModes += modeString[c]; } if(!addModes.isEmpty()) ircUser->addUserModes(addModes); @@ -333,9 +339,9 @@ void IrcServerHandler::handleNotice(const QString &prefix, const QList(network()->ircChannel(channelname)); // we only have CoreIrcChannels in the core, so this cast is safe if(chan && !chan->receivedWelcomeMsg()) { - chan->setReceivedWelcomeMsg(); - emit displayMsg(Message::Notice, BufferInfo::ChannelBuffer, channelname, msg, prefix); - return; + chan->setReceivedWelcomeMsg(); + emit displayMsg(Message::Notice, BufferInfo::ChannelBuffer, channelname, msg, prefix); + return; } } } @@ -724,7 +730,7 @@ void IrcServerHandler::handle317(const QString &prefix, const QList int idleSecs = serverDecode(params[1]).toInt(); idleSecs *= -1; ircuser->setIdleTime(now.addSecs(idleSecs)); - if(params.size() > 3) { // if we have more then 3 params we have the obove mentioned "real life" situation + if(params.size() > 3) { // if we have more then 3 params we have the above mentioned "real life" situation int loginTime = serverDecode(params[2]).toInt(); ircuser->setLoginTime(QDateTime::fromTime_t(loginTime)); emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("[Whois] %1 is logged in since %2").arg(ircuser->nick()).arg(ircuser->loginTime().toString())); @@ -932,20 +938,19 @@ void IrcServerHandler::handle369(const QString &prefix, const QList void IrcServerHandler::handle432(const QString &prefix, const QList ¶ms) { Q_UNUSED(prefix); + QString errnick; if(params.size() < 2) { // handle unreal-ircd bug, where unreal ircd doesnt supply a TARGET in ERR_ERRONEUSNICKNAME during registration phase: // nick @@@ // :irc.scortum.moep.net 432 @@@ :Erroneous Nickname: Illegal characters // correct server reply: // :irc.scortum.moep.net 432 * @@@ :Erroneous Nickname: Illegal characters - emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", tr("There is a nickname in your identity's nicklist which contains illegal characters")); - emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", tr("Due to a bug in Unreal IRCd (and maybe other irc-servers too) we're unable to determine the erroneous nick")); - emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", tr("Please use: /nick to continue or clean up your nicklist")); + errnick = target(); } else { - QString errnick = params[0]; - emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", tr("Nick %1 contains illegal characters").arg(errnick)); - tryNextNick(errnick); + errnick = params[0]; } + emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", tr("Nick %1 contains illegal characters").arg(errnick)); + tryNextNick(errnick, true /* erroneus */); } /* ERR_NICKNAMEINUSE */ @@ -972,14 +977,21 @@ void IrcServerHandler::handle433(const QString &prefix, const QList /* */ -void IrcServerHandler::tryNextNick(const QString &errnick) { +void IrcServerHandler::tryNextNick(const QString &errnick, bool erroneus) { QStringList desiredNicks = coreSession()->identity(network()->identity())->nicks(); - int nextNick = desiredNicks.indexOf(errnick) + 1; - if(desiredNicks.size() > nextNick) { - putCmd("NICK", serverEncode(desiredNicks[nextNick])); + int nextNickIdx = desiredNicks.indexOf(errnick) + 1; + QString nextNick; + if(nextNickIdx > 0 && desiredNicks.size() > nextNickIdx) { + nextNick = desiredNicks[nextNickIdx]; } else { - emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", tr("No free and valid nicks in nicklist found. use: /nick to continue")); + if(erroneus) { + emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", tr("No free and valid nicks in nicklist found. use: /nick to continue")); + return; + } else { + nextNick = errnick + "_"; + } } + putCmd("NICK", serverEncode(nextNick)); } bool IrcServerHandler::checkParamCount(const QString &methodName, const QList ¶ms, int minParams) {