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)); }
public Task <IEnumerable <PlayerStatsModel> > GetPlayersStatsModel(string userId, int count, int skip, SortForPlayerStats sort) => GetPlayersStatsModelInner(userId, count, skip, sort);
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); }