public ChessOnlineForm(UserModel user, Uri host, ChessGameInfo gameInfo)
        {
            this.user   = user;
            this.host   = host;
            this.gameId = gameInfo.GameId;

            if (gameInfo.White?.Name == user.Player.Name)
            {
                playerColor = PieceColor.White;
            }
            else if (gameInfo.Black?.Name == user.Player.Name)
            {
                playerColor = PieceColor.Black;
            }

            if (gameInfo.White != null && gameInfo.Black != null)
            {
                gameState = new ChessGameState(gameInfo);
            }

            InitializeComponent();
            InitializeBoard();
            InitHttpClient();
            InitHubConnection();

            Icon = Icon.FromHandle(Properties.Resources.knight_white.GetHicon());
            Text = $"Chess - {user.Player.Name}";

            if (playerColor == null)
            {
                grbPlayerColor.Text  = "Spectating";
                cfbPlayerColor.Image = Properties.Resources.eye;
            }
            else
            {
                grbPlayerColor.Text  = "Your color";
                cfbPlayerColor.Image = PieceImageUtils.Pawn(playerColor.Value);
            }
        }
        private void RefreshViews()
        {
            if (board == null)
            {
                return;
            }

            labPlayerNames.Text = $"White: \n{gameState?.GameInfo?.White?.Name} \n\nBlack: \n{gameState?.GameInfo?.Black?.Name}";

            if (gameState == null)
            {
                btnAddBot.Visible = true;
                return;
            }

            btnAddBot.Visible = false;

            if (gameState.IsCheckmate)
            {
                panTable.Enabled = false;
                grbPlaying.Text  = "Checkmate";
                cfbPlaying.Image = PieceImageUtils.King(gameState.OnTurn.Other());
                if (playerColor != null)
                {
                    cfbPlaying.BackColor = gameState.OnTurn != playerColor ? Color.YellowGreen : Color.OrangeRed;
                }
            }
            else if (gameState.IsDraw)
            {
                panTable.Enabled     = false;
                grbPlaying.Text      = "Draw";
                cfbPlaying.Image     = Properties.Resources.king_multi;
                cfbPlaying.BackColor = Control.DefaultBackColor;
            }
            else
            {
                panTable.Enabled = true;
                grbPlaying.Text  = "On turn";
                cfbPlaying.Image = PieceImageUtils.Pawn(gameState.OnTurn);
                if (playerColor != null)
                {
                    cfbPlaying.BackColor = gameState.OnTurn == playerColor ? Color.YellowGreen : Control.DefaultBackColor;
                }
            }

            pieceListPanelBlack.SetPieceChars(gameState.CapturedPieces.Where(c => c >= 'a' && c <= 'z').ToList());
            pieceListPanelWhite.SetPieceChars(gameState.CapturedPieces.Where(c => c >= 'A' && c <= 'Z').ToList());

            for (int i = 0; i < 8; ++i)
            {
                for (int j = 0; j < 8; ++j)
                {
                    var fieldBox = fieldBoxes[i, j];
                    fieldBox.SuspendLayout();
                    fieldBox.Style = ChessFieldBox.BoxStyle.None;
                    fieldBox.Image = board[i, j]?.Image();
                }
            }

            if (gameState.CheckingPieces?.Count > 0)
            {
                var king = board.King(board.TurnColor);
                fieldBoxes[king.X, king.Y].Style = ChessFieldBox.BoxStyle.Checked;
                foreach (var piece in gameState.CheckingPieces)
                {
                    var field = ChessGameUtils.FieldFromString(piece);
                    fieldBoxes[field.Item1, field.Item2].Style = ChessFieldBox.BoxStyle.Checking;
                }
            }

            if (selectedField != null)
            {
                fieldBoxes[selectedField.Item1, selectedField.Item2].Style = ChessFieldBox.BoxStyle.Selected;
                if (possibleMoves != null)
                {
                    var selectedPiece = board[selectedField.Item1, selectedField.Item2];
                    foreach (var field in possibleMoves)
                    {
                        fieldBoxes[field.Item1, field.Item2].Style =
                            board[field.Item1, field.Item2] != null || (selectedPiece is Pawn && selectedPiece.X != field.Item1) ?
                            ChessFieldBox.BoxStyle.Attack : ChessFieldBox.BoxStyle.Move;
                    }
                }
            }

            if (board.LastMove != null)
            {
                var lastMove = board.LastMove;
                if (lastMove.ConnectedMove)
                {
                    lastMove = lastMove.LastMove;
                }
                labLastMove.Text = $"Last move:\n{ChessGameUtils.FieldToString(lastMove.FromX, lastMove.FromY)} => {ChessGameUtils.FieldToString(lastMove.ToX, lastMove.ToY)}";
                if (showLastMove)
                {
                    fieldBoxes[lastMove.FromX, lastMove.FromY].Style = ChessFieldBox.BoxStyle.MoveFrom;
                    fieldBoxes[lastMove.ToX, lastMove.ToY].Style     = lastMove.CapturedPiece != null ?
                                                                       ChessFieldBox.BoxStyle.MoveToCapture : ChessFieldBox.BoxStyle.MoveTo;
                }
            }

            foreach (var fieldBox in fieldBoxes)
            {
                fieldBox.ResumeLayout(false);
                fieldBox.Invalidate();
            }
        }
        private void RefreshViews()
        {
            if (board.IsCheckmate)
            {
                panTable.Enabled = false;
                labPlaying.Text  = "Victory";
                cfbPlaying.Image = PieceImageUtils.King(board.TurnColor.Other());
            }
            else if (board.IsDraw)
            {
                panTable.Enabled = false;
                labPlaying.Text  = "Draw";
                cfbPlaying.Image = null;
            }
            else
            {
                panTable.Enabled = true;
                labPlaying.Text  = "Now playing";
                cfbPlaying.Image = PieceImageUtils.Pawn(board.TurnColor);
            }

            pieceListPanelBlack.SetPieces(board.GetCaptured(PieceColor.Black));
            pieceListPanelWhite.SetPieces(board.GetCaptured(PieceColor.White));

            for (int i = 0; i < 8; ++i)
            {
                for (int j = 0; j < 8; ++j)
                {
                    var fieldBox = fieldBoxes[i, j];
                    fieldBox.SuspendLayout();
                    fieldBox.Style = ChessFieldBox.BoxStyle.None;
                    fieldBox.Image = board[i, j]?.Image();
                }
            }

            if (board.IsCheck)
            {
                var king = board.King(board.TurnColor);
                fieldBoxes[king.X, king.Y].Style = ChessFieldBox.BoxStyle.Checked;
                foreach (var piece in board.CheckingPieces)
                {
                    fieldBoxes[piece.X, piece.Y].Style = ChessFieldBox.BoxStyle.Checking;
                }
            }

            if (selectedPiece != null)
            {
                fieldBoxes[selectedPiece.X, selectedPiece.Y].Style = ChessFieldBox.BoxStyle.Selected;
                foreach (var field in possibleMoves)
                {
                    fieldBoxes[field.Item1, field.Item2].Style =
                        board[field.Item1, field.Item2] != null || (selectedPiece is Pawn && selectedPiece.X != field.Item1) ?
                        ChessFieldBox.BoxStyle.Attack : ChessFieldBox.BoxStyle.Move;
                }
            }

            foreach (var fieldBox in fieldBoxes)
            {
                fieldBox.ResumeLayout(false);
                fieldBox.Invalidate();
            }
        }