modernize: Use auto where the type is clear from context
[quassel.git] / src / client / messagefilter.cpp
index 5efed2c..fd6e78b 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-2015 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 <algorithm>
+
 #include "buffersettings.h"
 #include "client.h"
 #include "buffermodel.h"
@@ -61,7 +63,7 @@ void MessageFilter::init()
     _messageTypeFilter = defaultSettings.messageFilter();
     defaultSettings.notify("MessageTypeFilter", this, SLOT(messageTypeFilterChanged()));
 
-    BufferSettings mySettings(idString());
+    BufferSettings mySettings(MessageFilter::idString());
     if (mySettings.hasFilter())
         _messageTypeFilter = mySettings.messageFilter();
     mySettings.notify("MessageTypeFilter", this, SLOT(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<QDateTime>().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<QDateTime>().toMSecsSinceEpoch();
+        QString quiter = nickFromMask(sourceModel()->data(sourceIdx, MessageModel::MessageRole)
+                                      .value<Message>().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<MessageFilter *>(this);
-        that->_filteredQuitMsgs.insert(quiter,  messageTimestamp);
+        // Mark query as having a quit message inserted
+        auto *that = const_cast<MessageFilter *>(this);
+        that->_filteredQuitMsgTime.insert(messageTimestamp);
         return true;
     }
 }
@@ -241,6 +257,6 @@ void MessageFilter::requestBacklog()
     QSet<BufferId>::const_iterator bufferIdIter = _validBuffers.constBegin();
     while (bufferIdIter != _validBuffers.constEnd()) {
         Client::messageModel()->requestBacklog(*bufferIdIter);
-        bufferIdIter++;
+        ++bufferIdIter;
     }
 }