/// <summary>
        /// Back to general chat
        /// </summary>
        /// <param name="user"></param>
        /// <param name="opponent"></param>
        public void BackToChat(string user, string opponent)
        {
            if (!string.IsNullOrEmpty(user) && !string.IsNullOrEmpty(opponent))
            {
                try
                {
                    GameMng.DeleteGame(user, opponent);
                    GameMng.DeleteHowToFirst(user, opponent);

                    if (_callback.ContainsKey(user))
                    {
                        _callback[user].BackToChatFromServer(user, opponent);
                    }

                    if (_callback.ContainsKey(opponent))
                    {
                        _callback[opponent].BackToChatFromServer(opponent, user);
                    }
                }
                catch (Exception ex)
                {
                    _callback[user].RecieveError(ex.Message);
                    _callback[opponent].RecieveError(ex.Message);
                }
            }
        }
        /// <summary>
        /// Computer Player Logic
        /// </summary>
        /// <param name="computer">name of comp player</param>
        /// <param name="opponent">name of user player</param>
        /// <param name="diceNumbers">number of dice</param>
        public void MoveCheckerAuto(string computer, string opponent)
        {
            if (_callback.ContainsKey(opponent))
            {
                var game = GameMng.GetGame(computer, opponent);
                if (game == null)
                {
                    return;
                }

                var diceNumbers = game.DiceLogic.GetRandomDices();

                if (diceNumbers[0] == diceNumbers[1])
                {
                    diceNumbers.AddRange(diceNumbers);
                }

                _callback[opponent].RecieveRoll(Player.autoPlayer.ToString(), diceNumbers);

                bool result = false;

                try
                {
                    foreach (var number in diceNumbers)
                    {
                        result = GameMng.CheckersMoovingLogicAuto(computer, opponent, number);
                        if (result)
                        {
                            var gameTable = GameMng.GetGameTableForSend(computer, opponent);

                            if (gameTable != null)
                            {
                                var whiteCheckers = gameTable[0];
                                var blackCheckers = gameTable[1];
                                var barCheckers   = gameTable[2];
                                _callback[opponent].UpdateTable(opponent, computer, whiteCheckers, blackCheckers, barCheckers);
                            }
                        }
                        if (GameMng.IsGameOver(opponent, computer))
                        {
                            _callback[opponent].GameOverFromServer(opponent, computer, false);

                            GameMng.DeleteGame(computer, opponent);
                        }
                    }
                    if (_callback.ContainsKey(opponent))
                    {
                        _callback[opponent].SetMasterFromServer(opponent, computer);
                    }
                }
                catch (Exception ex)
                {
                    _callback[opponent].RecieveError(ex.Message);
                    return;
                }
            }
        }
        public void UserLeftGame(string userName, string opponentName)
        {
            if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(opponentName))
            {
                var callback = OperationContext.Current.GetCallbackChannel <IClientCallback>();
                try
                {
                    BackToChat(opponentName, userName);

                    GameMng.DeleteHowToFirst(userName, opponentName);
                    GameMng.DeleteGame(userName, opponentName);
                }
                catch (Exception ex)
                {
                    callback.RecieveError(ex.Message);
                }
            }
        }
 /// <summary>
 /// the game ended with the victory of one of the users
 /// </summary>
 /// <param name="userName"></param>
 /// <param name="opponentName"></param>
 public void GameOver(string userName, string opponentName)
 {
     if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(opponentName))
     {
         var callback = OperationContext.Current.GetCallbackChannel <IClientCallback>();
         try
         {
             if (_callback.ContainsKey(opponentName))
             {
                 _callback[userName].GameOverFromServer(userName, opponentName, true);
                 _callback[opponentName].GameOverFromServer(opponentName, userName, false);
                 GameMng.DeleteGame(userName, opponentName);
             }
         }
         catch (Exception ex)
         {
             callback.RecieveError(ex.InnerException.Message);
         }
     }
 }
        /// <summary>
        /// Moves the selected checker
        /// </summary>
        /// <param name="user">user name</param>
        /// <param name="opponent">opponent name</param>
        /// <param name="currIndex">index of selected checker</param>
        /// <param name="number">number  the dice</param>
        public void MoveChecker(string user, string opponent, int currIndex, int number)
        {
            //lock (padlock)
            //{
            if (!string.IsNullOrEmpty(user) && !string.IsNullOrEmpty(opponent))
            {
                var game = GameMng.GetGame(user, opponent);
                if (game == null)
                {
                    return;
                }

                var  callback = OperationContext.Current.GetCallbackChannel <IClientCallback>();
                bool result   = false;

                if (_callback.ContainsKey(user))
                {
                    try
                    {
                        var doubleDice = game.DoubleDice;
                        var diffDice   = game.DifferentDice;

                        try
                        {
                            result = GameMng.CheckersMoovingLogic(user, opponent, currIndex, number);
                        }
                        catch (Exception ex)
                        {
                            _callback[user].RecieveGameError(ex.Message);
                            _callback[user].MoveEnableFromServer(user, opponent);
                            if (_callback.ContainsKey(opponent))
                            {
                                _callback[opponent].SetWaiterFromServer(opponent, user);
                            }
                            return;
                        }
                        if (result)
                        {
                            var gameTable = GameMng.GetGameTableForSend(user, opponent);

                            var whiteCheckers = gameTable[0];
                            var blackCheckers = gameTable[1];
                            var barCheckers   = gameTable[2];
                            _callback[user].UpdateTable(user, opponent, whiteCheckers, blackCheckers, barCheckers);
                            if (opponent != Player.autoPlayer.ToString())
                            {
                                _callback[opponent].UpdateTable(opponent, user, whiteCheckers, blackCheckers, barCheckers);
                            }

                            if (doubleDice != null && doubleDice.IsMoovingFinish())
                            {
                                // GameMng.DeleteDoubleDice(user, opponent);
                                if (opponent != Player.autoPlayer.ToString())
                                {
                                    _callback[opponent].SetMasterFromServer(opponent, user);
                                }
                                _callback[user].SetWaiterFromServer(user, opponent);
                                //turn computer moving
                                if (opponent == Player.autoPlayer.ToString())
                                {
                                    MoveCheckerAuto(opponent, user);
                                }
                            }
                            else if (diffDice != null && diffDice.IsMoovingFinish())
                            {
                                // GameMng.DeleteDifferentDice(user, opponent);
                                if (opponent != Player.autoPlayer.ToString())
                                {
                                    _callback[opponent].SetMasterFromServer(opponent, user);
                                }
                                _callback[user].SetWaiterFromServer(user, opponent);
                                //turn computer moving
                                if (opponent == Player.autoPlayer.ToString())
                                {
                                    MoveCheckerAuto(opponent, user);
                                }
                            }

                            if (GameMng.IsGameOver(user, opponent))
                            {
                                _callback[user].GameOverFromServer(user, opponent, true);
                                if (opponent != Player.autoPlayer.ToString())
                                {
                                    _callback[opponent].GameOverFromServer(opponent, user, false);
                                }
                                GameMng.DeleteGame(user, opponent);
                            }
                        }
                        else
                        {
                            if (_callback.ContainsKey(opponent))
                            {
                                _callback[user].SetWaiterFromServer(user, opponent);
                            }

                            if (_callback.ContainsKey(opponent))
                            {
                                _callback[opponent].SetMasterFromServer(opponent, user);
                            }
                            else
                            {
                                MoveCheckerAuto(opponent, user);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        callback.RecieveGameError(ex.Message);
                        if (_callback.ContainsKey(opponent))
                        {
                            _callback[opponent].RecieveGameError(ex.Message);
                        }
                    }
                }
            }
            //}
        }