private void QualifyToThirdPlace(MatchHeaderInfo match) { var positioningEngine = GetPositioningEngine(CompetitionMethod.Knockout); var competitionRepository = ServiceProvider.Get <ICompetitionRepository>(); var competitionDetails = competitionRepository.GetCompetitionDetails(match.CompetitionId); var looserId = (match.Winner == MatchWinner.Player1 ? match.Player2 : match.Player1).Id; var thirdPlaceMatch = competitionDetails.Matches.Where(m => m.Section == CompetitionSection.Final).OrderBy(m => m.Position).Last(); var updateInfo = new UpdatePlayerPositionInfo() { PlayerId = looserId, Position = thirdPlaceMatch.Player1.IsNull() ? 0 : 1, MatchId = thirdPlaceMatch.Id }; var competitionMatchesRepository = ServiceProvider.Get <ICompetitionMatchesRepository>(); competitionMatchesRepository.UpdatePlayersPosition(match.CompetitionId, new[] { updateInfo }); }
private void QualifyToConsolation(MatchHeaderInfo match) { var playersCount = 32; var competitionMatchesRepository = ServiceProvider.Get <ICompetitionMatchesRepository>(); var round = 0; var rounds = competitionMatchesRepository.GetCompetitionSectionRounds(match.CompetitionId, CompetitionSection.Final); var qualifyToMatch = default(MatchHeaderInfo); if (match.Round == (6 - rounds)) { qualifyToMatch = competitionMatchesRepository.GetMatchByRelativePosition(match.CompetitionId, CompetitionSection.Consolation, round, match.Position / 2); } else { var map = new ConsolationMap(); var position = map.Position(playersCount, match.Position); qualifyToMatch = competitionMatchesRepository.GetMatchByPosition(match.CompetitionId, CompetitionSection.Consolation, position); } var looser = (match.Winner == MatchWinner.Player1 ? match.Player2 : match.Player1); if (looser != null && qualifyToMatch != null) { var roundMatchesCount = competitionMatchesRepository.GetRoundMatchesCount(match.CompetitionId, CompetitionSection.Consolation, qualifyToMatch.Round); var updatePlayerInfo = new UpdatePlayerPositionInfo() { MatchId = qualifyToMatch.Id, PlayerId = looser.Id, Position = match.Round == (6 - rounds) ? (qualifyToMatch.Player1 == null? 0 : 1) : (qualifyToMatch.RoundRelativePosition < roundMatchesCount / 2 ? 1 : 0) }; competitionMatchesRepository.UpdatePlayersPosition(match.CompetitionId, new[] { updatePlayerInfo }); } }
public UpdatePlayerPositionInfo AddPlayerToSection(int playerId, CompetitionSection section, CompetitionDetails details) { var result = default(UpdatePlayerPositionInfo); // rounds are in descending order, so first will be the max var maxRound = details.Matches.Where(m => m.Section == section).Max(m => m.Round); var match = details.Matches.FirstOrDefault( m => m.Section == section && m.Round == 1 && (m.Player1.IsNull() || m.Player2.IsNull())); if (match.IsNotNull()) { result = new UpdatePlayerPositionInfo(); result.MatchId = match.Id; result.PlayerId = playerId; result.Position = match.Player1.IsNull() ? 0 : 1; } return(result); }
public void PositionPlayerInSection(int competitionId, int playerId, CompetitionSection section, string matchCode = null) { var positioningEngine = GetPositioningEngine(CompetitionMethod.Knockout); var competitionRepository = ServiceProvider.Get <ICompetitionRepository>(); var competitionDetails = competitionRepository.GetCompetitionDetails(competitionId); var updatePlayerInfo = new UpdatePlayerPositionInfo(); if (matchCode.NotNullOrEmpty()) { foreach (var match in competitionDetails.Matches) { if (match.Player1Code == matchCode) { updatePlayerInfo.PlayerId = playerId; updatePlayerInfo.MatchId = match.Id; updatePlayerInfo.Position = 0; } else if (match.Player2Code == matchCode) { updatePlayerInfo.PlayerId = playerId; updatePlayerInfo.MatchId = match.Id; updatePlayerInfo.Position = 1; } } } else { updatePlayerInfo = positioningEngine.AddPlayerToSection(playerId, section, competitionDetails); } if (updatePlayerInfo.IsNotNull()) { var competitionMatchesRepository = ServiceProvider.Get <ICompetitionMatchesRepository>(); competitionMatchesRepository.UpdatePlayersPosition(competitionId, new[] { updatePlayerInfo }); } }
private static IEnumerable <UpdatePlayerPositionInfo> GetUpdatePlayerPositionInfos(CompetitionPosition[] qualifyingPlayersPositions, MatchHeaderInfo[] orderedMatches) { var matchIndex = 0; var positionIndex = 0; var results = qualifyingPlayersPositions.Select(position => { var result = default(UpdatePlayerPositionInfo); if (position.PlayerId.HasValue) { result = new UpdatePlayerPositionInfo { PlayerId = position.PlayerId.Value, MatchId = orderedMatches[matchIndex].Id, Position = positionIndex % 2 }; } positionIndex++; if ((positionIndex % 2) == 0) { matchIndex++; } return(result); }); return(results); }