/// <summary> /// Clears the existing cache. /// </summary> public void ClearCache() { KnownFollowers.Clear(); _lastFollowerDates.Clear(); _nameBasedMonitor?.ClearCache(); _nameBasedMonitor = null; _idBasedMonitor = null; }
/// <summary> /// Updates the followerservice with the latest followers. Automatically called internally when service is started. /// </summary> /// <param name="callEvents">Whether to invoke the update events or not.</param> public async Task UpdateLatestFollowersAsync(bool callEvents = true) { if (ChannelsToMonitor == null) { return; } foreach (var channel in ChannelsToMonitor) { List <Follow> newFollowers; var latestFollowers = await GetLatestFollowersAsync(channel); if (latestFollowers.Count == 0) { return; } if (!KnownFollowers.TryGetValue(channel, out var knownFollowers)) { newFollowers = latestFollowers; KnownFollowers[channel] = latestFollowers.Take(CacheSize).ToList(); _lastFollowerDates[channel] = latestFollowers.Last().FollowedAt; } else { var existingFollowerIds = new HashSet <string>(knownFollowers.Select(f => f.FromUserId)); var latestKnownFollowerDate = _lastFollowerDates[channel]; newFollowers = new List <Follow>(); foreach (var follower in latestFollowers) { if (!existingFollowerIds.Add(follower.FromUserId)) { continue; } if (follower.FollowedAt < latestKnownFollowerDate) { continue; } newFollowers.Add(follower); latestKnownFollowerDate = follower.FollowedAt; knownFollowers.Add(follower); } existingFollowerIds.Clear(); existingFollowerIds.TrimExcess(); // prune cache so we don't use too much space unnecessarily if (knownFollowers.Count > CacheSize) { knownFollowers.RemoveRange(0, knownFollowers.Count - CacheSize); } if (newFollowers.Count <= 0) { return; } _lastFollowerDates[channel] = latestKnownFollowerDate; } if (!callEvents) { return; } OnNewFollowersDetected?.Invoke(this, new OnNewFollowersDetectedArgs { Channel = channel, NewFollowers = newFollowers }); } }