Provide a contextmenu for the ignore list
[quassel.git] / src / client / clientignorelistmanager.cpp
index f4b1f91..f146313 100644 (file)
 
 #include "clientignorelistmanager.h"
 
+#include <QRegExp>
+
 INIT_SYNCABLE_OBJECT(ClientIgnoreListManager)
 
 ClientIgnoreListManager::ClientIgnoreListManager(QObject *parent)
     : IgnoreListManager(parent)
 {
-  connect(this, SIGNAL(updated(const QVariantMap&)), this, SLOT(ignoreListUpdated(const QVariantMap&)));
+  connect(this, SIGNAL(updatedRemotely()), SIGNAL(ignoreListChanged()));
 }
 
-void ClientIgnoreListManager::ignoreListUpdated(const QVariantMap &newMap) {
-  if(newMap != initIgnoreList())
-    emit ignoreListChanged();
+bool ClientIgnoreListManager::pureMatch(const IgnoreListItem &item, const QString &string) const {
+  QRegExp ruleRx = QRegExp(item.ignoreRule);
+  ruleRx.setCaseSensitivity(Qt::CaseInsensitive);
+  if(!item.isRegEx)
+    ruleRx.setPatternSyntax(QRegExp::Wildcard);
+
+  if((!item.isRegEx && ruleRx.exactMatch(string)) ||
+     (item.isRegEx && ruleRx.indexIn(string) != -1))
+    return true;
+  return false;
+}
+
+QMap<QString, bool> ClientIgnoreListManager::matchingRulesForHostmask(const QString &hostmask, const QString &network, const QString &channel) const {
+  QMap<QString, bool> result;
+  foreach(IgnoreListItem item, ignoreList()) {
+    if(item.type == SenderIgnore && pureMatch(item, hostmask)
+      && ((network.isEmpty() && channel.isEmpty()) || item.scope == GlobalScope || (item.scope == NetworkScope && scopeMatch(item.scopeRule, network))
+          || (item.scope == ChannelScope && scopeMatch(item.scopeRule, channel)))) {
+      result[item.ignoreRule] = item.isActive;
+//      qDebug() << "matchingRulesForHostmask found: " << item.ignoreRule << "is active: " << item.isActive;
+    }
+
+  }
+  return result;
 }