static void Main(string[] args) { // delete all ratings and stats Console.WriteLine("Delete all ratings"); PlayerHandler.DeleteAllPlayerSeasons(); RatingHandler.DeleteAllRatings(); // get all games in chronological order Console.WriteLine("Get games"); var games = GameHandler.GetGamesAfter(int.MinValue, SortOrder.Ascending); // calculate new ratings Console.WriteLine($"Calculate new ratings for {games.Count} games"); var completed = 0; foreach (var game in games) { Ratings.CalculateNewRatings(game); ++completed; Console.Write($"\rProgress: {completed}/{games.Count} ({completed / (double)games.Count:P1})"); } Console.WriteLine(); }
public IEnumerable <Head2HeadRecord> GetHead2HeadRecords( [FromRoute(Name = "player")] string playerName, [FromRoute(Name = "season")] string seasonName) { var player = PlayerHandler.GetPlayerByName(playerName); var season = SeasonHandler.GetSeason(seasonName); if (player == null || season == null) { return(new Head2HeadRecord[0]); } var games = GameHandler .GetGamesByPlayer(playerName, SortOrder.Descending) .FindAll(g => season.IsActive(g.Created)); var ratings = RatingHandler.GetRatingsByPlayerAndSeason(player, season) .Where(pr => pr.GameId != null) .ToDictionary(pr => pr.GameId); return(games .SelectMany(g => g.Scores.Where(gs => gs.Player.Name != playerName)) .GroupBy(gs => gs.Player) // group by opponent .Select(g => new Head2HeadRecord { Opponent = g.Key.Name, Wins = g.Count(gs => gs.Loss), // player's wins are losses for opponent Losses = g.Count(gs => gs.Win), // player's losses are wins for opponent RatingChange = Math.Round(g.Sum(gs => ratings[gs.GameId].RatingChange)) // summing player's rating changes }) .OrderBy(h2h => h2h.Opponent)); }
public bool DeleteGame(int id) { try { // get the game var game = GameHandler.GetGame(id); if (game == null) { throw new ArgumentException("No such game"); } // delete the game (incl game scores and player ratings) GameHandler.DeleteGame(game); // delete ratings from later games RatingHandler.DeleteRatingsAfter(game.PlayerRatings[0].Id, deleteDefaultRatings: false); // reset current ratings in PlayerSeasons var lastPlayerRatings = RatingHandler.GetLatestRatingsPerPlayerSeason(); var updatedPlayerSeasons = lastPlayerRatings .Where(pr => !pr.PlayerSeason.Season.HasEnded(game.Created)) // current and future seasons .Select(pr => { var playerSeason = pr.PlayerSeason; playerSeason.Season = null; playerSeason.Rating = pr.Rating; playerSeason.RatingChange = pr.RatingChange; playerSeason.Wins = pr.Wins; playerSeason.Losses = pr.Losses; playerSeason.CurrentStreak = pr.CurrentStreak; return(playerSeason); }) .ToList(); PlayerHandler.UpdatePlayerSeasons(updatedPlayerSeasons.Where(ps => ps.GamesPlayed > 0)); PlayerHandler.DeletePlayerSeasons(updatedPlayerSeasons.Where(ps => ps.GamesPlayed == 0)); // get all games after the deleted game var games = GameHandler.GetGamesAfter(game.Id, SortOrder.Ascending); // recalculate ratings games.ForEach(g => Ratings.CalculateNewRatings(g)); // delete players with no games var players = PlayerHandler.GetAllPlayers() .Where(p => p.Seasons.Count == 0); PlayerHandler.DeletePlayers(players); return(true); } catch (Exception /*ex*/) { return(false); } }
private static PlayerSeason GetOrCreatePlayerSeason(Player player, Season season) { var playerSeason = player.Seasons.Find(ps => ps.SeasonId == season.Id); if (playerSeason == null) { playerSeason = PlayerHandler.AddPlayerSeason(new PlayerSeason { PlayerId = player.Id, SeasonId = season.Id }); // add default rating RatingHandler.AddRating(playerSeason.CreatePlayerRating()); } return(playerSeason); }
public static void CalculateNewRatings(Game game) { // fetch players from database var winningPlayer = PlayerHandler.GetPlayerById(game.WinningGameScore.PlayerId); var losingPlayer = PlayerHandler.GetPlayerById(game.LosingGameScore.PlayerId); // fetch active seasons var activeSeasons = SeasonHandler.GetActiveSeasons(game.Created); foreach (var season in activeSeasons) { var winningPlayerSeason = GetOrCreatePlayerSeason(winningPlayer, season); var losingPlayerSeason = GetOrCreatePlayerSeason(losingPlayer, season); // convert to Elo.Lib.Players and calculate new ratings var winner = winningPlayerSeason.ToEloLibPlayer(); var loser = losingPlayerSeason.ToEloLibPlayer(); winner.WinsAgainst(loser); // update current ratings winningPlayerSeason.RatingChange = winner.Rating - winningPlayerSeason.Rating; winningPlayerSeason.Rating = winner.Rating; ++winningPlayerSeason.Wins; winningPlayerSeason.CurrentStreak = Math.Max(winningPlayerSeason.CurrentStreak + 1, 1); losingPlayerSeason.RatingChange = loser.Rating - losingPlayerSeason.Rating; losingPlayerSeason.Rating = loser.Rating; ++losingPlayerSeason.Losses; losingPlayerSeason.CurrentStreak = Math.Min(losingPlayerSeason.CurrentStreak - 1, -1); // add new ratings var winningPlayerRating = winningPlayerSeason.CreatePlayerRating(game.Id); var losingPlayerRating = losingPlayerSeason.CreatePlayerRating(game.Id); // update database PlayerHandler.UpdatePlayerSeasons(winningPlayerSeason, losingPlayerSeason); RatingHandler.AddRatings(winningPlayerRating, losingPlayerRating); } }
public void Beforetest() { _ratingHandler = new RatingHandler(); }
public ReviewController(VideoAssignHandler assignHandler, RatingHandler ratingHandler, CategoryHandler categoryHandler) { this.assignHandler = assignHandler; this.ratingHandler = ratingHandler; this.categoryHandler = categoryHandler; }