private CompetitionPosition[] PositionFinalPlayersInCompetition(CompetitionDetails details, CompetitionPlayer[] players) { var positioningEngine = new FinalPositioningEngine(); var positioningParameters = new FinalPositioningParameters { QualifyingToFinal = details.Type.QualifyingToFinalPlayersCount, Players = (from p in players select new Simple.SAMS.CompetitionEngine.Player { Id = p.Id, Rank = p.CompetitionRank, AccumulatedScore = p.AccumulatedScore.GetValueOrDefault(), AverageScore = p.AverageScore.GetValueOrDefault() }).ToArray<Simple.SAMS.CompetitionEngine.Player>() }; return positioningEngine.Evaluate(positioningParameters); }
private static Contracts.Players.CompetitionPlayer MapDataCompetitionPlayer(CompetitionPlayer dataEntity, int competitionId) { var entity = new Contracts.Players.CompetitionPlayer(); AutoMapper.Mapper.DynamicMap(dataEntity.Player, entity); entity.CompetitionRank = dataEntity.Rank.GetValueOrDefault(); entity.AccumulatedScore = dataEntity.Player.AccumulatedScore; entity.AverageScore = dataEntity.Player.AverageScore; entity.Replaceable = dataEntity.Player.Matches.Count( m => m.CompetitionId == competitionId && m.Status >= (int)MatchStatus.Playing) == 0; entity.Source = (CompetitionPlayerSource)dataEntity.Source; entity.Section = (CompetitionSection)dataEntity.Section; entity.Status = (CompetitionPlayerStatus)dataEntity.Status.GetValueOrDefault((int)CompetitionPlayerStatus.Active); entity.Points = dataEntity.Points; entity.Position = dataEntity.Position; return(entity); }
private void UpdatePlayerForTeam(Team team, Uri uri, string role) { try { var responseString = Client.GetStringAsync(uri).Result; if (responseString == null) { return; } HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(responseString); var playerName = doc.DocumentNode.SelectSingleNode("//h1")?.InnerText.Replace(" ", "").Trim(); if (playerName == null) { return; } var player = _dbContext.CompetitionPlayers.FirstOrDefault(p => p.Nickname == playerName); if (player == null) { player = new CompetitionPlayer(); _dbContext.CompetitionPlayers.Add(player); } player.Role = (Role)Enum.Parse(typeof(Role), role, true); player.Team = team; player.Nickname = playerName; Console.WriteLine($"Parsing player {player.Nickname} for team {player.Team.Name} in role {player.Role}"); PopulatePlayerStats(doc, player); } catch (Exception ex) { Log.Logger.Error($"Error updating player for team {team.Name} {ex.Message}"); } }
private void SaveSchedule(MatchHeaderInfo[] matches, CompetitionPlayer[] players, string schedulePath) { var playersMap = new Dictionary<int, int>(); var index = 1; foreach (var player in players) { playersMap[player.Id] = index++; } var items = new List<MatchScheduleInfo>(); index = 1; foreach (var match in matches) { var matchSchedule = new MatchScheduleInfo(); matchSchedule.Id = "M" + index++; if (match.Player1 != null) { matchSchedule.Player1 = playersMap[match.Player1.Id]; } else if (match.Player1 == null || match.Player1Code == "BYE") { matchSchedule.Player1 = players.Length+1; } if (match.Player2 != null) { matchSchedule.Player2 = playersMap[match.Player2.Id]; } else if (match.Player2 == null || match.Player2Code == "BYE") { matchSchedule.Player2 = players.Length+1; } if (match.Winner != MatchWinner.None) { matchSchedule.Winner = (int) match.Winner; } matchSchedule.Player1Points = 0; matchSchedule.Player2Points = 0; matchSchedule.SetScores = match.SetScores; //matchSchedule.SetScores = new[] // { // new SetScore() // { // Player1Points = 7, // Player2Points = 5, // }, // new SetScore() // { // Player1Points = 2, // Player2Points = 6, // }, // new SetScore() // { // Player1Points = 0, // Player2Points = 6, // }, // }; items.Add(matchSchedule); } MatchScheduleInfo.Write(items.ToArray(), schedulePath); }
private void SavePlayers(CompetitionPlayer[] players, string playersPath, HebrewWordInverter inverter) { File.WriteAllLines(playersPath, players.Select(p=>string.Format("{0};;;", inverter.Invert(p.FullName)))); }
private void PopulatePlayerStats(HtmlDocument doc, CompetitionPlayer player) { var tables = doc.DocumentNode.SelectNodes("//table[contains(@class,'table_list')]"); if (tables == null) { return; } List <Task> tasks = new List <Task>(); foreach (var table in tables) { try { if (table.InnerText.Contains("General stats")) { var columns = table.SelectNodes(".//td"); tasks.Add(Task.Factory.StartNew(() => { for (int i = 0; i < columns.Count - 1; i += 2) { if (columns[i].InnerText.Contains("Record") && columns[i + 1].InnerText != "-") { var winrateArr = columns[i + 1].InnerText.Replace("W", "").Replace("L", "").Split(" - "); var wins = int.Parse(winrateArr[0].Trim()); var losses = int.Parse(winrateArr[1].Trim()); player.Wins = wins; player.Losses = losses; if (wins + losses > 0) { var winrate = (int)(((double)wins / (double)(wins + losses)) * 100); player.Winrate = winrate; } continue; } if (columns[i].InnerText.Contains("KDA") && columns[i + 1].InnerText != "-") { try { player.KDA = float.Parse(columns[i + 1].InnerText, CultureInfo.InvariantCulture); } catch { Log.Logger.Error($"Could not parse KDA for player {player.Nickname}, KDA {columns[i + 1].InnerText}"); } } if (columns[i].InnerText.Contains("CS per Minute") && columns[i + 1].InnerText != "-") { player.CSPM = float.Parse(columns[i + 1].InnerText, CultureInfo.InvariantCulture); continue; } if (columns[i].InnerText.Contains("Gold Per Minute") && columns[i + 1].InnerText != "-") { player.GPM = float.Parse(columns[i + 1].InnerText, CultureInfo.InvariantCulture); continue; } if (columns[i].InnerText.Contains("Gold%") && columns[i + 1].InnerText != "-") { player.GoldPercent = float.Parse(columns[i + 1].InnerText.Replace("%", "").Trim(), CultureInfo.InvariantCulture); continue; } if (columns[i].InnerText.Contains("Kill Participation") && columns[i + 1].InnerText != "-") { player.KillParticipationPercent = float.Parse(columns[i + 1].InnerText.Replace("%", "").Trim(), CultureInfo.InvariantCulture); continue; } } })); } if (table.InnerText.Contains("Early game")) { var columns = table.SelectNodes(".//td"); tasks.Add(Task.Factory.StartNew(() => { for (int i = 0; i < columns.Count - 1; i += 2) { if (columns[i].InnerText.Contains("Ahead in CS at 15 min") && columns[i + 1].InnerText != "-") { var percentString = columns[i + 1].InnerText.Replace("%", "").Trim().Replace(" ", "").Trim(); player.AheadInCSAt15MinPercent = float.Parse(percentString, CultureInfo.InvariantCulture); continue; } if (columns[i].InnerText.Contains("CS Differential at 15 min") && columns[i + 1].InnerText != "-") { player.CSDifferenceAt15Min = float.Parse(columns[i + 1].InnerText, CultureInfo.InvariantCulture); continue; } if (columns[i].InnerText.Contains("Gold Differential at 15 min") && columns[i + 1].InnerText != "-") { player.GoldDifferenceAt15Min = float.Parse(columns[i + 1].InnerText, CultureInfo.InvariantCulture); continue; } if (columns[i].InnerText.Contains("XP Differential at 15 min") && columns[i + 1].InnerText != "-") { player.XPDifferenceAt15Min = float.Parse(columns[i + 1].InnerText, CultureInfo.InvariantCulture); continue; } if (columns[i].InnerText.Contains("First Blood Participation") && columns[i + 1].InnerText != "-") { player.FirstBloodParticipationPercent = float.Parse(columns[i + 1].InnerText.Replace("%", "").Trim(), CultureInfo.InvariantCulture); continue; } if (columns[i].InnerText.Contains("First Blood Victim") && columns[i + 1].InnerText != "-") { player.FirstBloodVictimPercent = float.Parse(columns[i + 1].InnerText.Replace("%", "").Trim(), CultureInfo.InvariantCulture); continue; } } })); } if (table.InnerText.Contains("Aggression")) { var columns = table.SelectNodes(".//td"); tasks.Add(Task.Factory.StartNew(() => { for (int i = 0; i < columns.Count - 1; i += 2) { if (columns[i].InnerText.Contains("Damage Per Minute") && columns[i + 1].InnerText != "-") { player.DamagePerMinute = float.Parse(columns[i + 1].InnerText, CultureInfo.InvariantCulture); continue; } if (columns[i].InnerText.Contains("Damage%") && columns[i + 1].InnerText != "-") { player.DamagePercent = float.Parse(columns[i + 1].InnerText.Replace("%", "").Trim(), CultureInfo.InvariantCulture); continue; } } })); } if (table.InnerText.Contains("Vision")) { var columns = table.SelectNodes(".//td"); tasks.Add(Task.Factory.StartNew(() => { for (int i = 0; i < columns.Count - 1; i += 2) { if (columns[i].InnerText.Contains("Vision score Per Minute") && columns[i + 1].InnerText != "-") { player.VisionScorePerMinute = float.Parse(columns[i + 1].InnerText, CultureInfo.InvariantCulture); continue; } } })); } } catch (Exception ex) { Log.Logger.Error($"Error parsing Player column! PlayerName: {player.Nickname}", ex); } } Task.WaitAll(tasks.ToArray()); }
private CompetitionPosition[] PositionQualifyingPlayers(CompetitionDetails details, CompetitionPlayer[] qualifyingPlayers) { var qualifyingPositioningEngine = new QualifyingPositioningEngine(); var qualifyingPositioningParameters = new QualifyingPositionParameters { PlayersCount = details.Type.QualifyingPlayersCount, QualifyingCount = details.Type.QualifyingToFinalPlayersCount, Players = (from p in qualifyingPlayers.Take<CompetitionPlayer>(details.Type.QualifyingPlayersCount) select new Simple.SAMS.CompetitionEngine.Player { Id = p.Id, Rank = p.CompetitionRank, AverageScore = p.AverageScore.GetValueOrDefault(), AccumulatedScore = p.AccumulatedScore.GetValueOrDefault() }).ToArray<Simple.SAMS.CompetitionEngine.Player>() }; return qualifyingPositioningEngine.Evaluate(qualifyingPositioningParameters); }