private async Task MonitorLogAsync(CachedClanWarLog cached) { if (_stopRequestedTokenSource.IsCancellationRequested || _clansClient.UpdatingClanWar.TryAdd(cached.Tag, new byte()) == false) { return; } try { CachedClanWarLog fetched = await CachedClanWarLog .FromClanWarLogResponseAsync(cached.Tag, _clansClient, _clansApi, _stopRequestedTokenSource.Token) .ConfigureAwait(false); if (fetched.Data != null && _clansClient.HasUpdated(cached, fetched)) { _clansClient.OnClanWarLogUpdated(cached.Data, fetched.Data); } cached.UpdateFrom(fetched); } finally { _clansClient.UpdatingClanWar.TryRemove(cached.Tag, out _); } }
internal bool HasUpdated(CachedClanWarLog stored, CachedClanWarLog fetched) { if (stored.ServerExpiration > fetched.ServerExpiration) { return(false); } if (fetched.Data == null) { return(false); } return(HasUpdated(stored.Data, fetched.Data)); }
public async Task DeleteAsync(string tag) { string formattedTag = Clash.FormatTag(tag); using var scope = Services.CreateScope(); CacheContext dbContext = scope.ServiceProvider.GetRequiredService <CacheContext>(); while (!_clanMonitor.UpdatingClan.TryAdd(formattedTag, new byte())) { await Task.Delay(500); } while (!UpdatingClanWar.TryAdd(formattedTag, new byte())) { await Task.Delay(500); } try { CachedClan cachedClan = await dbContext.Clans.FirstOrDefaultAsync(c => c.Tag == formattedTag); CachedClanWarLog cachedClanWarLog = await dbContext.WarLogs.FirstOrDefaultAsync(c => c.Tag == formattedTag); if (cachedClan != null) { dbContext.Clans.Remove(cachedClan); } if (cachedClanWarLog != null) { dbContext.WarLogs.Remove(cachedClanWarLog); } await dbContext.SaveChangesAsync(); } finally { _clanMonitor.UpdatingClan.TryRemove(formattedTag, out _); UpdatingClanWar.TryRemove(formattedTag, out _); } }