Exemplo n.º 1
0
        /// <summary>
        /// Clears the existing cache.
        /// </summary>
        public void ClearCache()
        {
            KnownFollowers.Clear();

            _lastFollowerDates.Clear();

            _nameBasedMonitor?.ClearCache();

            _nameBasedMonitor = null;
            _idBasedMonitor   = null;
        }
Exemplo n.º 2
0
        /// <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
                });
            }
        }