+ return;
+ }
+
+ // Either something went wrong with the capabilities, or they are no longer supported
+ // > For CAP NAK
+ // Server: CAP * NAK :multi-prefix sasl
+ // > For CAP DEL
+ // Server: :irc.example.com CAP modernclient DEL :multi-prefix sasl
+ // CAP NAK and CAP DEL replies are always single-line
+
+ QStringList removedCaps;
+ removedCaps = e->params().at(2).split(' ');
+
+ // Store the capabilities that were denied or removed
+ QString removedCap;
+ for (int i = 0; i < removedCaps.count(); ++i) {
+ removedCap = removedCaps[i].trimmed().toLower();
+ // Mark this cap as removed.
+ // For CAP DEL, removes it from use.
+ // For CAP NAK when received before negotiation enabled these capabilities, removeCap()
+ // should do nothing. This merely guards against non-spec servers sending an
+ // unsolicited CAP ACK then later removing that capability.
+ coreNet->removeCap(removedCap);
+ }
+
+ if (capCommand == "NAK") {
+ // Continue negotiation only if this is the result of denied caps, not removed caps
+ if (removedCaps.count() > 1) {
+ // We've received a CAP NAK reply to multiple capabilities at once. Unfortunately,
+ // we don't know which capability failed and which ones are valid to re-request, so
+ // individually retry each capability from the failed bundle.
+ // See CoreNetwork::retryCapsIndividually() for more details.
+ coreNet->retryCapsIndividually();
+ // Still need to call sendNextCap() to carry on.
+ }
+ // Carry on with negotiation
+ coreNet->sendNextCap();