common: Add inverted scope match rules to ignores
[quassel.git] / src / common / ignorelistmanager.h
index d875cc4..ef86d5e 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-09 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  *
  *   You should have received a copy of the GNU General Public License     *
  *   along with this program; if not, write to the                         *
  *   Free Software Foundation, Inc.,                                       *
- *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
  ***************************************************************************/
 
 #ifndef IGNORELISTMANAGER_H
 #define IGNORELISTMANAGER_H
 
 #include <QString>
+#include <QRegExp>
 
 #include "message.h"
 #include "syncableobject.h"
@@ -60,10 +61,16 @@ public:
         ScopeType scope;
         QString scopeRule;
         bool isActive;
+        QRegExp regEx;
         IgnoreListItem() {}
         IgnoreListItem(IgnoreType type_, const QString &ignoreRule_, bool isRegEx_, StrictnessType strictness_,
             ScopeType scope_, const QString &scopeRule_, bool isActive_)
-            : type(type_), ignoreRule(ignoreRule_), isRegEx(isRegEx_), strictness(strictness_), scope(scope_), scopeRule(scopeRule_), isActive(isActive_)  {}
+            : type(type_), ignoreRule(ignoreRule_), isRegEx(isRegEx_), strictness(strictness_), scope(scope_), scopeRule(scopeRule_), isActive(isActive_), regEx(ignoreRule_) {
+            regEx.setCaseSensitivity(Qt::CaseInsensitive);
+            if (!isRegEx_) {
+                regEx.setPatternSyntax(QRegExp::Wildcard);
+            }
+        }
         bool operator!=(const IgnoreListItem &other)
         {
             return (type != other.type ||
@@ -140,7 +147,19 @@ public slots:
 
 protected:
     void setIgnoreList(const QList<IgnoreListItem> &ignoreList) { _ignoreList = ignoreList; }
-    bool scopeMatch(const QString &scopeRule, const QString &string) const; // scopeRule is a ';'-separated list, string is a network/channel-name
+
+    //! Check if a scope rule matches a string
+    /** Checks that the string does NOT match ANY inverted rules (prefixed by '!'), then checks that
+     * it matches AT LEAST one normal (non-inverted) rule.
+     *
+     * If only inverted rules are specified, it'll match so long as the string does not match any
+     * inverted rules (implicit wildcard).
+     *
+     * \param scopeRule  A ';'-separated list of wildcard expressions, prefix of '!' inverts subrule
+     * \param string     String to test, e.g. network/channel name
+     * \return True if matches, otherwise false
+     */
+    bool scopeMatch(const QString &scopeRule, const QString &string) const;
 
     StrictnessType _match(const QString &msgContents, const QString &msgSender, Message::Type msgType, const QString &network, const QString &bufferName);