+ /**
+ * Checks if a given capability is advertised by the server.
+ *
+ * These results aren't valid if the network is disconnected or capability negotiation hasn't
+ * happened, and some servers might not correctly advertise capabilities. Don't treat this as
+ * a guarentee.
+ *
+ * @param[in] capability Name of capability
+ * @returns True if connected and advertised by the server, otherwise false
+ */
+ inline bool capAvailable(const QString &capability) const { return _caps.contains(capability.toLower()); }
+ // IRCv3 specs all use lowercase capability names
+
+ /**
+ * Checks if a given capability is acknowledged and active.
+ *
+ * @param[in] capability Name of capability
+ * @returns True if acknowledged (active), otherwise false
+ */
+ inline bool capEnabled(const QString &capability) const { return _capsEnabled.contains(capability.toLower()); }
+ // IRCv3 specs all use lowercase capability names
+
+ /**
+ * Gets the value of an available capability, e.g. for SASL, "EXTERNAL,PLAIN".
+ *
+ * @param[in] capability Name of capability
+ * @returns Value of capability if one was specified, otherwise empty string
+ */
+ QString capValue(const QString &capability) const { return _caps.value(capability.toLower()); }
+ // IRCv3 specs all use lowercase capability names
+ // QHash returns the default constructed value if not found, in this case, empty string
+ // See: https://doc.qt.io/qt-4.8/qhash.html#value
+
+ /**
+ * Check if the given authentication mechanism is likely to be supported.
+ *
+ * This depends on the server advertising SASL support and either declaring available mechanisms
+ * (SASL 3.2), or just indicating something is supported (SASL 3.1).
+ *
+ * @param[in] saslMechanism Desired SASL mechanism
+ * @return True if mechanism supported or unknown, otherwise false
+ */
+ bool saslMaybeSupports(const QString &saslMechanism) const;
+