Add a new message flag, 'Ignored', tracking if the message matched an
ignore rule when received. In practice, this refers to dynamic ignore
rules (SoftStrictness), as permanent ignore rules (HardStrictness)
will drop the message entirely. Simple clients/bots may use this to
apply ignore rules without having to implement the entire regular
expression rules.
Exclude messages that match an ignore rule when updating
bufferActivity and highlightCount, fixing the appearance of new
activity/highlights from ignored messages.
Fixes #1511
NOTE: Using the 'Ignored' flag is not recommended for full clients as
they will need to locally reveal hidden messages when specific dynamic
ignore rules are disabled.
Clean up leftover comment on serializing sender prefixes.
Co-authored-by: Janne Koschinski <janne@kuschku.de>
Q_ASSERT(SignalProxy::current());
Q_ASSERT(SignalProxy::current()->targetPeer());
Q_ASSERT(SignalProxy::current());
Q_ASSERT(SignalProxy::current()->targetPeer());
- // We do not serialize the sender prefixes until we have a new protocol or client-features implemented
out << msg.msgId();
if (SignalProxy::current()->targetPeer()->hasFeature(Quassel::Feature::LongTime)) {
out << msg.msgId();
if (SignalProxy::current()->targetPeer()->hasFeature(Quassel::Feature::LongTime)) {
Redirected = 0x04,
ServerMsg = 0x08,
StatusMsg = 0x10,
Redirected = 0x04,
ServerMsg = 0x08,
StatusMsg = 0x10,
+ Ignored = 0x20, ///< This message matched an active ignore rule when first received
Backlog = 0x80
};
Q_DECLARE_FLAGS(Flags, Flag)
Backlog = 0x80
};
Q_DECLARE_FLAGS(Flags, Flag)
(SELECT DISTINCT TYPE
FROM backlog
WHERE bufferid = :bufferid
(SELECT DISTINCT TYPE
FROM backlog
WHERE bufferid = :bufferid
AND flags & 1 = 0
AND messageid > :lastseenmsgid) t;
AND flags & 1 = 0
AND messageid > :lastseenmsgid) t;
FROM
(SELECT COUNT(*) AS sum FROM backlog
WHERE bufferid = :bufferid
FROM
(SELECT COUNT(*) AS sum FROM backlog
WHERE bufferid = :bufferid
AND flags & 2 != 0
AND flags & 1 = 0
AND messageid > :lastseenmsgid) t;
AND flags & 2 != 0
AND flags & 1 = 0
AND messageid > :lastseenmsgid) t;
(SELECT DISTINCT TYPE
FROM backlog
WHERE bufferid = :bufferid
(SELECT DISTINCT TYPE
FROM backlog
WHERE bufferid = :bufferid
AND flags & 1 = 0
AND messageid > :lastseenmsgid) t;
AND flags & 1 = 0
AND messageid > :lastseenmsgid) t;
FROM
(SELECT COUNT(*) AS sum FROM backlog
WHERE bufferid = :bufferid
FROM
(SELECT COUNT(*) AS sum FROM backlog
WHERE bufferid = :bufferid
AND flags & 2 != 0
AND flags & 1 = 0
AND messageid > :lastseenmsgid) t;
AND flags & 2 != 0
AND flags & 1 = 0
AND messageid > :lastseenmsgid) t;
void addBufferActivity(const Message& message)
{
void addBufferActivity(const Message& message)
{
+ if (message.flags().testFlag(Message::Flag::Ignored)) {
+ // Don't update buffer activity with messages that are ignored
+ return;
+ }
auto oldActivity = activity(message.bufferId());
if (!oldActivity.testFlag(message.type())) {
setBufferActivity(message.bufferId(), (int)(oldActivity | message.type()));
auto oldActivity = activity(message.bufferId());
if (!oldActivity.testFlag(message.type())) {
setBufferActivity(message.bufferId(), (int)(oldActivity | message.type()));
void addCoreHighlight(const Message& message)
{
void addCoreHighlight(const Message& message)
{
+ if (message.flags().testFlag(Message::Flag::Ignored)) {
+ // Don't increase highlight count for messages that are ignored
+ return;
+ }
auto oldHighlightCount = highlightCount(message.bufferId());
if (message.flags().testFlag(Message::Flag::Highlight) && !message.flags().testFlag(Message::Flag::Self)) {
setHighlightCount(message.bufferId(), oldHighlightCount + 1);
auto oldHighlightCount = highlightCount(message.bufferId());
if (message.flags().testFlag(Message::Flag::Highlight) && !message.flags().testFlag(Message::Flag::Self)) {
setHighlightCount(message.bufferId(), oldHighlightCount + 1);
// check for HardStrictness ignore
CoreNetwork* currentNetwork = network(msg.networkId);
QString networkName = currentNetwork ? currentNetwork->networkName() : QString("");
// check for HardStrictness ignore
CoreNetwork* currentNetwork = network(msg.networkId);
QString networkName = currentNetwork ? currentNetwork->networkName() : QString("");
- if (_ignoreListManager.match(msg, networkName) == IgnoreListManager::HardStrictness)
+ switch (_ignoreListManager.match(msg, networkName)) {
+ case IgnoreListManager::StrictnessType::HardStrictness:
+ // Drop the message permanently
+ case IgnoreListManager::StrictnessType::SoftStrictness:
+ // Mark the message as (dynamically) ignored
+ msg.flags |= Message::Flag::Ignored;
+ break;
+ case IgnoreListManager::StrictnessType::UnmatchedStrictness:
+ // Keep the message unmodified
+ break;
+ }
if (currentNetwork && _highlightRuleManager.match(msg, currentNetwork->myNick(), currentNetwork->identityPtr()->nicks()))
msg.flags |= Message::Flag::Highlight;
if (currentNetwork && _highlightRuleManager.match(msg, currentNetwork->myNick(), currentNetwork->identityPtr()->nicks()))
msg.flags |= Message::Flag::Highlight;