Esempio n. 1
0
        internal bool HasUpdated(CachedClanWarLeagueGroup stored, CachedClanWarLeagueGroup fetched)
        {
            if (stored.ServerExpiration > fetched.ServerExpiration)
            {
                return(false);
            }

            if (fetched.Data == null)
            {
                return(false);
            }

            return(HasUpdated(stored.Data, fetched.Data));
        }
Esempio n. 2
0
        private async Task MonitorCwlAsync(CachedClanWarLeagueGroup cached, CacheContext dbContext)
        {
            if (_stopRequestedTokenSource.IsCancellationRequested ||
                _updatingGroup.TryAdd(cached.Tag, new byte()) == false)
            {
                return;
            }

            try
            {
                CachedClanWarLeagueGroup?fetched = await CachedClanWarLeagueGroup
                                                   .FromClanWarLeagueGroupResponseAsync(cached.Tag, _clansClient, _clansApi, _stopRequestedTokenSource.Token)
                                                   .ConfigureAwait(false);

                if (fetched.Data != null && _clansClient.HasUpdated(cached, fetched))
                {
                    _clansClient.OnClanWarLeagueGroupUpdated(cached.Data, fetched.Data);
                }

                cached.UpdateFrom(fetched);

                List <Task> tasks = new List <Task>();

                HashSet <string> downloadWarTags = new HashSet <string>();

                if (cached.Data == null || cached.Season.Value.Month < DateTime.Now.Month)
                {
                    return;
                }

                try
                {
                    foreach (var round in cached.Data.Rounds)
                    {
                        foreach (string warTag in round.WarTags.Where(w => w != "#0"))
                        {
                            if (_updatingWarTags.TryAdd(warTag, new byte()))
                            {
                                downloadWarTags.Add(warTag);

                                tasks.Add(ReturnNewWarOrDefaultAsync(cached.Tag, cached.Season.Value, warTag));
                            }
                        }
                    }

                    await Task.WhenAll(tasks).ConfigureAwait(false);

                    foreach (Task <CachedWar?> cachedWarTask in tasks)
                    {
                        if (cachedWarTask.IsCompletedSuccessfully && cachedWarTask.Result is CachedWar cachedWar && cachedWar.Data != null)
                        {
                            dbContext.Wars.Add(cachedWar);
                            _clansClient.OnClanWarAdded(cachedWar.Data);
                        }
                    }
                }
                finally
                {
                    foreach (string warTag in downloadWarTags)
                    {
                        _updatingWarTags.TryRemove(warTag, out _);
                    }
                }
            }
            catch (Exception e)
            {
                _clansClient.OnLog(this, new LogEventArgs(nameof(MonitorCwlAsync), LogLevel.Debug, $"Error updating group:{cached.Tag};\n{e.Message};\n{e.InnerException?.Message}"));
            }
            finally
            {
                _updatingGroup.TryRemove(cached.Tag, out _);
            }
        }