private MessageResult RollbackGame(Command command, Match args) { var leagueName = args.Group("league"); var gamesPersistence = new ListPersistenceApi <Game>(m_Persistence, "games." + leagueName); var existingGames = gamesPersistence.ReadList(); var lastGame = existingGames.Last(); gamesPersistence.RemoveFromList(x => x.Id == lastGame.Id); existingGames = gamesPersistence.ReadList(); var league = GetCurrentLeague(existingGames); // Wipe the leaderboard var playersPersistence = new HashPersistenceApi <int>(m_Persistence, "players." + leagueName); playersPersistence.Clear(); // Recalculate var leaderboard = league.GetLeaderBoard(m_EloScoringStrategy).ToList(); foreach (var player in leaderboard.Select(x => x.Name)) { var newRanking = GetRatingForPlayer(leaderboard, player); playersPersistence.Set(player, int.Parse(newRanking.ToString())); } return(new MessageResult(new List <Response>() { Response.ToMessage(command, "Successfully rolled back the last game") })); }
private MessageResult GetLeaderboard(Command command, Match args) { var responses = new List <Response>(); var league = args.Group("league"); var playersPersistence = new HashPersistenceApi <int>(m_Persistence, "players." + league); var position = 0; var players = playersPersistence.GetKeys(); if (!players.Any()) { return(Response.ToMessage(command, string.Format("No games found for league `{0}`", league))); } foreach (var playerRating in players .Select(x => new PlayerRating(x, playersPersistence.Get(x))) .OrderByDescending(x => x.Rating)) { position++; var name = m_AliasList.GetDisplayNameFor(playerRating.Name); responses.Add(Response.ToMessage(command, string.Format("{0}: *{1}* (rating {2})", position, name, playerRating.Rating))); } return(new MessageResult(responses)); }
private MessageResult RecordGame(Command command, Match args) { // TODO: try and break up this method a bit more var resultsString = args.Group("results"); var gameResults = ParseGameResults(resultsString); //Console.WriteLine(String.Join("\n", gameResults.Select(x => $"{x.Player} {x.Position}"))); if (!gameResults.Any()) { if (String.IsNullOrWhiteSpace(resultsString)) { return(Response.ToMessage(command, "Please provide some game results")); } return(Response.ToMessage(command, string.Format("Could not parse results `{0}`", resultsString))); } var responses = new List <Response>(); var leagueName = args.Group("league"); var gamesPersistence = new ListPersistenceApi <Game>(m_Persistence, "games." + leagueName); var existingGames = gamesPersistence.ReadList(); var league = GetCurrentLeague(existingGames); var playersPersistence = new HashPersistenceApi <int>(m_Persistence, "players." + leagueName); var playerNames = playersPersistence.GetKeys(); if (!existingGames.Any()) { responses.Add(Response.ToMessage(command, string.Format("Creating new league `{0}`", leagueName))); } gameResults = GetCanonicalPlayerNames(gameResults, playerNames); var newPlayers = FindNewPlayers(gameResults, playerNames); responses.AddRange(newPlayers.Select(x => Response.ToMessage(command, string.Format("Adding new player *{0}*", m_AliasList.GetDisplayNameFor(x))))); var nextId = existingGames.Count != 0 ? existingGames.Max(x => x.Id) + 1 : 1; var newGame = new Game(gameResults, nextId); gamesPersistence.AddToList(newGame); league.RecordGame(GetPlayerRankGame(newGame)); var leaderboardHistory = league.GetLeaderBoardHistory(m_EloScoringStrategy).ToList(); var totalGames = leaderboardHistory.Count; var latestLeaderboard = leaderboardHistory[totalGames - 1].Leaderboard.ToList(); var leaderboardChanges = ResultChangeStats.GetResultChangesBewteenGames( leaderboardHistory, totalGames, totalGames > 1 ? totalGames - 1 : 1); foreach (var player in newGame.Results.Select(x => x.Player)) { var newRanking = GetRatingForPlayer(latestLeaderboard, player); playersPersistence.Set(player, int.Parse(newRanking.ToString())); } var rankingChanges = GetResultsWithRankingChanges(leaderboardChanges); responses.AddRange(rankingChanges.Select(x => Response.ToMessage(command, x))); return(new MessageResult(responses)); }