X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fcoresessioneventprocessor.cpp;h=c7a5b5b6623e7572fda7b9d5f48b5479fb4d53dc;hp=8acae81cb9f842ea75a138031d45393f140d22f1;hb=c37f66ea674fa946ca569d368094ea4adc48fb0f;hpb=cbbf4720fc10f0cb78eca71fe6a3f859cbe7a3c7 diff --git a/src/core/coresessioneventprocessor.cpp b/src/core/coresessioneventprocessor.cpp index 8acae81c..c7a5b5b6 100644 --- a/src/core/coresessioneventprocessor.cpp +++ b/src/core/coresessioneventprocessor.cpp @@ -242,15 +242,9 @@ void CoreSessionEventProcessor::processIrcEventAccount(IrcEvent *e) IrcUser *ircuser = e->network()->updateNickFromMask(e->prefix()); if (ircuser) { - QString newAccount = e->params().at(0); - // WHOX uses '0' to indicate logged-out, account-notify uses '*' - if (newAccount != "*") { - // Account logged in, set account name - ircuser->setAccount(newAccount); - } else { - // Account logged out, set account name to logged-out - ircuser->setAccount("*"); - } + // WHOX uses '0' to indicate logged-out, account-notify and extended-join uses '*'. + // As '*' is used internally to represent logged-out, no need to handle that differently. + ircuser->setAccount(e->params().at(0)); } else { qDebug() << "Received account-notify data for unknown user" << e->prefix(); } @@ -300,7 +294,7 @@ void CoreSessionEventProcessor::processIrcEventInvite(IrcEvent *e) } } - +/* JOIN: ": JOIN " */ void CoreSessionEventProcessor::processIrcEventJoin(IrcEvent *e) { if (e->testFlag(EventManager::Fake)) // generated by handleEarlyNetsplitJoin @@ -314,13 +308,22 @@ void CoreSessionEventProcessor::processIrcEventJoin(IrcEvent *e) IrcUser *ircuser = net->updateNickFromMask(e->prefix()); if (net->capEnabled(IrcCap::EXTENDED_JOIN)) { - if (!checkParamCount(e, 3)) - return; - // If logged in, :nick!user@host JOIN #channelname accountname :Real Name - // If logged out, :nick!user@host JOIN #channelname * :Real Name - // See: http://ircv3.net/specs/extensions/extended-join-3.1.html - // FIXME Keep track of authed user account, requires adding support to ircuser.h/cpp - ircuser->setRealName(e->params()[2]); + if (e->params().count() < 3) { + // Some IRC servers don't send extended-join events in all situations. Rather than + // ignore the join entirely, treat it as a regular join with a debug-level log entry. + // See: https://github.com/inspircd/inspircd/issues/821 + qDebug() << "extended-join requires 3 params, got:" << e->params() << ", handling as a " + "regular join"; + } else { + // If logged in, :nick!user@host JOIN #channelname accountname :Real Name + // If logged out, :nick!user@host JOIN #channelname * :Real Name + // See: http://ircv3.net/specs/extensions/extended-join-3.1.html + // WHOX uses '0' to indicate logged-out, account-notify and extended-join uses '*'. + // As '*' is used internally to represent logged-out, no need to handle that differently. + ircuser->setAccount(e->params()[1]); + // Update the user's real name, too + ircuser->setRealName(e->params()[2]); + } } // Else :nick!user@host JOIN #channelname @@ -515,7 +518,8 @@ void CoreSessionEventProcessor::processIrcEventPing(IrcEvent *e) { QString param = e->params().count() ? e->params().first() : QString(); // FIXME use events - coreNetwork(e)->putRawLine("PONG " + coreNetwork(e)->serverEncode(param)); + // Take priority so this won't get stuck behind other queued messages. + coreNetwork(e)->putRawLine("PONG " + coreNetwork(e)->serverEncode(param), true); } @@ -874,7 +878,7 @@ void CoreSessionEventProcessor::processIrcEvent324(IrcEvent *e) } -/* RPL_WHOISACCOUNT: " :is authed as */ +/* RPL_WHOISACCOUNT - " :is authed as" */ void CoreSessionEventProcessor::processIrcEvent330(IrcEvent *e) { if (!checkParamCount(e, 3)) @@ -1022,7 +1026,7 @@ void CoreSessionEventProcessor::processIrcEvent354(IrcEvent *e) // Don't use .section(" ", 1) with WHOX replies, for there's no hopcount to trim out // As part of IRCv3 account-notify, check account name - // WHOX uses '0' to indicate logged-out, account-notify uses '*' + // WHOX uses '0' to indicate logged-out, account-notify and extended-join uses '*'. QString newAccount = e->params()[7]; if (newAccount != "0") { // Account logged in, set account name