public async Task <IActionResult> PlayersStats(int count = 10, int skip = 0, SortForPlayerStats sort = SortForPlayerStats.None)
        {
            var totalCount = await _statsService.GetTotalPlayers(UserId);

            var(newCount, newSkip) = CorrectPaginationForPlayers(totalCount, count, skip);

            if (count != newCount || skip != newSkip)
            {
                return(RedirectToAction(nameof(PlayersStats), new { count = newCount, skip = newSkip }));
            }

            var playersStatsModelList = await _statsService.GetPlayersStatsModel(UserId, count, skip, sort);

            var containerForPlayersStats = new ContainerForPlayersStats
            {
                ListPlayerStatsModelView = playersStatsModelList.Select(model => new PlayerStatsModelView
                {
                    Player               = model.Player,
                    Matches              = model.Matches,
                    Completed            = model.Completed,
                    Won                  = model.Won,
                    Lost                 = model.Lost,
                    AggregatedMatchStats = model.AggregatedMatchStats
                }).ToList(),

                Count        = count,
                Skip         = skip,
                Sort         = sort,
                TotalPlayers = await _statsService.GetTotalPlayers(UserId)
            };

            return(View(containerForPlayersStats));
        }
Exemple #2
0
 public Task <IEnumerable <PlayerStatsModel> > GetPlayersStatsModel(string userId, int count, int skip, SortForPlayerStats sort) =>
 GetPlayersStatsModelInner(userId, count, skip, sort);
Exemple #3
0
        public async Task <IEnumerable <PlayerStatsModel> > GetPlayersStatsModelInner(string userId,
                                                                                      int count, int skip, SortForPlayerStats sort, string player = null, string playerUserId = null)
        {
            var players = player == null ? null : Enumerable.Repeat(player, 1);

            var total = await _matchListService.GetMatchCount(userId, players);

            var mathes = await _matchListService.GetMatches(userId, total == 0? 1 : total, 0, players);

            var result = new Dictionary <string, PlayerStatsModel>();

            foreach (var matchInfo in mathes)
            {
                var matchService = await _matchListService.GetMatchService(userId, matchInfo.MatchId);

                var matchState = await matchService.GetStateAsync();

                if (matchState.State != MatchState.NotStarted)
                {
                    var playersStats = await matchService.GetPlayersMatchStats();

                    if (((player == null || matchInfo.FirstPlayer == player) && playerUserId == null) ||
                        (playerUserId != null && matchState.FirstPlayerUserId == playerUserId))
                    {
                        var firstPlayerCurrentStats = new PlayerStatsModel
                        {
                            Player               = matchInfo.FirstPlayer,
                            Matches              = 1,
                            Completed            = matchInfo.State == MatchState.Completed ? 1 : 0,
                            Won                  = matchInfo.Winner == Player.First ? 1 : 0,
                            Lost                 = matchInfo.Winner == Player.Second ? 1 : 0,
                            AggregatedMatchStats = playersStats.FirstPlayer
                        };
                        if (matchInfo.FirstPlayer != null)
                        {
                            result[matchInfo.FirstPlayer] = result.TryGetValue(matchInfo.FirstPlayer, out var firstPlayerOldStats)
                                ? firstPlayerOldStats + firstPlayerCurrentStats
                                : firstPlayerCurrentStats;
                        }
                    }

                    if (((player == null || matchInfo.SecondPlayer == player) && playerUserId == null) ||
                        (playerUserId != null && matchState.SecondPlayerUserId == playerUserId))
                    {
                        var secondPlayerCurrentStats = new PlayerStatsModel
                        {
                            Player               = matchInfo.SecondPlayer,
                            Matches              = 1,
                            Completed            = matchInfo.State == MatchState.Completed ? 1 : 0,
                            Won                  = matchInfo.Winner == Player.Second ? 1 : 0,
                            Lost                 = matchInfo.Winner == Player.First ? 1 : 0,
                            AggregatedMatchStats = playersStats.SecondPlayer
                        };

                        if (matchInfo.SecondPlayer != null)
                        {
                            result[matchInfo.SecondPlayer] = result.TryGetValue(matchInfo.SecondPlayer, out var secondPlayerOldStats)
                                ? secondPlayerOldStats + secondPlayerCurrentStats
                                : secondPlayerCurrentStats;
                        }
                    }
                }
            }

            return(result.Values.BySortForPlayerStats(sort).Skip(skip).Take(count));
        }
        public static IEnumerable <PlayerStatsModel> BySortForPlayerStats(this IEnumerable <PlayerStatsModel> source, SortForPlayerStats sort)
        {
            if (sort == SortForPlayerStats.None)
            {
                return(source.OrderBy(playerStats => playerStats.Player));
            }

            if (sort == SortForPlayerStats.PlayerNameAscending)
            {
                return(source.OrderBy(playerStats => playerStats.Player));
            }
            if (sort == SortForPlayerStats.PlayerNameDescending)
            {
                return(source.OrderByDescending(playerStats => playerStats.Player));
            }
            if (sort == SortForPlayerStats.MatchesDescending)
            {
                return(source.OrderBy(playerStats => playerStats.Matches));
            }
            if (sort == SortForPlayerStats.MatchesAscending)
            {
                return(source.OrderByDescending(playerStats => playerStats.Matches));
            }
            if (sort == SortForPlayerStats.CompletedDescending)
            {
                return(source.OrderBy(playerStats => playerStats.Completed));
            }
            if (sort == SortForPlayerStats.CompletedAscending)
            {
                return(source.OrderByDescending(playerStats => playerStats.Completed));
            }
            if (sort == SortForPlayerStats.WonDescending)
            {
                return(source.OrderBy(playerStats => playerStats.Won));
            }
            if (sort == SortForPlayerStats.WonAscending)
            {
                return(source.OrderByDescending(playerStats => playerStats.Won));
            }
            if (sort == SortForPlayerStats.LostDescending)
            {
                return(source.OrderBy(playerStats => playerStats.Lost));
            }
            if (sort == SortForPlayerStats.LostAscending)
            {
                return(source.OrderByDescending(playerStats => playerStats.Lost));
            }

            return(source);
        }