예제 #1
0
        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 _);
            }
        }
예제 #2
0
        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));
        }
예제 #3
0
        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 _);
            }
        }