/***************************************************************************
- * Copyright (C) 2005-2016 by the Quassel Project *
+ * Copyright (C) 2005-2018 by the Quassel Project *
* devel@quassel-irc.org *
* *
* This program is free software; you can redistribute it and/or modify *
#include "ircuser.h"
#include "ircchannel.h"
+// IRCv3 capabilities
+#include "irccap.h"
+
// defined below!
struct NetworkInfo;
//Network::ConnectionState connectionState() const;
inline int connectionState() const { return _connectionState; }
+ /**@{*/
+ /**
+ * Translates a user’s prefix to the channelmode associated with it.
+ * @param prefix Prefix to be translated.
+ */
QString prefixToMode(const QString &prefix) const;
inline QString prefixToMode(const QCharRef &prefix) const { return prefixToMode(QString(prefix)); }
+ inline QString prefixesToModes(const QString &prefix) const {
+ QString modes;
+ for (QChar c : prefix) {
+ modes += prefixToMode(c);
+ }
+ return modes;
+ }
+ /**@}*/
+
+ /**@{*/
+ /**
+ * Translates a user’s prefix to the channelmode associated with it.
+ * @param prefix Prefix to be translated.
+ */
QString modeToPrefix(const QString &mode) const;
inline QString modeToPrefix(const QCharRef &mode) const { return modeToPrefix(QString(mode)); }
+ inline QString modesToPrefixes(const QString &mode) const {
+ QString prefixes;
+ for (QChar c : mode) {
+ prefixes += modeToPrefix(c);
+ }
+ return prefixes;
+ }
+ /**@}*/
+
+ /**
+ * Sorts the user channelmodes according to priority set by PREFIX
+ *
+ * Given a list of channel modes, sorts according to the order of PREFIX, putting the highest
+ * modes first. Any unknown modes are moved to the end in no given order.
+ *
+ * If prefix modes cannot be determined from the network, no changes will be made.
+ *
+ * @param modes User channelmodes
+ * @return Priority-sorted user channelmodes
+ */
+ QString sortPrefixModes(const QString &modes) const;
+
+ /**@{*/
+ /**
+ * Sorts the list of users' channelmodes according to priority set by PREFIX
+ *
+ * Maintains order of the modes list.
+ *
+ * @seealso Network::sortPrefixModes()
+ *
+ * @param modesList List of users' channel modes
+ * @return Priority-sorted list of users' channel modes
+ */
+ inline QStringList sortPrefixModes(const QStringList &modesList) const {
+ QStringList sortedModesList;
+ // Sort each individual mode string, appending back
+ // Must maintain the order received!
+ for (QString modes : modesList) {
+ sortedModesList << sortPrefixModes(modes);
+ }
+ return sortedModesList;
+ }
+ /**@}*/
ChannelModeType channelModeType(const QString &mode);
inline ChannelModeType channelModeType(const QCharRef &mode) { return channelModeType(QString(mode)); }
bool supports(const QString ¶m) const { return _supports.contains(param); }
QString support(const QString ¶m) const;
+ /**
+ * 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 guarantee.
+ *
+ * @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.
*
// 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;
+
IrcUser *newIrcUser(const QString &hostmask, const QVariantMap &initData = QVariantMap());
inline IrcUser *newIrcUser(const QByteArray &hostmask) { return newIrcUser(decodeServerString(hostmask)); }
IrcUser *ircUser(QString nickname) const;