Skip to content

Commit 6ecc252

Browse files
author
Timothy Dodd
committed
Add AllEmails ExpressionType and refactor RuleMatcher
Introduced a new `ExpressionType` value `AllEmails` to allow rules to match all emails without applying specific filters. Updated `RuleMatcher` logic to handle this new type, including skipping age and status filters when applicable. Refactored `RuleMatcher` by introducing the `ProcessMatch` method to centralize match processing logic, improving readability and reducing duplication. Fixed a bug in `PassesStatusFilters` where the `RequireUnread` logic was inverted. Updated `appsettings.json` to rename and enable the `"CleanupOldUnread"` rule, set its `ExpressionType` to `AllEmails`, and adjust its configuration.
1 parent 7cc6204 commit 6ecc252

3 files changed

Lines changed: 45 additions & 26 deletions

File tree

src/MailZort/Program.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,8 @@ public enum ExpressionType
118118
StartsWith,
119119
EndsWith,
120120
MatchesRegex,
121-
DoesNotMatchRegex
121+
DoesNotMatchRegex,
122+
AllEmails
122123
}
123124
public class Stats
124125
{

src/MailZort/Services/RuleMatcher.cs

Lines changed: 40 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public RuleMatcher(ILogger<RuleMatcher> logger)
1212
}
1313
private static bool PassesAgeFilter(Rule rule, EmailReceivedEventArgs email)
1414
{
15-
if (email.IsRead)
15+
if (email.IsRead && rule.ExpressionType != ExpressionType.AllEmails)
1616
{
1717
if (DateTimeOffset.Now.Subtract(email.ReceivedDate).TotalHours > 2)
1818
return true;
@@ -28,7 +28,7 @@ private static bool PassesAgeFilter(Rule rule, EmailReceivedEventArgs email)
2828
private static bool PassesStatusFilters(Rule rule, EmailReceivedEventArgs email)
2929
{
3030
// Check RequireUnread filter - if set to true, email must be unread
31-
if (rule.RequireUnread == true && email.IsRead)
31+
if (rule.RequireUnread == true && !email.IsRead)
3232
return false;
3333

3434
// Check RequireNotImportant filter - if set to true, email must NOT be important
@@ -37,11 +37,47 @@ private static bool PassesStatusFilters(Rule rule, EmailReceivedEventArgs email)
3737

3838
return true;
3939
}
40+
private bool ProcessMatch(Rule rule, EmailReceivedEventArgs email, string value, MatchResult matchResult)
41+
{
42+
_logger.LogDebug("Match found! Rule: {RuleId}, Value: '{Value}', Location: {Location}",
43+
rule.Name, value, matchResult.MatchLocation);
44+
45+
var passesAge = PassesAgeFilter(rule, email);
46+
_logger.LogDebug("Age filter result: {PassesAge} for rule: {RuleId}", passesAge, rule.Name);
47+
48+
var passesStatus = PassesStatusFilters(rule, email);
49+
_logger.LogDebug("Status filter result: {PassesStatus} for rule: {RuleId} (IsRead: {IsRead}, IsImportant: {IsImportant})",
50+
passesStatus, rule.Name, email.IsRead, email.IsImportant);
51+
52+
if (passesAge && passesStatus)
53+
{
54+
_logger.LogInformation("RULE MATCHED! Rule: {RuleId}, Value: '{Value}', Location: {Location}, Subject: '{Subject}'",
55+
rule.Name, value, matchResult.MatchLocation, email.Subject);
56+
return true;
57+
}
58+
else
59+
{
60+
_logger.LogDebug("Match found but failed filters (age: {PassesAge}, status: {PassesStatus}). Rule: {RuleId}",
61+
passesAge, passesStatus, rule.Name);
62+
return false;
63+
}
64+
}
4065
// Enhanced version with detailed debug information
4166
public bool CheckRuleMatch(Rule rule, EmailReceivedEventArgs email)
4267
{
4368
_logger.LogDebug("Checking rule: {RuleId} with {ValueCount} values", rule.Name, rule.Values?.Count ?? 0);
44-
69+
if (rule.ExpressionType == ExpressionType.AllEmails)
70+
{
71+
_logger.LogDebug("ExpressionType is AllEmails, automatically passing match for rule: {RuleId}", rule.Name);
72+
if (ProcessMatch(rule, email, "AllEmails", new MatchResult { IsMatch = true, MatchLocation = "AllEmails" }))
73+
{
74+
return true;
75+
}
76+
else
77+
{
78+
return false;
79+
}
80+
}
4581
foreach (var value in rule.Values!)
4682
{
4783
_logger.LogDebug("Testing value: '{Value}' with expression type: {ExpressionType}", value, rule.ExpressionType);
@@ -55,27 +91,10 @@ public bool CheckRuleMatch(Rule rule, EmailReceivedEventArgs email)
5591

5692
if (matchResult.IsMatch)
5793
{
58-
_logger.LogDebug("Match found! Rule: {RuleId}, Value: '{Value}', Location: {Location}",
59-
rule.Name, value, matchResult.MatchLocation);
60-
61-
var passesAge = PassesAgeFilter(rule, email);
62-
_logger.LogDebug("Age filter result: {PassesAge} for rule: {RuleId}", passesAge, rule.Name);
63-
64-
var passesStatus = PassesStatusFilters(rule, email);
65-
_logger.LogDebug("Status filter result: {PassesStatus} for rule: {RuleId} (IsRead: {IsRead}, IsImportant: {IsImportant})",
66-
passesStatus, rule.Name, email.IsRead, email.IsImportant);
67-
68-
if (passesAge && passesStatus)
94+
if (ProcessMatch(rule, email, value, matchResult))
6995
{
70-
_logger.LogInformation("RULE MATCHED! Rule: {RuleId}, Value: '{Value}', Location: {Location}, Subject: '{Subject}'",
71-
rule.Name, value, matchResult.MatchLocation, email.Subject);
7296
return true;
7397
}
74-
else
75-
{
76-
_logger.LogDebug("Match found but failed filters (age: {PassesAge}, status: {PassesStatus}). Rule: {RuleId}",
77-
passesAge, passesStatus, rule.Name);
78-
}
7998
}
8099
else
81100
{

src/MailZort/appsettings.json

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,17 +83,16 @@
8383
]
8484
},
8585
{
86-
"Name": "Cleanup Old Unread",
86+
"Name": "CleanupOldUnread",
8787
"Folder": "Inbox",
8888
"MoveTo": "Trash",
8989
"DaysOld": 15,
9090
"RequireUnread": true,
9191
"RequireNotImportant": true,
9292
"LookIn": 0,
93-
"ExpressionType": 6,
94-
"IsEnabled": false,
93+
"ExpressionType": 8,
94+
"IsEnabled": true,
9595
"Values": [
96-
".*"
9796
]
9897
}
9998
]

0 commit comments

Comments
 (0)