X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fclient%2Fmessagefilter.cpp;h=18aedd21303f4e3591ff4e7b4430f34e898b3343;hp=a9d8a7d4c291cba0d5dc8dd2293dd61a87b43f59;hb=2c8434f74c68194d56f2084f637419123e61d18b;hpb=76db8cdfbeffaaba359c8e80cf2146da9e9e7f8a diff --git a/src/client/messagefilter.cpp b/src/client/messagefilter.cpp index a9d8a7d4..18aedd21 100644 --- a/src/client/messagefilter.cpp +++ b/src/client/messagefilter.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2013 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 * @@ -20,6 +20,8 @@ #include "messagefilter.h" +#include + #include "buffersettings.h" #include "client.h" #include "buffermodel.h" @@ -53,19 +55,19 @@ void MessageFilter::init() _userNoticesTarget = _serverNoticesTarget = _errorMsgsTarget = -1; BufferSettings defaultSettings; - defaultSettings.notify("UserNoticesTarget", this, SLOT(messageRedirectionChanged())); - defaultSettings.notify("ServerNoticesTarget", this, SLOT(messageRedirectionChanged())); - defaultSettings.notify("ErrorMsgsTarget", this, SLOT(messageRedirectionChanged())); + defaultSettings.notify("UserNoticesTarget", this, &MessageFilter::messageRedirectionChanged); + defaultSettings.notify("ServerNoticesTarget", this, &MessageFilter::messageRedirectionChanged); + defaultSettings.notify("ErrorMsgsTarget", this, &MessageFilter::messageRedirectionChanged); messageRedirectionChanged(); _messageTypeFilter = defaultSettings.messageFilter(); - defaultSettings.notify("MessageTypeFilter", this, SLOT(messageTypeFilterChanged())); + defaultSettings.notify("MessageTypeFilter", this, &MessageFilter::messageTypeFilterChanged); - BufferSettings mySettings(idString()); + BufferSettings mySettings(MessageFilter::idString()); if (mySettings.hasFilter()) _messageTypeFilter = mySettings.messageFilter(); - mySettings.notify("MessageTypeFilter", this, SLOT(messageTypeFilterChanged())); - mySettings.notify("hasMessageTypeFilter", this, SLOT(messageTypeFilterChanged())); + mySettings.notify("MessageTypeFilter", this, &MessageFilter::messageTypeFilterChanged); + mySettings.notify("hasMessageTypeFilter", this, &MessageFilter::messageTypeFilterChanged); } @@ -81,7 +83,7 @@ void MessageFilter::messageTypeFilterChanged() if (_messageTypeFilter != newFilter) { _messageTypeFilter = newFilter; - _filteredQuitMsgs.clear(); + _filteredQuitMsgTime.clear(); invalidateFilter(); } } @@ -201,7 +203,7 @@ bool MessageFilter::filterAcceptsRow(int sourceRow, const QModelIndex &sourcePar while (idIter != _validBuffers.constEnd()) { if (Client::networkModel()->bufferType(*idIter) == BufferInfo::StatusBuffer) return true; - idIter++; + ++idIter; } } @@ -221,16 +223,30 @@ bool MessageFilter::filterAcceptsRow(int sourceRow, const QModelIndex &sourcePar if (myNetworkId != msgNetworkId) return false; - uint messageTimestamp = sourceModel()->data(sourceIdx, MessageModel::TimestampRole).value().toTime_t(); - QString quiter = sourceModel()->data(sourceIdx, Qt::DisplayRole).toString().section(' ', 0, 0, QString::SectionSkipEmpty).toLower(); + // Extract timestamp and nickname from the new quit message + qint64 messageTimestamp = sourceModel()->data(sourceIdx, MessageModel::TimestampRole) + .value().toMSecsSinceEpoch(); + QString quiter = nickFromMask(sourceModel()->data(sourceIdx, MessageModel::MessageRole) + .value().sender()).toLower(); + + // Check that nickname matches query name if (quiter != bufferName().toLower()) return false; - if (_filteredQuitMsgs.contains(quiter, messageTimestamp)) + // Check if a quit message was already forwarded within +/- 1000 ms + static constexpr qint64 MAX_QUIT_DELTA_MS = 1 * 1000; + // No need to check if it's the appropriate buffer, each query has a unique message filter + if (std::binary_search(_filteredQuitMsgTime.begin(), _filteredQuitMsgTime.end(), + messageTimestamp, + [](qint64 a, qint64 b) { return ((a + MAX_QUIT_DELTA_MS) < b); } )) { + // New element is less than if at least 1000 ms older/newer + // Match found, no need to forward another quit message return false; + } - MessageFilter *that = const_cast(this); - that->_filteredQuitMsgs.insert(quiter, messageTimestamp); + // Mark query as having a quit message inserted + auto *that = const_cast(this); + that->_filteredQuitMsgTime.insert(messageTimestamp); return true; } } @@ -241,6 +257,6 @@ void MessageFilter::requestBacklog() QSet::const_iterator bufferIdIter = _validBuffers.constBegin(); while (bufferIdIter != _validBuffers.constEnd()) { Client::messageModel()->requestBacklog(*bufferIdIter); - bufferIdIter++; + ++bufferIdIter; } }