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)); }
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 _); } }