private UserHandler Bidd(List <UserHandler> currentUsers)
        {
            int         checkValue        = 0;
            UserHandler winner            = null;
            bool        begin             = false;
            int         checkedUsersCount = 0;
            bool        exit = false;

            while (!exit && !skipBidd)
            {
                foreach (UserHandler u in currentUsers)
                {
                    if (u.Status != STATUS.FOLD || u.Status != STATUS.ALL_IN)
                    {
                        if (u.Status == STATUS.DEALER)
                        {
                            InvokeIfRequired(() =>
                            {
                                u.Status = STATUS.NO_ACTION;
                            });
                            begin = true;
                            continue;
                        }
                        else if (u.Status == STATUS.SMALL_BLIND)
                        {
                            if (u.TotalBallance < (blindValue / 2))
                            {
                                InvokeIfRequired(() =>
                                {
                                    u.Status    = STATUS.FOLD;
                                    u.IsPlaying = false;
                                });
                            }
                            else
                            {
                                InvokeIfRequired(() =>
                                {
                                    u.TotalBallance -= (blindValue / 2);
                                    dealer.Pot      += (blindValue / 2);
                                    u.CurrentBet     = (blindValue / 2);
                                    u.Status         = STATUS.NO_ACTION;
                                });
                            }
                        }
                        else if (u.Status == STATUS.BIG_BLIND)
                        {
                            if (u.TotalBallance < (blindValue))
                            {
                                InvokeIfRequired(() =>
                                {
                                    u.Status    = STATUS.FOLD;
                                    u.IsPlaying = false;
                                });
                            }
                            else
                            {
                                InvokeIfRequired(() =>
                                {
                                    u.TotalBallance -= (blindValue);
                                    dealer.Pot      += (blindValue);
                                    u.CurrentBet     = (blindValue);
                                    u.Status         = STATUS.NO_ACTION;
                                    checkValue       = blindValue;
                                });
                            }
                            begin = true;
                        }

                        else if (u.Status == STATUS.FOLD ||
                                 u.Status == STATUS.NEW_USER ||
                                 u.Status == STATUS.ALL_IN ||
                                 !u.IsActive || !u.IsPlaying)
                        {
                            continue;
                        }

                        else if (begin)
                        {
                            foreach (UserHandler usr in currentUsers)
                            {
                                if (usr.IsActive && usr.IsPlaying)
                                {
                                    InvokeIfRequired(() =>
                                    {
                                        usr.Send_GameInfo(checkValue, blindValue);
                                    });
                                }
                            }

                            InvokeIfRequired(() =>
                            {
                                u.Status = STATUS.MY_TURN;
                            });
                            u.Send_WaitingForMoveSignal();

                            bool amIOnlyActiveUser = true;
                            foreach (UserHandler usr in GetPlayingUsers())
                            {
                                if (!(usr.Status == STATUS.ALL_IN || usr.Status == STATUS.MY_TURN))
                                {
                                    amIOnlyActiveUser = false;
                                    break;
                                }
                            }
                            if (amIOnlyActiveUser)
                            {
                                skipBidd = true;
                            }

                            while (u.Status == STATUS.MY_TURN)
                            {
                                if (u.IsActive)
                                {
                                    if (!runGame_break)
                                    {
                                        Thread.Sleep(500);
                                    }
                                    else
                                    {
                                        InvokeIfRequired(() => { u.Status = STATUS.NO_ACTION; });
                                        winner = u;
                                    }
                                }
                                else
                                {
                                    Console.WriteLine($"{u.Username} disconnected, skipping...");
                                    u.Status = STATUS.FOLD;
                                }
                            }
                            switch (u.Status)
                            {
                            case STATUS.CHECK:
                            {
                                checkedUsersCount++;
                                InvokeIfRequired(() =>
                                    {
                                        int coinsToAdd   = checkValue - u.CurrentBet;
                                        u.TotalBallance -= coinsToAdd;
                                        dealer.Pot      += coinsToAdd;
                                        u.CurrentBet     = checkValue;
                                    });
                                break;
                            }

                            case STATUS.RAISE:
                            {
                                checkedUsersCount = 1;
                                InvokeIfRequired(() =>
                                    {
                                        int coinsToAdd   = u.latestArgs.value - u.CurrentBet;
                                        u.TotalBallance -= coinsToAdd;
                                        dealer.Pot      += coinsToAdd;
                                        checkValue       = u.latestArgs.value;
                                        u.CurrentBet     = checkValue;
                                    });
                                break;
                            }

                            case STATUS.FOLD:
                            {
                                break;
                            }
                            }
                            if (u.TotalBallance == 0)
                            {
                                InvokeIfRequired(() => { u.Status = STATUS.ALL_IN; });
                            }
                            int nonFoldedUsers = 0;
                            foreach (var u2 in currentUsers)
                            {
                                if (u2.Status != STATUS.FOLD)
                                {
                                    nonFoldedUsers++;
                                }
                            }
                            if (checkedUsersCount == nonFoldedUsers)
                            {
                                exit = true;
                                break;
                            }
                            if (nonFoldedUsers == 1)
                            {
                                exit = true;
                                foreach (var u2 in currentUsers)
                                {
                                    if (u2.Status != STATUS.FOLD)
                                    {
                                        winner = u2;
                                    }
                                }
                                break;
                            }
                        }
                        else if (u.IsDealer)
                        {
                            begin = true;
                        }
                    }
                }
            }
            return(winner);
        }
        private async void RunGame()
        {
            Task t = new Task(() =>
            {
                currentDealerIndex = 0;
                GAME_MOMENT currentMoment;
                UserHandler potentialWinner = null;

                while (true)
                {
                    InvokeIfRequired(() => { ResetBoard(); });
                    int current;
                    do
                    {
                        current = Dispatcher.Invoke(new Func <int>(CountActiveUsers));
                        System.Threading.Thread.Sleep(1000);
                    } while (current < 2);
                    List <UserHandler> currentUsers;
                    int activeUsersCount;
                    do
                    {
                        runGame_break = false;
                        skipBidd      = false;
                        InvokeIfRequired(() => { PrepareBoard(); });
                        activeUsersCount = 0;
                        currentUsers     = Dispatcher.Invoke(new Func <List <UserHandler> >(GetActiveUsers));
                        foreach (UserHandler u in currentUsers)
                        {
                            InvokeIfRequired(() =>
                            {
                                u.IsPlaying = true;
                                u.IsDealer  = false;
                                u.Status    = STATUS.NEW_GAME;
                                u.Send_StartSignal();
                            });
                        }
                        InvokeIfRequired(() => { usedCards = new List <Card>(); });

                        if (currentDealerIndex >= currentUsers.Count)
                        {
                            currentDealerIndex = 0;
                        }

                        currentMoment = GAME_MOMENT.PREFLOP;
                        while (currentMoment != GAME_MOMENT.SHOW)
                        {
                            foreach (UserHandler u in currentUsers)
                            {
                                if (u.IsPlaying)
                                {
                                    InvokeIfRequired(() =>
                                    {
                                        u.CurrentBet = 0;
                                        u.Status     = STATUS.NO_ACTION;
                                    });
                                }
                            }

                            switch (currentMoment)
                            {
                            case GAME_MOMENT.PREFLOP:
                                {
                                    Dispatcher.Invoke(() => { ExecutePreflop(currentUsers); });
                                    break;
                                }

                            case GAME_MOMENT.FLOP:
                                {
                                    Dispatcher.Invoke(() => { ExecuteFlop(currentUsers); });
                                    break;
                                }

                            case GAME_MOMENT.TURN:
                                {
                                    Dispatcher.Invoke(() => { ExecuteTurn(currentUsers); });
                                    break;
                                }

                            case GAME_MOMENT.RIVER:
                                {
                                    Dispatcher.Invoke(() => { ExecuteRiver(currentUsers); });
                                    break;
                                }
                            }
                            potentialWinner  = Bidd(currentUsers);
                            int stillPlaying = 0;
                            foreach (var u in currentUsers)
                            {
                                if (u.IsPlaying)
                                {
                                    stillPlaying++;
                                }
                            }
                            if (potentialWinner != null || stillPlaying < 2)
                            {
                                break;
                            }
                            else
                            {
                                currentMoment++;
                            }
                        }
                        UserHandler[] winners;
                        if (potentialWinner == null)
                        {
                            winners = ExecuteRewardCalculation(currentUsers);
                        }
                        else
                        {
                            winners = new UserHandler[] { potentialWinner }
                        };
                        ExecuteShow(currentUsers);
                        System.Threading.Thread.Sleep(2000);

                        foreach (UserHandler w in winners)
                        {
                            InvokeIfRequired(() => { w.Status = STATUS.WINNER; });
                        }
                        if (currentMoment == GAME_MOMENT.SHOW)
                        {
                            if (winners.Length == 1)
                            {
                                SetDealerMessage($"{winners[0].Username} won ${dealer.Pot}\nwith {winners[0].CurrentSet.Figure.ToString()}");
                            }
                            else
                            {
                                string msg = "";
                                for (int i = 0; i < winners.Length; i++)
                                {
                                    if (i != 0)
                                    {
                                        msg += " and ";
                                    }
                                    msg += winners[i].Username;
                                }
                                SetDealerMessage($"{msg} won ${((int)dealer.Pot/winners.Length)} each\nwith {winners[0].CurrentSet.Figure.ToString()}");
                            }
                        }

                        System.Threading.Thread.Sleep(2000);

                        InvokeIfRequired(() => { RewardWinners(dealer, winners); });
                        System.Threading.Thread.Sleep(2000);

                        foreach (UserHandler u in currentUsers)
                        {
                            u.IsPlaying = false;
                        }
                        currentDealerIndex++;

                        foreach (var u in users)
                        {
                            if (u.IsActive && u.TotalBallance > 0)
                            {
                                activeUsersCount++;
                            }
                        }
                    }while (activeUsersCount >= 2);
                }
            });

            t.Start();

            try
            {
                await t;
            }
            catch (OperationCanceledException ocex)
            {
                Console.WriteLine(ocex.StackTrace);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
        }