From: Marcus Eggenberger Date: Sat, 14 Feb 2009 01:17:11 +0000 (+0100) Subject: fixes #391 - appending underscores if all nicknames of the identity are unavailable X-Git-Tag: 0.4.0~60 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=7687144347370b830d3b8957bd223acb629fee83;hp=35e22cad1de9084bc3ddf664bc43e5a620adf1ae fixes #391 - appending underscores if all nicknames of the identity are unavailable --- diff --git a/src/core/corenetwork.cpp b/src/core/corenetwork.cpp index c0233853..32888ecf 100644 --- a/src/core/corenetwork.cpp +++ b/src/core/corenetwork.cpp @@ -205,7 +205,7 @@ void CoreNetwork::disconnectFromIrc(bool requested, const QString &reason, bool else _quitReason = reason; - displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("Disconnecting. (%1)").arg((!requested && !withReconnect) ? tr("Core Shutdown") : reason)); + displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("Disconnecting. (%1)").arg((!requested && !withReconnect) ? tr("Core Shutdown") : _quitReason)); switch(socket.state()) { case QAbstractSocket::ConnectedState: userInputHandler()->issueQuit(_quitReason); diff --git a/src/core/ircserverhandler.cpp b/src/core/ircserverhandler.cpp index 34573d9b..5bd4dc43 100644 --- a/src/core/ircserverhandler.cpp +++ b/src/core/ircserverhandler.cpp @@ -88,10 +88,12 @@ 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 @@ -935,20 +937,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 */ @@ -975,14 +976,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) { diff --git a/src/core/ircserverhandler.h b/src/core/ircserverhandler.h index a0b088be..b06a6b65 100644 --- a/src/core/ircserverhandler.h +++ b/src/core/ircserverhandler.h @@ -81,9 +81,14 @@ public slots: void defaultHandler(QString cmd, const QString &prefix, const QList ¶ms); private: - void tryNextNick(const QString &errnick); + void tryNextNick(const QString &errnick, bool erroneus = false); bool checkParamCount(const QString &methodName, const QList ¶ms, int minParams); + + // holds the target for numeric replies or is invalid otherwise + inline const QString &target() const { return _target; } + bool _whois; + QString _target; };