Пример #1
0
        public ActionResult DownVoteKey(int id)
        {
            if (!Request.IsAuthenticated)
                return Json(false, JsonRequestBehavior.AllowGet);

            using (var context = new Database.Context())
            {
                var contributor = context.GetTranslator(User);
                if (context.DownvotedKeys.Any(k => k.Key.Id == id && k.Translator.Id == contributor.Id))
                    return Json(false, JsonRequestBehavior.AllowGet);

                var key = context.Keys.Find(id);
                key.DownVotes++;
                if (key.DownVotes > 5)
                {
                    context.Values.Where(v => v.Key.Id == key.Id).ToList().ForEach(v => context.Values.Remove(v));
                    context.DownvotedKeys.Where(dk => dk.Key.Id == key.Id).ToList().ForEach(dk => context.DownvotedKeys.Remove(dk));
                    context.Keys.Remove(key);
                }
                else
                    context.DownvotedKeys.Add(new DownvotedKey { Key = key, Translator = contributor });

                context.SaveChanges();
            }

            return Json(true, JsonRequestBehavior.AllowGet);
        }
        public Task Handle(OnBotMoveNotification request, CancellationToken cancellationToken)
        {
            if (!request.ViewModel.IsBotGame)
            {
                return(Task.CompletedTask);
            }

            var moves = request.ViewModel.Turns.OrderByDescending(o => o.BlackMove?.CreatedOn ?? DateTime.MaxValue).ToList();

            var blackMove = moves.FirstOrDefault(w => w.BlackMove != null).BlackMove;
            var whiteMove = moves.FirstOrDefault(w => w.BlackMove != null).WhiteMove;

            if (blackMove != null && whiteMove != null)
            {
                var diff = blackMove.CreatedOn - whiteMove.CreatedOn;

                if (Math.Abs(diff.TotalSeconds) > 5)
                {
                    var lastMover = blackMove.CreatedOn > whiteMove.CreatedOn ? Player.Black : Player.White;

                    _context.Games.Find(request.ViewModel.ID).GameStatus = (lastMover == Player.Black ? (int)Status.WhiteWin : (int)Status.BlackWin);
                    _context.SaveChanges();
                }
            }
            else if (blackMove == null && (whiteMove.CreatedOn - request.ViewModel.CreatedOn).TotalSeconds > 5)
            {
                _context.Games.Find(request.ViewModel.ID).GameStatus = (int)Status.BlackWin;
                _context.SaveChanges();
            }
            else if (whiteMove == null && (blackMove.CreatedOn - request.ViewModel.CreatedOn).TotalSeconds > 5)
            {
                _context.Games.Find(request.ViewModel.ID).GameStatus = (int)Status.WhiteWin;
                _context.SaveChanges();
            }

            return(Task.CompletedTask);
        }
Пример #3
0
        public Task MapPlayerConnection(Guid playerID)
        {
            var player = _context.Players.Find(playerID);

            if (player == null)
            {
                _context.Players.Add(new Database.Player
                {
                    ID           = playerID,
                    ConnectionID = Context.ConnectionId
                });
            }
            else
            {
                player.ConnectionID = Context.ConnectionId;
                _context.Players.Update(player);
            }
            _context.SaveChanges();

            var parameter = _contextAccessor.HttpContext.Request.Query["currentPage"].ToString();
            var parts     = parameter.Split('/', StringSplitOptions.RemoveEmptyEntries);

            if (parts.Length == 3 && parts[0].ToLower() == "home" && parts[1].ToLower() == "game")
            {
                var gameID = Guid.Parse(parts[2]);
                var game   = _context.Games
                             .Include("Turns")
                             .Include("Turns.Moves")
                             .FirstOrDefault(f => f.ID == gameID);
                var viewModel = game.ToGameViewModel();

                _mediator.Publish(new OnGameConnectedNotification(viewModel));
            }

            return(Task.CompletedTask);
        }
Пример #4
0
 internal void AddKeysToDatabase(IEnumerable<LocalizedStringTable> tables)
 {
     using (var context = new Database.Context())
     {
         var foundKeys = new List<TranslationKey>();
         foreach (var source in tables)
         {
             foreach (var key in source.Keys)
             {
                 if (!context.Keys.Any(tk => tk.Key == key))
                     context.Keys.Add(new TranslationKey(key, source[key].Comment));
             }
         }
         context.SaveChanges();
     }
 }
Пример #5
0
        internal void AddTranslationsToDatabase(IEnumerable<LocalizedStringTable> tables, IPrincipal User, string language)
        {
            using (var context = new Database.Context())
            {
                var translator = context.GetTranslator(User);

                var foundKeys = new List<TranslationKey>();
                foreach (var source in tables)
                {
                    foreach (var pair in source)
                    {
                        var key = context.Keys.FirstOrDefault(k => k.Key == pair.Key) ??
                            context.Keys.Add(new TranslationKey(pair.Key, pair.Value.Comment));

                        if (!context.Values.Any(v => v.Key.Key == pair.Key && v.Value == pair.Value.Value && v.Language == language))
                        {
                            context.Values.Add(new Translation(language, pair.Value.Value) { Key = key, Translator = translator });
                        }
                    }
                }
                context.SaveChanges();
            }
        }
Пример #6
0
        internal Task DoComputerMove(Guid id)
        {
            return(Task.Run(() =>
            {
                var game = _context.Games
                           .Include("Turns")
                           .Include("Turns.Moves")
                           .FirstOrDefault(f => f.ID == id);

                if (game.GameStatus != (int)Status.InProgress)
                {
                    return;
                }

                if (game.CurrentPlayer == (int)Player.Black && game.BlackPlayerID != ComputerPlayerID ||
                    game.CurrentPlayer == (int)Player.White && game.WhitePlayerID != ComputerPlayerID)
                {
                    return;
                }

                var controller = game.ToGameController();
                var move = controller.Move(controller.GetMove(game.CurrentPlayer == (int)Player.Black ? game.BlackPlayerStrength : game.WhitePlayerStrength, CancellationToken.None));
                move.ID = game.ID;

                var turn = move.MoveHistory.Last().ToPdnTurn();
                if (game.Turns != null && game.Turns.Any(t => t.MoveNumber == turn.MoveNumber))
                {
                    var recordedTurn = game.Turns.Single(s => s.MoveNumber == turn.MoveNumber);
                    Database.PdnMove newMove;
                    switch (controller.CurrentPlayer)
                    {
                    case Player.White:
                        newMove = move.MoveHistory.Last().WhiteMove.ToPdnMove();
                        break;

                    case Player.Black:
                        newMove = move.MoveHistory.Last().BlackMove.ToPdnMove();
                        break;

                    default:
                        throw new ArgumentException();
                    }

                    var existingMove = recordedTurn.Moves.FirstOrDefault(a => a.Player == (int)controller.CurrentPlayer);
                    if (existingMove != null)
                    {
                        recordedTurn.Moves.Remove(existingMove);
                    }
                    recordedTurn.Moves.Add(newMove);

                    game.Fen = newMove.ResultingFen;
                }
                else
                {
                    game.Turns.Add(move.MoveHistory.Last().ToPdnTurn());
                    game.Fen = turn.Moves.Single().ResultingFen;
                }

                game.CurrentPosition = move.GetCurrentPosition();
                game.CurrentPlayer = (int)move.CurrentPlayer;
                game.GameStatus = (int)move.GetGameStatus();
                game.RowVersion = DateTime.Now;

                _context.SaveChanges();

                _mediator.Publish(new OnMoveNotification(game.ToGameViewModel())).Wait();
            }));
        }
Пример #7
0
        public ActionResult MovePiece(Guid id, Coord start, Coord end)
        {
            var playerID = GetPlayerID();

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

            var game = _context.Games
                       .Include("Turns")
                       .Include("Turns.Moves")
                       .FirstOrDefault(f => f.ID == id);

            if (game == null ||
                game.GameStatus != (int)Status.InProgress ||
                (game.BlackPlayerID != playerID && game.CurrentPlayer == (int)Player.Black) ||
                (game.WhitePlayerID != playerID && game.CurrentPlayer == (int)Player.White))
            {
                Response.StatusCode = 403;
                return(Content(""));
            }

            var controller = game.ToGameController();

            if (!controller.IsValidMove(start, end))
            {
                Response.StatusCode = 403;
                return(Content(""));
            }

            var move = controller.Move(start, end);

            move.ID = game.ID;

            var turn = move.MoveHistory.Last().ToPdnTurn();

            if (game.Turns.Any(t => t.MoveNumber == turn.MoveNumber))
            {
                var recordedTurn = game.Turns.Single(s => s.MoveNumber == turn.MoveNumber);
                Database.PdnMove newMove;
                switch (controller.CurrentPlayer)
                {
                case Player.White:
                    newMove = move.MoveHistory.Last().WhiteMove.ToPdnMove();
                    break;

                case Player.Black:
                    newMove = move.MoveHistory.Last().BlackMove.ToPdnMove();
                    break;

                default:
                    throw new ArgumentException();
                }

                var existingMove = recordedTurn.Moves.FirstOrDefault(a => a.Player == (int)controller.CurrentPlayer);
                if (existingMove != null)
                {
                    recordedTurn.Moves.Remove(existingMove);
                }
                recordedTurn.Moves.Add(newMove);

                game.Fen = newMove.ResultingFen;
            }
            else
            {
                game.Turns.Add(move.MoveHistory.Last().ToPdnTurn());
                game.Fen = turn.Moves.Single().ResultingFen;
            }

            game.CurrentPosition = move.GetCurrentPosition();
            game.CurrentPlayer   = (int)move.CurrentPlayer;
            game.GameStatus      = (int)move.GetGameStatus();

            game.RowVersion = DateTime.Now;
            _context.SaveChanges();

            var viewModel = game.ToGameViewModel();

            _mediator.Publish(new OnBotMoveNotification(viewModel)).Wait();
            _mediator.Publish(new OnMoveNotification(viewModel)).Wait();

            return(Content(""));
        }
Пример #8
0
        public ActionResult NewGame(Variant variant, Opponent blackOpponent, Opponent whiteOpponent, int blackStrength, int whiteStrength, string fen, bool isBotGame = false)
        {
            if (blackOpponent == Opponent.Computer && whiteOpponent == Opponent.Computer)
            {
                Response.StatusCode = 403;
                return(Redirect("/"));
            }

            if (isBotGame)
            {
                var game = _context.Games.FirstOrDefault(f => f.IsBotGame && (f.WhitePlayerID == Guid.Empty || f.BlackPlayerID == Guid.Empty));
                if (game != null)
                {
                    return(_boardController.Join(game.ID));
                }
            }

            var playerID = GetPlayerID().Value;

            ViewData.Add("playerID", playerID);

            Database.Game newGame;
            if (!string.IsNullOrWhiteSpace(fen))
            {
                if (!GameController.TryFromPosition(variant, fen, out var game))
                {
                    Response.StatusCode = 403;
                    return(Redirect("/"));
                }
                else
                {
                    newGame = game.ToGame();
                }
            }
            else
            {
                newGame = GameController.FromVariant(variant).ToGame();
            }

            newGame.RowVersion = DateTime.Now;

            newGame.BlackPlayerStrength = -1;
            newGame.WhitePlayerStrength = -1;

            newGame.IsBotGame = isBotGame;

            if (blackOpponent == Opponent.Human && whiteOpponent == Opponent.Human)
            {
                var player = Random.Next(0, 2);
                if (player == (int)Player.Black)
                {
                    newGame.BlackPlayerID = playerID;
                }
                else
                {
                    newGame.WhitePlayerID = playerID;
                }
            }
            else
            {
                if (blackOpponent == Opponent.Computer)
                {
                    newGame.BlackPlayerID       = ComputerPlayer.ComputerPlayerID;
                    newGame.WhitePlayerID       = playerID;
                    newGame.BlackPlayerStrength = blackStrength;
                }
                if (whiteOpponent == Opponent.Computer)
                {
                    newGame.WhitePlayerID       = ComputerPlayer.ComputerPlayerID;
                    newGame.BlackPlayerID       = playerID;
                    newGame.WhitePlayerStrength = whiteStrength;
                }
            }

            _context.Games.Add(newGame);
            _context.SaveChanges();

            _mediator.Publish(new OnGameCreatedNotification(newGame.ToGameViewModel(), newGame.CurrentPlayer == (int)Player.Black ? newGame.BlackPlayerID : newGame.WhitePlayerID)).Wait();

            return(Redirect($"/Home/Game/{newGame.ID}"));
        }