diff --git a/src/SpamGuard/Services/ActivityLog.cs b/src/SpamGuard/Services/ActivityLog.cs new file mode 100644 index 0000000..4915972 --- /dev/null +++ b/src/SpamGuard/Services/ActivityLog.cs @@ -0,0 +1,48 @@ +namespace SpamGuard.Services; + +using SpamGuard.Models; + +public sealed class ActivityLog +{ + private readonly List _entries = new(); + private readonly object _lock = new(); + private readonly int _maxEntries; + + public int TodayChecked => GetTodayCount(_ => true); + public int TodaySpam => GetTodayCount(e => e.Verdict == Verdict.Spam); + + public ActivityLog(int maxEntries = 500) + { + _maxEntries = maxEntries; + } + + public void Add(ActivityEntry entry) + { + lock (_lock) + { + _entries.Add(entry); + if (_entries.Count > _maxEntries) + _entries.RemoveAt(0); + } + } + + public List GetRecent(int count = 100) + { + lock (_lock) + { + return _entries + .OrderByDescending(e => e.Timestamp) + .Take(count) + .ToList(); + } + } + + private int GetTodayCount(Func predicate) + { + var today = DateTime.UtcNow.Date; + lock (_lock) + { + return _entries.Count(e => e.Timestamp.Date == today && predicate(e)); + } + } +}