X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcommon%2Fignorelistmanager.cpp;h=845af07ce07f46cb1e279c48b4e49866cd84a0b5;hp=bd37a20e3917397f956c401e3537c7f96a49a0a6;hb=8677a82a6664da67c67610d0b438ee17904b12fb;hpb=75068ed33d1ebfc2d2581d766a69e9bbc84a46f2 diff --git a/src/common/ignorelistmanager.cpp b/src/common/ignorelistmanager.cpp index bd37a20e..845af07c 100644 --- a/src/common/ignorelistmanager.cpp +++ b/src/common/ignorelistmanager.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-09 by the Quassel Project * + * Copyright (C) 2005-2014 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -15,191 +15,203 @@ * 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. * ***************************************************************************/ #include "ignorelistmanager.h" +#include #include #include -#include - -#include "message.h" INIT_SYNCABLE_OBJECT(IgnoreListManager) +IgnoreListManager &IgnoreListManager::operator=(const IgnoreListManager &other) +{ + if (this == &other) + return *this; -IgnoreListManager &IgnoreListManager::operator=(const IgnoreListManager &other) { - if(this == &other) + SyncableObject::operator=(other); + _ignoreList = other._ignoreList; return *this; - - SyncableObject::operator=(other); - _ignoreList = other._ignoreList; - return *this; } -int IgnoreListManager::indexOf(const QString &ignore) const { - for(int i = 0; i < _ignoreList.count(); i++) { - if(_ignoreList[i].ignoreRule == ignore) - return i; - } - return -1; + +int IgnoreListManager::indexOf(const QString &ignore) const +{ + for (int i = 0; i < _ignoreList.count(); i++) { + if (_ignoreList[i].ignoreRule == ignore) + return i; + } + return -1; } -QVariantMap IgnoreListManager::initIgnoreList() const { - QVariantMap ignoreListMap; - QVariantList ignoreTypeList; - QStringList ignoreRuleList; - QStringList scopeRuleList; - QVariantList isRegExList; - QVariantList scopeList; - QVariantList strictnessList; - QVariantList isActiveList; - - for(int i = 0; i < _ignoreList.count(); i++) { - ignoreTypeList << _ignoreList[i].type; - ignoreRuleList << _ignoreList[i].ignoreRule; - scopeRuleList << _ignoreList[i].scopeRule; - isRegExList << _ignoreList[i].isRegEx; - scopeList << _ignoreList[i].scope; - strictnessList << _ignoreList[i].strictness; - isActiveList << _ignoreList[i].isActive; - } - - ignoreListMap["ignoreType"] = ignoreTypeList; - ignoreListMap["ignoreRule"] = ignoreRuleList; - ignoreListMap["scopeRule"] = scopeRuleList; - ignoreListMap["isRegEx"] = isRegExList; - ignoreListMap["scope"] = scopeList; - ignoreListMap["strictness"] = strictnessList; - ignoreListMap["isActive"] = isActiveList; - return ignoreListMap; + +QVariantMap IgnoreListManager::initIgnoreList() const +{ + QVariantMap ignoreListMap; + QVariantList ignoreTypeList; + QStringList ignoreRuleList; + QStringList scopeRuleList; + QVariantList isRegExList; + QVariantList scopeList; + QVariantList strictnessList; + QVariantList isActiveList; + + for (int i = 0; i < _ignoreList.count(); i++) { + ignoreTypeList << _ignoreList[i].type; + ignoreRuleList << _ignoreList[i].ignoreRule; + scopeRuleList << _ignoreList[i].scopeRule; + isRegExList << _ignoreList[i].isRegEx; + scopeList << _ignoreList[i].scope; + strictnessList << _ignoreList[i].strictness; + isActiveList << _ignoreList[i].isActive; + } + + ignoreListMap["ignoreType"] = ignoreTypeList; + ignoreListMap["ignoreRule"] = ignoreRuleList; + ignoreListMap["scopeRule"] = scopeRuleList; + ignoreListMap["isRegEx"] = isRegExList; + ignoreListMap["scope"] = scopeList; + ignoreListMap["strictness"] = strictnessList; + ignoreListMap["isActive"] = isActiveList; + return ignoreListMap; } -void IgnoreListManager::initSetIgnoreList(const QVariantMap &ignoreList) { - QVariantList ignoreType = ignoreList["ignoreType"].toList(); - QStringList ignoreRule = ignoreList["ignoreRule"].toStringList(); - QStringList scopeRule = ignoreList["scopeRule"].toStringList(); - QVariantList isRegEx = ignoreList["isRegEx"].toList(); - QVariantList scope = ignoreList["scope"].toList(); - QVariantList strictness = ignoreList["strictness"].toList(); - QVariantList isActive = ignoreList["isActive"].toList(); - - int count = ignoreRule.count(); - if(count != scopeRule.count() || count != isRegEx.count() || - count != scope.count() || count != strictness.count() || count != ignoreType.count() || count != isActive.count()) { - qWarning() << "Corrupted IgnoreList settings! (Count missmatch)"; - return; - } - - _ignoreList.clear(); - for(int i = 0; i < ignoreRule.count(); i++) { - _ignoreList << IgnoreListItem(static_cast(ignoreType[i].toInt()), ignoreRule[i], isRegEx[i].toBool(), - static_cast(strictness[i].toInt()), static_cast(scope[i].toInt()), - scopeRule[i], isActive[i].toBool()); - } + +void IgnoreListManager::initSetIgnoreList(const QVariantMap &ignoreList) +{ + QVariantList ignoreType = ignoreList["ignoreType"].toList(); + QStringList ignoreRule = ignoreList["ignoreRule"].toStringList(); + QStringList scopeRule = ignoreList["scopeRule"].toStringList(); + QVariantList isRegEx = ignoreList["isRegEx"].toList(); + QVariantList scope = ignoreList["scope"].toList(); + QVariantList strictness = ignoreList["strictness"].toList(); + QVariantList isActive = ignoreList["isActive"].toList(); + + int count = ignoreRule.count(); + if (count != scopeRule.count() || count != isRegEx.count() || + count != scope.count() || count != strictness.count() || count != ignoreType.count() || count != isActive.count()) { + qWarning() << "Corrupted IgnoreList settings! (Count missmatch)"; + return; + } + + _ignoreList.clear(); + for (int i = 0; i < ignoreRule.count(); i++) { + _ignoreList << IgnoreListItem(static_cast(ignoreType[i].toInt()), ignoreRule[i], isRegEx[i].toBool(), + static_cast(strictness[i].toInt()), static_cast(scope[i].toInt()), + scopeRule[i], isActive[i].toBool()); + } } + /* since overloaded methods aren't syncable (yet?) we can't use that anymore void IgnoreListManager::addIgnoreListItem(const IgnoreListItem &item) { addIgnoreListItem(item.type, item.ignoreRule, item.isRegEx, item.strictness, item.scope, item.scopeRule, item.isActive); } */ void IgnoreListManager::addIgnoreListItem(int type, const QString &ignoreRule, bool isRegEx, int strictness, - int scope, const QString &scopeRule, bool isActive) { - if(contains(ignoreRule)) { - return; - } + int scope, const QString &scopeRule, bool isActive) +{ + if (contains(ignoreRule)) { + return; + } - IgnoreListItem newItem = IgnoreListItem(static_cast(type), ignoreRule, isRegEx, static_cast(strictness), - static_cast(scope), scopeRule, isActive); - _ignoreList << newItem; + IgnoreListItem newItem = IgnoreListItem(static_cast(type), ignoreRule, isRegEx, static_cast(strictness), + static_cast(scope), scopeRule, isActive); + _ignoreList << newItem; - SYNC(ARG(type), ARG(ignoreRule), ARG(isRegEx), ARG(strictness), ARG(scope), ARG(scopeRule), ARG(isActive)) + SYNC(ARG(type), ARG(ignoreRule), ARG(isRegEx), ARG(strictness), ARG(scope), ARG(scopeRule), ARG(isActive)) } -IgnoreListManager::StrictnessType IgnoreListManager::match(const Message &msg, const QString &network) { - if(!(msg.type() & (Message::Plain | Message::Notice | Message::Action))) - return UnmatchedStrictness; - foreach(IgnoreListItem item, _ignoreList) { - if(!item.isActive || item.type == CtcpIgnore) - continue; - if(item.scope == GlobalScope || (item.scope == NetworkScope && scopeMatch(item.scopeRule, network)) || - (item.scope == ChannelScope && scopeMatch(item.scopeRule, msg.bufferInfo().bufferName()))) { - - QString str; - if(item.type == MessageIgnore) - str = msg.contents(); - else - str = msg.sender(); - - QRegExp ruleRx = QRegExp(item.ignoreRule); - ruleRx.setCaseSensitivity(Qt::CaseInsensitive); - if(!item.isRegEx) { - ruleRx.setPatternSyntax(QRegExp::Wildcard); - } +IgnoreListManager::StrictnessType IgnoreListManager::_match(const QString &msgContents, const QString &msgSender, Message::Type msgType, const QString &network, const QString &bufferName) +{ + // We method don't rely on a proper Message object to make this method more versatile. + // This allows us to use it in the core with unprocessed Messages or in the Client + // with properly preprocessed Messages. + if (!(msgType & (Message::Plain | Message::Notice | Message::Action))) + return UnmatchedStrictness; + + foreach(IgnoreListItem item, _ignoreList) { + if (!item.isActive || item.type == CtcpIgnore) + continue; + if (item.scope == GlobalScope + || (item.scope == NetworkScope && scopeMatch(item.scopeRule, network)) + || (item.scope == ChannelScope && scopeMatch(item.scopeRule, bufferName))) { + QString str; + if (item.type == MessageIgnore) + str = msgContents; + else + str = msgSender; // qDebug() << "IgnoreListManager::match: "; // qDebug() << "string: " << str; // qDebug() << "pattern: " << ruleRx.pattern(); // qDebug() << "scopeRule: " << item.scopeRule; // qDebug() << "now testing"; - if((!item.isRegEx && ruleRx.exactMatch(str)) || - (item.isRegEx && ruleRx.indexIn(str) != -1)) { + if ((!item.isRegEx && item.regEx.exactMatch(str)) || + (item.isRegEx && item.regEx.indexIn(str) != -1)) { // qDebug() << "MATCHED!"; - return item.strictness; - } + return item.strictness; + } + } } - } - return UnmatchedStrictness; + return UnmatchedStrictness; } -bool IgnoreListManager::scopeMatch(const QString &scopeRule, const QString &string) const { - foreach(QString rule, scopeRule.split(";")) { - QRegExp ruleRx = QRegExp(rule.trimmed()); - ruleRx.setCaseSensitivity(Qt::CaseInsensitive); - ruleRx.setPatternSyntax(QRegExp::Wildcard); - if(ruleRx.exactMatch(string)) { - return true; + +bool IgnoreListManager::scopeMatch(const QString &scopeRule, const QString &string) const +{ + foreach(QString rule, scopeRule.split(";")) { + QRegExp ruleRx = QRegExp(rule.trimmed()); + ruleRx.setCaseSensitivity(Qt::CaseInsensitive); + ruleRx.setPatternSyntax(QRegExp::Wildcard); + if (ruleRx.exactMatch(string)) { + return true; + } } - } - return false; + return false; } -void IgnoreListManager::removeIgnoreListItem(const QString &ignoreRule) { - removeAt(indexOf(ignoreRule)); - SYNC(ARG(ignoreRule)) -} -void IgnoreListManager::toggleIgnoreRule(const QString &ignoreRule) { - int idx = indexOf(ignoreRule); - if(idx == -1) - return; - _ignoreList[idx].isActive = !_ignoreList[idx].isActive; - SYNC(ARG(ignoreRule)) +void IgnoreListManager::removeIgnoreListItem(const QString &ignoreRule) +{ + removeAt(indexOf(ignoreRule)); + SYNC(ARG(ignoreRule)) } -bool IgnoreListManager::ctcpMatch(const QString sender, const QString &network, const QString &type) { - foreach(IgnoreListItem item, _ignoreList) { - if(!item.isActive) - continue; - if(item.scope == GlobalScope || (item.scope == NetworkScope && scopeMatch(item.scopeRule, network))) { - QString sender_; - QStringList types = item.ignoreRule.split(QRegExp("\\s+"), QString::SkipEmptyParts); - sender_ = types.takeAt(0); +void IgnoreListManager::toggleIgnoreRule(const QString &ignoreRule) +{ + int idx = indexOf(ignoreRule); + if (idx == -1) + return; + _ignoreList[idx].isActive = !_ignoreList[idx].isActive; + SYNC(ARG(ignoreRule)) +} - QRegExp ruleRx = QRegExp(sender_); - ruleRx.setCaseSensitivity(Qt::CaseInsensitive); - if(!item.isRegEx) - ruleRx.setPatternSyntax(QRegExp::Wildcard); - if((!item.isRegEx && ruleRx.exactMatch(sender)) || - (item.isRegEx && ruleRx.indexIn(sender) != -1)) { - if(types.isEmpty() || types.contains(type, Qt::CaseInsensitive)) - return true; - } +bool IgnoreListManager::ctcpMatch(const QString sender, const QString &network, const QString &type) +{ + foreach(IgnoreListItem item, _ignoreList) { + if (!item.isActive) + continue; + if (item.scope == GlobalScope || (item.scope == NetworkScope && scopeMatch(item.scopeRule, network))) { + QString sender_; + QStringList types = item.ignoreRule.split(QRegExp("\\s+"), QString::SkipEmptyParts); + + sender_ = types.takeAt(0); + + QRegExp ruleRx = QRegExp(sender_); + ruleRx.setCaseSensitivity(Qt::CaseInsensitive); + if (!item.isRegEx) + ruleRx.setPatternSyntax(QRegExp::Wildcard); + if ((!item.isRegEx && ruleRx.exactMatch(sender)) || + (item.isRegEx && ruleRx.indexIn(sender) != -1)) { + if (types.isEmpty() || types.contains(type, Qt::CaseInsensitive)) + return true; + } + } } - } - return false; + return false; }