Set account on extended-join, simplify, fix docs
[quassel.git] / src / core / coresessioneventprocessor.cpp
index 8acae81..c7a5b5b 100644 (file)
@@ -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: ":<nick!user@host> JOIN <channel>" */
 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: "<nick> <account> :is authed as */
+/*  RPL_WHOISACCOUNT - "<nick> <account> :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