X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fcore%2Fcorenetwork.h;h=74540be6d033f8952317349d44a08e5ec00def03;hb=a2e096ed11221866f9707ad61265a9d359a21de3;hp=cc64d711a8891b1df23693742b79a48da74f7b55;hpb=adc18a7284e7124639fa4b354251d6b102dcf6b7;p=quassel.git diff --git a/src/core/corenetwork.h b/src/core/corenetwork.h index cc64d711..74540be6 100644 --- a/src/core/corenetwork.h +++ b/src/core/corenetwork.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2015 by the Quassel Project * + * Copyright (C) 2005-2016 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -25,6 +25,9 @@ #include "coreircchannel.h" #include "coreircuser.h" +// IRCv3 capabilities +#include "irccap.h" + #include #ifdef HAVE_SSL @@ -102,13 +105,6 @@ public: // IRCv3 capability negotiation - /** - * Checks if a given capability is enabled. - * - * @returns True if enabled, otherwise false - */ - inline bool capEnabled(const QString &capability) const { return _capsSupported.contains(capability); } - /** * Checks if capability negotiation is currently ongoing. * @@ -117,29 +113,34 @@ public: inline bool capNegotiationInProgress() const { return !_capsQueued.empty(); } /** - * Gets the value of an enabled or pending capability, e.g. sasl=plain. + * Queues a capability to be requested. + * + * Adds to the list of capabilities being requested. If non-empty, CAP REQ messages are sent + * to the IRC server. This may happen at login or if capabilities are announced via CAP NEW. * - * @returns Value of capability if one was specified, otherwise empty string + * @param[in] capability Name of the capability */ - QString capValue(const QString &capability) const; + void queueCap(const QString &capability); /** - * Gets the next capability to request, removing it from the queue. + * Begins capability negotiation if capabilities are queued, otherwise returns. * - * @returns Name of capability to request + * If any capabilities are queued, this will begin the cycle of taking each capability and + * requesting it. When no capabilities remain, capability negotiation is suitably ended. */ - QString takeQueuedCap(); - - // Specific capabilities for easy reference + void beginCapNegotiation(); /** - * Gets the status of the sasl authentication capability. + * List of capabilities requiring further core<->server messages to configure. * - * http://ircv3.net/specs/extensions/sasl-3.2.html + * For example, SASL requires the back-and-forth of AUTHENTICATE, so the next capability cannot + * be immediately sent. * - * @returns True if SASL authentication is enabled, otherwise false + * See: http://ircv3.net/specs/extensions/sasl-3.2.html */ - inline bool useCapSASL() const { return capEnabled("sasl"); } + const QStringList capsRequiringConfiguration = QStringList { + IrcCap::SASL + }; public slots: virtual void setMyNick(const QString &mynick); @@ -178,45 +179,54 @@ public slots: // IRCv3 capability negotiation (can be connected to signals) /** - * Marks a capability as accepted, providing an optional value. + * Indicates a capability is now available, with optional value in Network::capValue(). * - * Removes it from queue of pending capabilities and triggers any capability-specific - * activation. + * @see Network::addCap() * * @param[in] capability Name of the capability - * @param[in] value - * @parblock - * Optional value of the capability, e.g. sasl=plain. If left empty, will be copied from the - * pending capability. - * @endparblock */ - void addCap(const QString &capability, const QString &value = QString()); + void serverCapAdded(const QString &capability); /** - * Marks a capability as denied. + * Indicates a capability was acknowledged (enabled by the IRC server). * - * Removes it from the queue of pending capabilities and triggers any capability-specific - * deactivation. + * @see Network::acknowledgeCap() * * @param[in] capability Name of the capability */ - void removeCap(const QString &capability); + void serverCapAcknowledged(const QString &capability); /** - * Queues a capability as available but not yet accepted or denied. + * Indicates a capability was removed from the list of available capabilities. * - * Capabilities should be queued when registration pauses for CAP LS for capabilities are only - * requested during login. + * @see Network::removeCap() * * @param[in] capability Name of the capability - * @param[in] value Optional value of the capability, e.g. sasl=plain */ - void queuePendingCap(const QString &capability, const QString &value = QString()); + void serverCapRemoved(const QString &capability); + + /** + * Sends the next capability from the queue. + * + * During nick registration if any capabilities remain queued, this will take the next and + * request it. When no capabilities remain, capability negotiation is ended. + */ + void sendNextCap(); void setAutoWhoEnabled(bool enabled); void setAutoWhoInterval(int interval); void setAutoWhoDelay(int delay); + /** + * Appends the given channel/nick to the front of the AutoWho queue. + * + * When 'away-notify' is enabled, this will trigger an immediate AutoWho since regular + * who-cycles are disabled as per IRCv3 specifications. + * + * @param[in] channelOrNick Channel or nickname to WHO + */ + void queueAutoWhoOneshot(const QString &channelOrNick); + bool setAutoWhoDone(const QString &channel); void updateIssuedModes(const QString &requestedModes); @@ -319,11 +329,20 @@ private: QHash _autoWhoPending; QTimer _autoWhoTimer, _autoWhoCycleTimer; - // CAPs may have parameter values + // Maintain a list of CAPs that are being checked; if empty, negotiation finished // See http://ircv3.net/specs/core/capability-negotiation-3.2.html - QStringList _capsQueued; /// Capabilities to be checked - QHash _capsPending; /// Capabilities pending 'CAP ACK' from server - QHash _capsSupported; /// Enabled capabilities that received 'CAP ACK' + QStringList _capsQueued; /// Capabilities to be checked + bool _capNegotiationActive; /// Whether or not full capability negotiation was started + // Avoid displaying repeat "negotiation finished" messages + bool _capInitialNegotiationEnded; /// Whether or not initial capability negotiation finished + // Avoid sending repeat "CAP END" replies when registration is already ended + + /** + * Gets the next capability to request, removing it from the queue. + * + * @returns Name of capability to request + */ + QString takeQueuedCap(); QTimer _tokenBucketTimer; int _messageDelay; // token refill speed in ms