Example #1
0
        public MatchupModule( IDatabase database, Settings settings, IEnumerable<IMatchupProposer> proposers )
            : base(database)
        {
            this.proposers = proposers.ToArray();

            Get[Route.FindTeams] = o =>
            {
                var model = new FindTeamsModel()
                {
                    Game = game,
                    AvailablePlayers = database.GetPlayersForGame( game.Id ).OrderBy( player => player.Name ).ToArray(),
                    AlgorithmName = App.MatchupProposer.GetType().Name,
                };

                return View[Route.FindTeams, model];
            };

            Get[Route.SetMatchupProposer] = o =>
            {
                var model = new SetMatchupProposerViewModel( proposers, App.MatchupProposer );

                return View[Route.SetMatchupProposer, model];
            };

            Post[Route.SetMatchupProposer] = o =>
            {
                var request = this.Bind<SetMatchupProposerRequest>();

                var matchupProposer = GetAlgorithm( request.SelectedAlgorithmTypeName );

                App.MatchupProposer = matchupProposer;

                return Response.AsRedirect( Route.FindTeams );
            };

            Get[Route.GetProposedMatchups] = o =>
            {
                var request = this.Bind<GetProposedMatchupsRequest>();

                var proposer = App.MatchupProposer;

                var response = new GetProposedMatchupsResponse();

                try
                {
                    var gameKey = (string)o.gameKey;
                    var game = database.GetGameByKey( gameKey );

                    if ( null == request.PlayerIds || request.PlayerIds.Count < 2 )
                    {
                        throw new Exception( "Two or more players must be selected" );
                    }
                    var players = request.PlayerIds.Select( database.GetUserById ).ToArray();

                    var proposedMatchups = proposer.GetMatchups( game, players ).OrderBy( matchup => matchup.Imbalance ).ToArray();
                    proposedMatchups = CleanUp( proposedMatchups );

                    response.ProposedMatchups = proposedMatchups;
                }
                catch ( Exception e )
                {
                    response.ErrorMessage = e.Message;
                }

                return View[Route.GetProposedMatchups, response];
            };

            Post[Route.PresentMatchupForSaving] = o =>
            {
                var json = (string)Request.Form.matchup;
                var matchup = json.FromJson<ProposedMatchup>();

                return View[Route.SaveMatchupResult, new SaveMatchupResultViewModel(matchup, database.GetMaps(matchup.Game.Id))];
            };

            Post[Route.SaveMatchupResult] = o =>
            {
                var result = this.Bind<MatchupResult>();
                database.SaveMatchupResult( result );

                return Response.AsRedirect( Route.ViewResults );
            };

            Get[Route.ViewResults] = o =>
            {
                var game = database.GetGameByKey( o.gameKey );
                var matchupResults = database.GetMatchupResultsByGame( game.Id );
                var userMap = new IdentityMap<User>( database.GetUserById );

                var model = new List<MatchupResultViewModel>();
                foreach ( var matchupResult in matchupResults )
                {
                    var map = database.GetMapById(matchupResult.MapId);
                    model.Add(new MatchupResultViewModel(matchupResult, userMap, map));
                }

                return View[Route.ViewResults, model];
            };

            Get[Route.SelectPlayers] = o =>
            {
                var model = new SelectPlayersViewModel();

                var users = database.GetUsers();
                var playersForGame = database.GetPlayersForGame( this.game.Id );

                foreach ( var user in users )
                {
                    model.SelectableUsers.Add( new Selectable<User>
                    {
                        Item = user,
                        IsSelected = playersForGame.Any( user1 => user1.Id == user.Id ),
                    } );
                }

                return View[Route.SelectPlayers, model];
            };

            Post[Route.SelectPlayers] = o =>
            {
                var request = this.Bind<SelectPlayersRequest>();

                database.SetActivePlayersForGame( game.Id, request.UserIds );

                return Response.AsRedirect( Route.FindTeams );
            };
        }
Example #2
0
        public PlayerRatingsModule( IDatabase database )
            : base(database)
        {
            this.database = database;
            ratingsHelper = new RatingsHelper(database, App.Settings);

            Get[Route.RatePlayers] = o =>
            {
                this.RequiresAuthentication();

                // TODO: If player doesn't currently play this game, set them as actively playing this game?

                var model = new RatePlayersViewModel
                {
                    GameId = game.Id,
                    UserId = ( (UserIdentity)Context.CurrentUser ).UserId
                };

                var players = database.GetPlayersForGame( game.Id ).OrderBy(user => user.Name);

                foreach ( var player in players )
                {
                    var rating = database.GetMostRecentPlayerRating( game.Id, player.Id, model.UserId );

                    model.Players.Add(new RatePlayerViewModel()
                    {
                        CurrentRating = null != rating && rating.Rating.HasValue ? rating.Rating.Value : 0,
                        LastUpdate = null != rating ? rating.Timestamp : (DateTime?)null,
                        PlayerId = player.Id,
                        PlayerName = player.Name,
                    });
                }

                return View[Route.RatePlayers, model];
            };

            Get[Route.AddPlayerRating] = o =>
            {
                this.RequiresAuthentication();

                try
                {
                    var playerRating = this.Bind<PlayerRating>();
                    playerRating.GameId = game.Id;
                    playerRating.Rating = playerRating.Rating == 0 ? null : playerRating.Rating;

                    database.AddPlayerRating( playerRating );

                    return HttpStatusCode.OK;
                }
                catch ( Exception exception )
                {
                    var response = new StringResponse(exception.Message);
                    response.StatusCode = HttpStatusCode.InternalServerError;
                    return response;
                }
            };

            Get[Route.ViewPlayerRatings] = o =>
            {
                var model = new ViewPlayerRatingsViewModel();
                var gameId = game.Id;

                var players = database.GetPlayersForGame( gameId );

                foreach ( var player in players )
                {
                    var ratings = database.GetPlayerRatings( gameId, player.Id );

                    var average = ratingsHelper.CalculateAverageRating( ratings, DateTime.Now );

                    var winLossRecord = GetWinLossRecord( player.Id );

                    model.PlayerAverageRatings.Add( new PlayerAverageRating()
                    {
                        PlayerName = player.Name,
                        AverageRating = average,
                        RatingHistory = GetRatingHistory(gameId, player.Id),
                        WinLossRecord = winLossRecord,
                    });
                }

                var linkProposer = new LinkMatchupProposer(database);

                model.LinkedPlayers = linkProposer.GetAllLinks(gameId);

                return View[Route.ViewPlayerRatings, model];
            };

            Get["getlinkedplayers"] = o =>
                {
                    var linkProposer = new LinkMatchupProposer(database);
                    var stream = new MemoryStream();
                    var serializer = new DataContractJsonSerializer(typeof (List<LinkedPlayer>));
                    serializer.WriteObject(stream, linkProposer.GetAllLinks(game.Id));
                    stream.Position = 0;
                    var reader = new StreamReader(stream);

                    var json = reader.ReadToEnd();

                    var response = (Response)json;

                    response.ContentType = "application/json";

                    return response;

                };
        }