X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fqtuimessageprocessor.cpp;h=3471f5b187fd66c2e4a6f64562a0bbe745bd0020;hp=f1eb47f68e5c62a5bc1d84356e268957ec67c4d5;hb=a95ad2de573027f9bee36db972bcae4195168d0c;hpb=54ebc1bf00f4f9a8376629925329f0e72be04662 diff --git a/src/qtui/qtuimessageprocessor.cpp b/src/qtui/qtuimessageprocessor.cpp index f1eb47f6..3471f5b1 100644 --- a/src/qtui/qtuimessageprocessor.cpp +++ b/src/qtui/qtuimessageprocessor.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2018 by the Quassel Project * + * Copyright (C) 2005-2020 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -26,44 +26,44 @@ #include "messagemodel.h" #include "network.h" -QtUiMessageProcessor::QtUiMessageProcessor(QObject *parent) - : AbstractMessageProcessor(parent), - _processing(false), - _processMode(TimerBased) +QtUiMessageProcessor::QtUiMessageProcessor(QObject* parent) + : AbstractMessageProcessor(parent) + , _processing(false) + , _processMode(TimerBased) { NotificationSettings notificationSettings; _nicksCaseSensitive = notificationSettings.nicksCaseSensitive(); + _nickMatcher.setCaseSensitive(_nicksCaseSensitive); _highlightNick = notificationSettings.highlightNick(); + _nickMatcher.setHighlightMode(static_cast(_highlightNick)); highlightListChanged(notificationSettings.highlightList()); - notificationSettings.notify("Highlights/NicksCaseSensitive", this, SLOT(nicksCaseSensitiveChanged(const QVariant &))); - notificationSettings.notify("Highlights/CustomList", this, SLOT(highlightListChanged(const QVariant &))); - notificationSettings.notify("Highlights/HighlightNick", this, SLOT(highlightNickChanged(const QVariant &))); + notificationSettings.notify("Highlights/NicksCaseSensitive", this, &QtUiMessageProcessor::nicksCaseSensitiveChanged); + notificationSettings.notify("Highlights/CustomList", this, &QtUiMessageProcessor::highlightListChanged); + notificationSettings.notify("Highlights/HighlightNick", this, &QtUiMessageProcessor::highlightNickChanged); _processTimer.setInterval(0); - connect(&_processTimer, SIGNAL(timeout()), this, SLOT(processNextMessage())); + connect(&_processTimer, &QTimer::timeout, this, &QtUiMessageProcessor::processNextMessage); } - void QtUiMessageProcessor::reset() { if (processMode() == TimerBased) { - if (_processTimer.isActive()) _processTimer.stop(); + if (_processTimer.isActive()) + _processTimer.stop(); _processing = false; _currentBatch.clear(); _processQueue.clear(); } } - -void QtUiMessageProcessor::process(Message &msg) +void QtUiMessageProcessor::process(Message& msg) { checkForHighlight(msg); preProcess(msg); Client::messageModel()->insertMessage(msg); } - -void QtUiMessageProcessor::process(QList &msgs) +void QtUiMessageProcessor::process(QList& msgs) { QList::iterator msgIter = msgs.begin(); QList::iterator msgIterEnd = msgs.end(); @@ -75,13 +75,13 @@ void QtUiMessageProcessor::process(QList &msgs) Client::messageModel()->insertMessages(msgs); return; - if (msgs.isEmpty()) return; + if (msgs.isEmpty()) + return; _processQueue.append(msgs); if (!isProcessing()) startProcessing(); } - void QtUiMessageProcessor::startProcessing() { if (processMode() == TimerBased) { @@ -93,7 +93,6 @@ void QtUiMessageProcessor::startProcessing() } } - void QtUiMessageProcessor::processNextMessage() { if (_currentBatch.isEmpty()) { @@ -108,20 +107,21 @@ void QtUiMessageProcessor::processNextMessage() process(msg); } - -void QtUiMessageProcessor::checkForHighlight(Message &msg) +void QtUiMessageProcessor::checkForHighlight(Message& msg) { if (!((msg.type() & (Message::Plain | Message::Notice | Message::Action)) && !(msg.flags() & Message::Self))) return; - // TODO: Cache this (per network) - const Network *net = Client::network(msg.bufferInfo().networkId()); + // Cached per network + const NetworkId& netId = msg.bufferInfo().networkId(); + const Network* net = Client::network(netId); + if (net && !net->myNick().isEmpty()) { // Get current nick QString currentNick = net->myNick(); // Get identity nicks QStringList identityNicks = {}; - const Identity *myIdentity = Client::identity(net->identity()); + const Identity* myIdentity = Client::identity(net->identity()); if (myIdentity) { identityNicks = myIdentity->nicks(); } @@ -132,7 +132,7 @@ void QtUiMessageProcessor::checkForHighlight(Message &msg) bool matches = false; for (int i = 0; i < _highlightRuleList.count(); i++) { - auto &rule = _highlightRuleList.at(i); + auto& rule = _highlightRuleList.at(i); if (!rule.isEnabled()) continue; @@ -166,13 +166,9 @@ void QtUiMessageProcessor::checkForHighlight(Message &msg) // Check nicknames if (_highlightNick != HighlightNickType::NoNick && !currentNick.isEmpty()) { - // Update cache if needed - determineNickExpressions(currentNick, identityNicks); - - // Check for a match - if (_cachedNickMatcher.isValid() - && _cachedNickMatcher.match(stripFormatCodes(msgContents))) { - // Nick matcher is valid and match found + // Nickname matching allowed and current nickname is known + // Run the nickname matcher on the unformatted string + if (_nickMatcher.match(stripFormatCodes(msgContents), netId, currentNick, identityNicks)) { msg.setFlags(msg.flags() | Message::Highlight); return; } @@ -180,15 +176,14 @@ void QtUiMessageProcessor::checkForHighlight(Message &msg) } } - -void QtUiMessageProcessor::nicksCaseSensitiveChanged(const QVariant &variant) +void QtUiMessageProcessor::nicksCaseSensitiveChanged(const QVariant& variant) { _nicksCaseSensitive = variant.toBool(); - _cacheNickConfigInvalid = true; + // Update nickname matcher, too + _nickMatcher.setCaseSensitive(_nicksCaseSensitive); } - -void QtUiMessageProcessor::highlightListChanged(const QVariant &variant) +void QtUiMessageProcessor::highlightListChanged(const QVariant& variant) { QVariantList varList = variant.toList(); @@ -197,73 +192,38 @@ void QtUiMessageProcessor::highlightListChanged(const QVariant &variant) while (iter != varList.constEnd()) { QVariantMap rule = iter->toMap(); _highlightRuleList << LegacyHighlightRule(rule["Name"].toString(), - rule["RegEx"].toBool(), - rule["CS"].toBool(), - rule["Enable"].toBool(), - rule["Channel"].toString()); + rule["RegEx"].toBool(), + rule["CS"].toBool(), + rule["Enable"].toBool(), + rule["Channel"].toString()); ++iter; } } - -void QtUiMessageProcessor::highlightNickChanged(const QVariant &variant) +void QtUiMessageProcessor::highlightNickChanged(const QVariant& variant) { - _highlightNick = (NotificationSettings::HighlightNickType)variant.toInt(); - _cacheNickConfigInvalid = true; + _highlightNick = (HighlightNickType)variant.toInt(); + // Convert from QtUiMessageProcessor::HighlightNickType (which is from NotificationSettings) to + // NickHighlightMatcher::HighlightNickType + _nickMatcher.setHighlightMode(static_cast(_highlightNick)); } - -void QtUiMessageProcessor::determineNickExpressions(const QString ¤tNick, - const QStringList identityNicks) const +void QtUiMessageProcessor::networkRemoved(NetworkId id) { - // Don't do anything for no nicknames - if (_highlightNick == HighlightNickType::NoNick) { - return; - } - - // Only update if needed (check nickname config, current nick, identity nicks for change) - if (!_cacheNickConfigInvalid - && _cachedNickCurrent == currentNick - && _cachedIdentityNicks == identityNicks) { - return; - } - - // Add all nicknames - QStringList nickList; - if (_highlightNick == HighlightNickType::CurrentNick) { - nickList << currentNick; - } - else if (_highlightNick == HighlightNickType::AllNicks) { - nickList = identityNicks; - if (!nickList.contains(currentNick)) - nickList.prepend(currentNick); - } - - // Set up phrase matcher, joining with newlines - _cachedNickMatcher = ExpressionMatch(nickList.join("\n"), - ExpressionMatch::MatchMode::MatchMultiPhrase, - _nicksCaseSensitive); - - _cacheNickConfigInvalid = false; - _cachedNickCurrent = currentNick; - _cachedIdentityNicks = identityNicks; + // Clean up nickname matching cache + _nickMatcher.removeNetwork(id); } - /************************************************************************** * LegacyHighlightRule *************************************************************************/ -bool QtUiMessageProcessor::LegacyHighlightRule::operator!=(const LegacyHighlightRule &other) const +bool QtUiMessageProcessor::LegacyHighlightRule::operator!=(const LegacyHighlightRule& other) const { - return (_contents != other._contents || - _isRegEx != other._isRegEx || - _isCaseSensitive != other._isCaseSensitive || - _isEnabled != other._isEnabled || - _chanName != other._chanName); + return (_contents != other._contents || _isRegEx != other._isRegEx || _isCaseSensitive != other._isCaseSensitive + || _isEnabled != other._isEnabled || _chanName != other._chanName); // Don't compare ExpressionMatch objects as they are created as needed from the above } - void QtUiMessageProcessor::LegacyHighlightRule::determineExpressions() const { // Don't update if not needed @@ -273,13 +233,9 @@ void QtUiMessageProcessor::LegacyHighlightRule::determineExpressions() const // Set up matching rules // Message is either phrase or regex - ExpressionMatch::MatchMode contentsMode = - _isRegEx ? ExpressionMatch::MatchMode::MatchRegEx : - ExpressionMatch::MatchMode::MatchPhrase; + ExpressionMatch::MatchMode contentsMode = _isRegEx ? ExpressionMatch::MatchMode::MatchRegEx : ExpressionMatch::MatchMode::MatchPhrase; // Sender (when added) and channel are either multiple wildcard entries or regex - ExpressionMatch::MatchMode scopeMode = - _isRegEx ? ExpressionMatch::MatchMode::MatchRegEx : - ExpressionMatch::MatchMode::MatchMultiWildcard; + ExpressionMatch::MatchMode scopeMode = _isRegEx ? ExpressionMatch::MatchMode::MatchRegEx : ExpressionMatch::MatchMode::MatchMultiWildcard; _contentsMatch = ExpressionMatch(_contents, contentsMode, _isCaseSensitive); _chanNameMatch = ExpressionMatch(_chanName, scopeMode, _isCaseSensitive);