Example #1
0
        public Task Handle(OnMoveNotification request, CancellationToken cancellationToken)
        {
            var lastMoveDate = _mediator.Send(new GetLastMoveDateMessage(request.ViewModel)).Result;

            var blackConnection = GetClientConnection(request.ViewModel.BlackPlayerID);
            var whiteConnection = GetClientConnection(request.ViewModel.WhitePlayerID);

            if (request.ViewModel.BlackPlayerID != ComputerPlayer.ComputerPlayerID && blackConnection != null)
            {
                _signalRHub.Clients.Client(blackConnection).SendAsync("UpdateBoard", request.ViewModel.ID, lastMoveDate,
                                                                      ComponentGenerator.GetBoard(request.ViewModel, GetViewData(request.ViewModel.BlackPlayerID, Player.Black)),
                                                                      ComponentGenerator.GetBoard(request.ViewModel, GetViewData(request.ViewModel.BlackPlayerID, Player.White)));
            }

            if (request.ViewModel.WhitePlayerID != ComputerPlayer.ComputerPlayerID && whiteConnection != null)
            {
                _signalRHub.Clients.Client(whiteConnection).SendAsync("UpdateBoard", request.ViewModel.ID, lastMoveDate,
                                                                      ComponentGenerator.GetBoard(request.ViewModel, GetViewData(request.ViewModel.WhitePlayerID, Player.Black)),
                                                                      ComponentGenerator.GetBoard(request.ViewModel, GetViewData(request.ViewModel.WhitePlayerID, Player.White)));
            }

            _signalRHub.Clients
            .GroupExcept(request.ViewModel.ID.ToString(), blackConnection, whiteConnection)
            .SendAsync("UpdateBoard", request.ViewModel.ID, lastMoveDate,
                       ComponentGenerator.GetBoard(request.ViewModel, GetViewData(Guid.Empty, Player.Black)),
                       ComponentGenerator.GetBoard(request.ViewModel, GetViewData(Guid.Empty, Player.White)));

            return(Task.CompletedTask);
        }
        public ActionResult DisplayGame(Guid moveID, Player orientation)
        {
            var game = _context.Games
                       .Include("Turns")
                       .Include("Turns.Moves")
                       .FirstOrDefault(f => f.Turns.Any(a => a.Moves.Any(m => m.ID == moveID)));

            if (game == null)
            {
                Response.StatusCode = 403;
                return(Content(""));
            }

            var move = game.Turns.SelectMany(t => t.Moves).First(f => f.ID == moveID);

            var viewData = new Dictionary <string, object>
            {
                ["playerID"]    = GetPlayerID(),
                ["orientation"] = orientation
            };

            var controller = GameController.FromPosition((Variant)game.Variant, move.ResultingFen);

            var viewModel = game.ToGameViewModel();

            viewModel.Board.GameBoard    = controller.Board.GameBoard;
            viewModel.DisplayingLastMove = move.ID == game.Turns.Last().Moves.OrderBy(a => a.CreatedOn).Last().ID;

            var board = ComponentGenerator.GetBoard(viewModel, viewData).Replace("[theme]", GetThemeOrDefault().ToString());

            return(Content(board));
        }
        public ActionResult Join(Guid id)
        {
            var playerID = GetPlayerID();

            if (!playerID.HasValue)
            {
                Response.StatusCode = 403;
                return(Content(""));
            }

            var game = _context.Games.FirstOrDefault(f => f.ID == id);

            if (game.BlackPlayerID != Guid.Empty && game.WhitePlayerID != Guid.Empty ||
                game.BlackPlayerID == playerID ||
                game.WhitePlayerID == playerID)
            {
                Response.StatusCode = 403;
                return(Content(""));
            }

            if (game.BlackPlayerID == Guid.Empty)
            {
                game.BlackPlayerID = playerID.Value;
            }
            else if (game.WhitePlayerID == Guid.Empty)
            {
                game.WhitePlayerID = playerID.Value;
            }

            game.RowVersion = DateTime.Now;
            try
            {
                _context.SaveChanges();
                var gameViewModel = game.ToGameViewModel();
                _mediator.Publish(new OnGameJoinedNotification(gameViewModel, playerID.Value)).Wait();

                var viewData = new Dictionary <string, object>
                {
                    ["playerID"]    = playerID,
                    ["orientation"] = game.BlackPlayerID == playerID ? Player.Black : Player.White,
                };

                var board = ComponentGenerator.GetBoard(gameViewModel, viewData).Replace("[theme]", GetThemeOrDefault().ToString());
                return(Content(board));
            }
            catch (DbUpdateConcurrencyException)
            {
                _signalRHub.Clients.All.SendAsync("AddClass", "join", "hide");

                Response.StatusCode = 403;
                return(Content(Resources.Resources.GameJoined));
            }
        }