Example #1
0
        protected GameModule( IDatabase database )
            : base("{gameKey}/")
        {
            Before.AddItemToStartOfPipeline( context =>
            {
                var gameKey = (string)context.Parameters.gameKey;

                game = database.GetGameByKey( gameKey );

                context.ViewBag[ViewBagKeys.CurrentGame] = game;

                return null;
            } );
        }
Example #2
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 );
            };
        }