Example #1
0
        internal async Task UpdatePlayerAsync(CachedPlayer cachedPlayer)
        {
            if (_stopRequestedTokenSource.IsCancellationRequested ||
                _playersClientBase.UpdatingVillage.TryAdd(cachedPlayer.Tag, null) == false)
            {
                return;
            }

            try
            {
                CachedPlayer?fetched = await CachedPlayer
                                       .FromPlayerResponseAsync(cachedPlayer.Tag, _playersClientBase, _playersApi, _stopRequestedTokenSource.Token)
                                       .ConfigureAwait(false);

                if (fetched.Data != null && _playersClientBase.HasUpdated(cachedPlayer, fetched))
                {
                    _playersClientBase.OnPlayerUpdated(cachedPlayer.Data, fetched.Data);
                }

                cachedPlayer.UpdateFrom(fetched);
            }
            finally
            {
                _playersClientBase.UpdatingVillage.TryRemove(cachedPlayer.Tag, out _);
            }
        }
Example #2
0
        private async Task MonitorMembersAsync(CachedClan cached)
        {
            if (_stopRequestedTokenSource.IsCancellationRequested || cached.Data == null)
            {
                return;
            }

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

            using var scope = Services.CreateScope();

            CacheContext dbContext = scope.ServiceProvider.GetRequiredService <CacheContext>();

            List <CachedPlayer> players = await dbContext.Players.Where(p => cached.Data.Members.Select(m => m.Tag).Contains(p.Tag)).ToListAsync();

            foreach (Model.ClanMember member in cached.Data.Members.Where(m => !players.Any(p => p.Tag == m.Tag)))
            {
                CachedPlayer player = new CachedPlayer(member.Tag);

                dbContext.Players.Add(player);

                players.Add(player);
            }

            foreach (Model.ClanMember?member in cached.Data.Members)
            {
                tasks.Add(MonitorMemberAsync(players.Single(p => p.Tag == member.Tag)));
            }

            await Task.WhenAll(tasks);

            await dbContext.SaveChangesAsync(_stopRequestedTokenSource.Token);
        }
Example #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 (!UpdatingVillage.TryAdd(formattedTag, new byte()))
            {
                await Task.Delay(500);
            }

            try
            {
                CachedPlayer cachedPlayer = await dbContext.Players.FirstOrDefaultAsync(c => c.Tag == formattedTag);

                if (cachedPlayer != null)
                {
                    dbContext.Players.Remove(cachedPlayer);
                }

                await dbContext.SaveChangesAsync();
            }
            finally
            {
                UpdatingVillage.TryRemove(formattedTag, out _);
            }
        }
Example #4
0
        public async Task <CachedPlayer> UpdateAsync(string tag, bool download = true)
        {
            string formattedTag = Clash.FormatTag(tag);

            using var scope = Services.CreateScope();

            CacheContext cacheContext = scope.ServiceProvider.GetRequiredService <CacheContext>();

            CachedPlayer cachedPlayer = await cacheContext.Players
                                        .FirstOrDefaultAsync(v => v.Tag == formattedTag)
                                        .ConfigureAwait(false);

            if (cachedPlayer != null && cachedPlayer.Download == download)
            {
                return(cachedPlayer);
            }

            if (cachedPlayer == null)
            {
                cachedPlayer = new CachedPlayer(formattedTag);
                cacheContext.Players.Add(cachedPlayer);
            }

            cachedPlayer.Download = download;

            await cacheContext.SaveChangesAsync().ConfigureAwait(false);

            return(cachedPlayer);
        }
Example #5
0
        private async Task MonitorMemberAsync(CachedPlayer cached)
        {
            if (cached.ServerExpiration > DateTime.UtcNow.AddSeconds(3) || cached.LocalExpiration > DateTime.UtcNow)
            {
                return;
            }

            await _playersClientBase.PlayerMontitor.UpdatePlayerAsync(cached);
        }
Example #6
0
        private static void OnPlayerJoined(Player player)
        {
            if (player.prop_APIUser_0 == null || (player.prop_APIUser_0.IsSelf && cachedPlayers.Any(user => user.id == APIUser.CurrentUser.id)))
            {
                return;
            }

            for (int i = 0; i < cachedPlayers.Count; i++)
            {
                if ((cachedPlayers[i].timeJoined - DateTime.Now).TotalHours > 0)
                {
                    cachedPlayers[i] = new CachedPlayer(cachedPlayers[i].id, cachedPlayers[i].name, null, cachedPlayers[i].timeJoined);
                }
            }

            cachedPlayers.Insert(0, new CachedPlayer(player.prop_APIUser_0.id, player.prop_APIUser_0.displayName, player.prop_APIUser_0, DateTime.Now));
        }
Example #7
0
        internal bool HasUpdated(CachedPlayer stored, CachedPlayer fetched)
        {
            if (stored.Data == null && fetched.Data != null)
            {
                return(true);
            }

            if (stored.ServerExpiration > fetched.ServerExpiration)
            {
                return(false);
            }

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

            return(HasUpdated(stored.Data, fetched.Data));
        }
Example #8
0
        internal async Task <Player?> GetAsync(string tag, CancellationToken?cancellationToken = default)
        {
            CachedPlayer result = await GetCachedPlayerAsync(tag, cancellationToken);

            return(result.Data);
        }