public async Task <List <AchievementEntity> > AddSpecialAchievements(Participant player, LookupEntity ourChampion, SummonerInfoEntity summonerInfo, Guid seasonInfoId, Match riotMatch, MatchSubmissionView view, int currentGame) { var achievements = new List <AchievementEntity>(); var teamName = "N/a"; var currentTeamId = (await _teamPlayerRepository.GetBySummonerAndSeasonIdAsync(summonerInfo.Id, seasonInfoId))?.TeamRosterId; if (currentTeamId != null) { var playerTeam = await _teamRosterRepository.GetByTeamIdAsync(currentTeamId.Value); if (playerTeam.TeamName == view.HomeTeamName || playerTeam.TeamName == view.AwayTeamName) { teamName = playerTeam.TeamName; } } if (player.Stats.LargestMultiKill >= 5) { var achivement = new AchievementEntity { Id = Guid.NewGuid(), UserId = summonerInfo.UserId, AchievedDate = DateTime.Today, AchievedTeam = teamName, Achievement = $"Penta-kill on {ourChampion.Value} in game {currentGame}" }; achievements.Add(achivement); } var blueTeamPlayers = riotMatch.Participants.Where(x => x.TeamId == 100); var redTeamPlayers = riotMatch.Participants.Where(x => x.TeamId == 200); var blueTotalKills = blueTeamPlayers.Sum(y => y.Stats.Kills); var redTotalKills = redTeamPlayers.Sum(y => y.Stats.Kills); var isBlue = player.TeamId == 100; if (isBlue && redTotalKills == 0 || !isBlue && blueTotalKills == 0) { var blueTeam = riotMatch.Teams.First(x => x.TeamId == 100); var redTeam = riotMatch.Teams.First(x => x.TeamId == 200); if (blueTeam.DragonKills == 0 && blueTeam.BaronKills == 0 && blueTeam.TowerKills == 0 && !isBlue || redTeam.DragonKills == 0 && redTeam.BaronKills == 0 && redTeam.TowerKills == 0 && isBlue) { var achivement = new AchievementEntity { Id = Guid.NewGuid(), UserId = summonerInfo.UserId, AchievedDate = DateTime.Today, AchievedTeam = teamName, Achievement = $"Perfect Game on {ourChampion.Value} in game {currentGame}" }; achievements.Add(achivement); } } try { var oldAchievements = (await _achievementRepository.GetAchievementsForUserAsync(summonerInfo.UserId)).ToList(); var tempList = new List <AchievementEntity>(achievements); foreach (var newAchievement in tempList) { var match = oldAchievements.FirstOrDefault(x => x.Equals(newAchievement)); if (match != null) { achievements.Remove(newAchievement); } } } catch (Exception) { //ignore } return(achievements); }
public async Task <PlayerProfileView> GetPlayerProfileAsync(Guid userId) { var seasonsTask = _seasonInfoRepository.GetAllSeasonsAsync(); var summonerTask = _summonerInfoRepository.ReadOneByUserIdAsync(userId); var achievementsTask = _achievementRepository.GetAchievementsForUserAsync(userId); var summoner = await summonerTask; if (summoner == null) { var message = $"User {userId} was not found."; _logger.LogError(message); throw new SummonerInfoException($"User {userId} was not found."); } var achievements = await achievementsTask; var alternateAccountsTask = _alternateAccountRepository.ReadAllForSummonerAsync(summoner.Id); var teamPlayer = (await _teamPlayerRepository.GetAllRostersForPlayerAsync(summoner.Id)).ToList(); var seasons = (await seasonsTask).OrderBy(x => x.SeasonStartDate).ToList(); var alternateAccounts = await alternateAccountsTask; var altAccountsMapped = _alternateAccountMapper.Map(alternateAccounts); var achievementViews = new List <AchievementView>(); foreach (var achievement in achievements) { var achievementView = new AchievementView(achievement); var seasonAchieved = seasons.FirstOrDefault(x => x.SeasonStartDate <achievement.AchievedDate && (x.SeasonEndDate ?? DateTime.MaxValue)> achievement.AchievedDate); achievementView.Season = seasonAchieved != null ? seasonAchieved.SeasonName : "PreSeason"; achievementViews.Add(achievementView); } var playerStatsDictionary = new Dictionary <int, PlayerStatsView>(); var matchDetails = await _matchDetailRepository.GetMatchDetailsForPlayerAsync(new List <Guid> { summoner.Id }); var statIds = matchDetails.Values.SelectMany(x => x.Select(y => y.PlayerStatsId)); var allPlayerStats = await _playerStatsRepository.GetStatsAsync(statIds); var teamname = "None"; if (teamPlayer.Any()) { var latestSeason = seasons.Last(); var team = await _teamRosterRepository.GetTeamAsync(latestSeason.Id, teamPlayer.Select(x => x.TeamRosterId)); if (team != null) { teamname = team.TeamName; } } foreach (var seasonKvp in allPlayerStats) { var season = seasons.First(x => x.Id == seasonKvp.Key.SeasonId); var seasonStats = allPlayerStats.SelectMany(x => x.Value.Where(y => y.SeasonInfoId == season.Id)); var mappedStats = _playerStatsMapper.MapForSeason(seasonStats, 0); if (int.TryParse(season.SeasonName.Split(" ").Last(), out var seasonNum)) { playerStatsDictionary.Add(seasonNum, mappedStats); } } var view = new PlayerProfileView { PlayerName = summoner.SummonerName, Rank = _tierDivisionMapper.Map(summoner.Tier_DivisionId), TeamName = string.IsNullOrEmpty(teamname) ? "None" : teamname, Achievements = achievementViews, PlayerStats = playerStatsDictionary, AlternateAccountViews = altAccountsMapped }; if (summoner.PreviousSeasonRankId != null) { view.PreviousSeasonRank = _tierDivisionMapper.Map(summoner.PreviousSeasonRankId.Value); } return(view); }