Exemple #1
0
def wait_for_my_first_hand(waiting_minutes=5):
    """Don't break this waiting function if new_hand is True, because I'm 
    waiting for first hand and maybe several hands are played without me.
    """
    shout("Looking for cards in 'WAITING_FOR_FIRST_HAND' Section...",
          color='light_magenta')
    t1 = time.time()
    fixing_retry = 1
    while True:

        if pm.player_cards_pixel(config.game_position, config.my_seat_number):
            shout("My cards are founded", color='light_magenta')
            config.bot_status = 'I_AM_PLAYING'
            # If I've resume the game, set
            # config.bot_status = 'WAITING_FOR_FIRST_HAND' inside resume function.
            # Even at preflop (betting_round = 0) I can resume the game without
            # doing set_just_do_check_fold_to_true().
            if (not pm.pre_flop_pixel(config.game_position)
                    or (pm.pre_flop_pixel(config.game_position)
                        and is_there_any_raiser())):
                set_just_do_check_fold_to_true("program is started again "\
                                               "from middle of the game")
            break
        if (time.time() - t1) > (
            (60 * waiting_minutes) / 3) and fixing_retry <= 1:
            fixing_retry += 1
            fix_game_disruption()
        if time.time() - t1 > 60 * waiting_minutes:
            config.bot_status = 'ON_MAIN_MENU'
            shout("No one join the table, call operator to go to main menu")
            break
Exemple #2
0
def bot_is_observing():
    wait_hand_ends_when_observing(waiting_minutes=30)
    while True:
        if c.bot_status != 'OBSERVING':
            break
        shout("* bot_status == 'OBSERVING' *", color='on_green')
        reset_table_information()
        wait_new_hand_starts_when_observing(waiting_minutes=30)
        shout("-------- New Hand Started --------", color='on_green')
        if c.bot_status != 'OBSERVING':
            break
        # use this statement after waiting functions
        # which uses c.new_hand = hand_is_ended()
        if c.new_hand:
            continue
        determine_small_big_dealer_seats()
        if am_i_in_or_not():
            if pm.player_cards_pixel(c.game_position, c.my_seat_number):
                read_and_save_my_cards()
                play_sound_for_good_starting_hands()
        read_and_save_banks_and_names()

        # Playing a whole hand in this loop
        observing_a_hand()
        if c.bot_status != 'OBSERVING':
            break
        if c.new_hand:
            continue
        if game_is_paused():
            fix_game_disruption('game is unpaused')
            break
Exemple #3
0
def play_a_hand():
    t1 = time.time()
    while True:
        if shifted_to_next_stage():
            read_board_cards()
            if not stages_are_sequenced():
                set_just_do_check_fold_to_true('stages are not sequenced')
                screenshot_error('stages are not sequenced')
        if its_my_turn():
            update_betting_rounds()
            read_and_save_bets()
            if config.bot_status == 'I_AM_PLAYING':
                click_decision()  #🌏🌱♣♠♦♥🌱🌏
        if t1 - time.time() > 5 * 60:
            fix_game_disruption('This hand last more than 5 minutes')
        config.new_hand = hand_is_ended()
        if config.new_hand:
            shout("-------- Hand ended --------", color='on_green')
            break
        if config.bot_status != 'I_AM_PLAYING':
            break
        if game_is_paused():
            input("press Enter to start again...")
            fix_game_disruption('game is unpaused')
            break
Exemple #4
0
def read_and_save_flop_cards():
    #global game_position, board_card_1th , board_card_2th , board_card_3th , just_do_check_fold , my_seat_number , MY_PROFILE_NAME , bot_status

    config.board_card_1th, config.board_card_2th, config.board_card_3th =\
    read_cards.read_flop_cards(config.game_position)

    if ('Unknown' in config.board_card_1th
            or 'Unknown' in config.board_card_2th
            or 'Unknown' in config.board_card_3th):

        fix_game_disruption("Flop cards are read 'Unknown'")
        config.board_card_1th, config.board_card_2th, config.board_card_3th =\
        read_cards.read_flop_cards(config.game_position)

        if ('Unknown' in config.board_card_1th
                or 'Unknown' in config.board_card_2th
                or 'Unknown' in config.board_card_3th
                or not pm.flop_pixel(config.game_position)
                or pm.turn_pixel(config.game_position)):

            set_just_do_check_fold_to_true(
                "Flop cards are read 'Unknown' again")

    shout(
        "Flop cards are: %s, %s, %s" %
        (config.board_card_1th, config.board_card_2th, config.board_card_3th),
        color='green')
Exemple #5
0
def play_a_hand():
    t1 = time.time()
    while True:
        if shifted_to_next_stage():
            read_board_cards()
            if not stages_are_sequenced():
                set_just_do_check_fold_to_true('stages are not sequenced')
                screenshot_error('stages are not sequenced')
        if its_my_turn():
            update_betting_rounds()
            read_and_save_bets()
            if config.bot_status == 'I_AM_PLAYING':
                click_decision()  #🌏🌱♣♠♦♥🌱🌏
        if t1 - time.time() > 5 * 60:
            config.bot_status = 'WAITING_FOR_FIRST_HAND'
            fix_game_disruption('This hand last more than 5 minutes')
        config.new_hand = hand_is_ended()
        if config.new_hand:
            shout("appending hand data to csv file", color='on_green')
            append_new_line_to_csv(config.csv_path)
            shout("-------- Hand ended --------", color='on_green')
            break
        if game_is_paused():
            fix_game_disruption('game is unpaused')
            break
        if config.bot_status != 'I_AM_PLAYING':
            break
Exemple #6
0
def number_of_clicks_on_button(button_name, number):  # Number of clicks
    # for plus and minus buttons
    #global game_position, just_do_check_fold , my_seat_number , MY_PROFILE_NAME , bot_status

    number = int(number)
    if pm.button_pixel(config.game_position, button_name):
        for i in range(number):
            click(button_name)
    else:
        time0 = time.time()
        fix_game_disruption("button %s is not visible" % button_name)
        time1 = time.time() - time0
        if config.bot_status == 'WAITING_FOR_FIRST_HAND':
            return None
        elif config.just_do_check_fold == True:
            if pm.button_pixel(config.game_position, 'check'):
                click('check')
            elif pm.button_pixel(config.game_position, 'fold'):
                click('fold')
            else:
                screenshot_error("check and fold buttons are not visible")
        if pm.player_cards_pixel(config.game_position,  config.my_seat_number ) \
        and pm.button_pixel(config.game_position, button_name) and time1 <= 10 :
            for i in range(number):
                click(button_name)
        else:
            set_just_do_check_fold_to_true(
                "There is problem on clicking on button %s" % button_name)
Exemple #7
0
def wait_for_sb_b_d_buttons(waiting_seconds=5):
    """5 seconds waiting does not need new_hand to break it"""
    t1 = time.time()
    while True:
        if sb_b_d_buttons_are_founded():
            break
        if time.time() - t1 > waiting_seconds:
            fix_game_disruption('buttons are not founded')
            if not sb_b_d_buttons_are_founded():
                set_just_do_check_fold_to_true('buttons are not founded')
            break
Exemple #8
0
def wait_celebration_ends(waiting_seconds=10):
    global new_hand

    t1 = time.time()
    while True:
        new_hand = hand_is_ended()
        if not new_hand:
            break
        if time.time() - t1 > waiting_seconds:
            fix_game_disruption('game is stuck at celebration')
            break
    # sleep time so buttons and cards are dealt properly
    time.sleep(1)
Exemple #9
0
def click_on_button(button_name):
    # for call, check, fold, bet, raise,
    # exit, menu, rebuy_menu,
    # exit_yes, leave_next_hand_ok, buy_in, and re_buy buttons.
    #global game_position, just_do_check_fold , my_seat_number , MY_PROFILE_NAME , bot_status

    if pm.button_pixel(config.game_position, button_name):
        click(button_name)
        if button_name == 'exit':
            config.bot_status = 'ON_MAIN_MENU'

    else:

        if button_name in ('call', 'check', 'fold', 'bet', 'raise'):

            time0 = time.time()
            fix_game_disruption("button %s is not visible" % button_name)
            time1 = time.time() - time0
            if config.bot_status == 'WAITING_FOR_FIRST_HAND':
                return None
            elif config.just_do_check_fold == True:
                if pm.button_pixel(config.game_position, 'check'):
                    click('check')
                elif pm.button_pixel(config.game_position, 'fold'):
                    click('fold')
                else:
                    screenshot_error("check and fold buttons are not visible")
            elif pm.player_cards_pixel(config.game_position, config.my_seat_number ) \
            and pm.button_pixel(config.game_position, button_name) and time1 <= 10 :
                click(button_name)  #new function
            else:
                set_just_do_check_fold_to_true(
                    "There is problem on clicking on button %s" % button_name)

        elif button_name in ('exit', 'menu', 'rebuy_menu'):

            fix_game_disruption("button %s is not visible" % button_name)
            if pm.button_pixel(config.game_position, button_name):
                click(button_name)
                if button_name == 'exit':
                    config.bot_status = 'ON_MAIN_MENU'
            else:
                raise_exception_the_problem("button %s is not visible" %
                                            button_name)

        elif button_name in ('exit_yes', 'leave_next_hand_ok', 'buy_in',
                             're_buy'):

            raise_exception_the_problem("button %s is not visible" %
                                        button_name)
Exemple #10
0
def wait_hand_ends(waiting_minutes = 5):
    t1 = time.time()
    while True:
        c.new_hand = hand_is_ended()
        if c.new_hand:
            declare_the_winners()
            wait_celebration_ends(waiting_seconds = 10)
            break
        if time.time() - t1 > 60 * waiting_minutes :
            shout('This hand is played manually more than %s minutes' 
                  %waiting_minutes)
            break
        if game_is_paused():
            fix_game_disruption('game is unpaused')
            break 
Exemple #11
0
def wait_for_my_new_hand(waiting_minutes=10):
    global new_hand

    shout("Looking for my cards in 'I_AM_PLAYING' Section...",
          color='light_magenta')
    t1 = time.time()
    while True:
        if pm.player_cards_pixel(config.game_position, config.my_seat_number):
            shout("My cards are founded", color='light_magenta')
            config.preflop_stage = True
            break
        new_hand = hand_is_ended()
        if not new_hand:
            break
        if time.time() - t1 > 60 * waiting_minutes:
            fix_game_disruption('buttons are not founded')
            break
Exemple #12
0
def read_and_save_turn_card():
    #global game_position, board_card_4th , just_do_check_fold , my_seat_number , MY_PROFILE_NAME , bot_status

    config.board_card_4th = read_cards.read_turn_card(config.game_position)

    if 'Unknown' in config.board_card_4th:

        fix_game_disruption("Turn card is read 'Unknown'")
        config.board_card_4th = read_cards.read_turn_card(config.game_position)

        if ('Unknown' in config.board_card_4th
                or not pm.turn_pixel(config.game_position)
                or pm.river_pixel(config.game_position)):

            set_just_do_check_fold_to_true("Turn card is read 'Unknown' again")

    shout("Turn card is: %s" % (config.board_card_4th[0]), color='green')
Exemple #13
0
def check_fold():
    #global game_position, just_do_check_fold , my_seat_number , MY_PROFILE_NAME , bot_status
    if pm.button_pixel(config.game_position, 'check'):
        click('check')
    elif pm.button_pixel(config.game_position, 'fold'):
        click('fold')
    else:

        fix_game_disruption("check_fold()")
        if config.bot_status != 'I_AM_PLAYING':
            return None
        elif pm.button_pixel(config.game_position, 'check'):
            click('check')
        elif pm.button_pixel(config.game_position, 'fold'):
            click('fold')
        else:
            set_just_do_check_fold_to_true("check_fold()(It's already True)")
            screenshot_error("check and fold buttons are not visible")
Exemple #14
0
def wait_new_hand_starts_when_observing(waiting_minutes=30):
    shout('waiting new hand starts by looking for dealer button...')
    t1 = time.time()
    fixing_retry = 1
    while True:
        if sb_b_d_buttons_are_founded():
            break
        if (time.time() - t1) > (
            (60 * waiting_minutes) / 4) and fixing_retry <= 1:
            fixing_retry += 1
            fix_game_disruption()
        if time.time() - t1 > 60 * waiting_minutes:
            c.bot_status = 'ON_MAIN_MENU'
            shout("No one join the table after %s minutes, "\
                  "call operator to go to main menu" %waiting_minutes)
            break
        if game_is_paused():
            fix_game_disruption('game is unpaused')
            break
Exemple #15
0
def read_and_save_my_cards():
    #global game_position, my_1th_card , my_2th_card  , just_do_check_fold , my_seat_number , MY_PROFILE_NAME , bot_status

    config.my_1th_card, config.my_2th_card =\
    read_cards.read_my_cards(config.game_position, config.my_seat_number)

    if ('Unknown' in config.my_1th_card or 'Unknown' in config.my_2th_card):

        fix_game_disruption("my cards are read Unknown")
        config.my_1th_card, config.my_2th_card =\
        read_cards.read_my_cards(config.game_position, config.my_seat_number)

        if ('Unknown' in config.my_1th_card or 'Unknown' in config.my_2th_card
                or pm.flop_pixel(config.game_position)):

            set_just_do_check_fold_to_true("my cards are read Unknown again")

    shout("My cards are: %s, %s" % (config.my_1th_card, config.my_2th_card),
          color='green')
Exemple #16
0
def observing_a_hand():
    """Use wait_hand_ends_when_observing() before all breaks, 
    except one which ended without any problem.
    """

    set_seats_not_folded_dictionary()
    acted_players = 0
    t1 = time.time()
    while True:
        if shifted_to_next_stage():
            acted_players = 0
            read_board_cards()
            if not stages_are_sequenced():
                shout("Stages are not sequenced", color='on_light_red')
                screenshot_error('stages are not sequenced')
                wait_hand_ends_when_observing(waiting_minutes=30)
                break  # new line
        seat_to_report = find_seat_to_report(acted_players)
        if ready_to_report(seat_to_report):
            acted_players += 1
            report_the_player(seat_to_report)  #🗺️ 💎♣💎♠💎♦💎♥💎 🗺️
            #update_betting_rounds()
            #read_and_save_bets()
        if t1 - time.time() > 5 * 60:
            c.bot_status = 'WAITING_FOR_FIRST_HAND'
            fix_game_disruption('This hand last more than 5 minutes')
            wait_hand_ends_when_observing(waiting_minutes=30)
            break  # new line
        c.new_hand = hand_is_ended()
        if c.new_hand:
            declare_the_winners()
            wait_celebration_ends(waiting_seconds=10)
            # Hand is ended without any problem. Save statistical data here.
            shout('I should save statistical data here later.', 'rainbow')
            shout("-------- Hand ended --------", color='on_green')
            break
        if c.bot_status != 'OBSERVING':  # will not be used
            break
        if game_is_paused():
            fix_game_disruption('game is unpaused')
            if c.bot_status == 'OBSERVING':
                wait_hand_ends_when_observing(waiting_minutes=30)
            break
Exemple #17
0
def bot_is_playing():
    while True:
        config.new_hand = hand_is_ended()
        if config.new_hand:
            declare_the_winners()
            wait_celebration_ends(waiting_seconds=10)
        config.hand_number += 1
        reset_table_information()
        shout("* bot_status == 'I_AM_PLAYING' *", color='on_green')
        wait_for_my_new_hand(waiting_minutes=10)
        # use this statement after functions which use fix_game_disruption()
        if config.bot_status != 'I_AM_PLAYING':
            break
        # use this statement after waiting functions
        # which uses config.new_hand = hand_is_ended()
        if config.new_hand:
            continue
        shout("-------- New Hand Started --------", color='on_green')
        wait_for_sb_b_d_buttons(waiting_seconds=5)
        if config.bot_status != 'I_AM_PLAYING':
            break
        determine_small_big_dealer_seats()
        determine_playing_seats()
        # In case bot is resumed:
        if not first_round_at_preflop():
            set_just_do_check_fold_to_true("program must've started "\
                                           "again from middle of the game")
        read_and_save_my_cards()
        rebuy_if_bank_is_low(min_blinds=15)
        read_and_save_banks_and_names()
        if config.bot_status != 'I_AM_PLAYING':
            break
        play_sound_for_good_starting_hands()
        shout("Waiting for my turn at preflop_stage...", 'light_magenta')
        # Playing a whole hand in this loop
        play_a_hand()
        if config.bot_status != 'I_AM_PLAYING':
            break
        if config.new_hand:
            continue
        if game_is_paused():
            fix_game_disruption('game is unpaused')
            break
Exemple #18
0
def bot_is_playing():
    while True:
        config.new_hand = hand_is_ended()
        if config.new_hand: 
            declare_the_winners()
            wait_celebration_ends(waiting_seconds = 10)
        reset_table_information()
        shout("* bot_status == 'I_AM_PLAYING' *")
        wait_for_my_new_hand(waiting_minutes = 10)
        # use this statement after functions which use fix_game_disruption()
        if config.bot_status != 'I_AM_PLAYING': 
            break
        # use this statement after waiting functions 
        # which uses config.new_hand = hand_is_ended()
        if config.new_hand: 
            continue
        shout ("-------- New Hand Started --------", color = 'on_green')
        wait_for_sb_b_d_buttons(waiting_seconds = 5) 
        if config.bot_status != 'I_AM_PLAYING': 
            break
        determine_small_big_dealer_seats()
        read_and_save_my_cards()
        rebuy_if_bank_is_low(min_blinds = 15)
        read_and_save_banks_and_names()
        if config.bot_status != 'I_AM_PLAYING': 
            break
        play_sound_for_good_starting_hands()

        shout("Waiting for my turn at preflop_stage...", 'light_magenta') 
        t1 = time.time()
        # Playing a whole hand in this loop
        play_a_hand()
        if config.bot_status != 'I_AM_PLAYING':
            break
        if config.new_hand: 
            continue
        if game_is_paused():
            input("press Enter to start again...") 
            fix_game_disruption('game is unpaused')
            break 
Exemple #19
0
def bot_is_waiting_till_next_hand():
    """
    Bot is suspended automatically from decide.py module for a hand 
    so operator can play that hand manually.
    This situation should happen when decision_making package is 
    *under construction* and can not play some scenarios. 
    The bot_status is change to 'OPERATOR_IS_PLAYING_THE_HAND' in 
    decide.py module so that the operator plays the hand.
    In this bot_status, the bot will not look for buttons and will not run 
    fix_game_disruption() anymore. The bot just waits for the next hand.

    #IMPORTANT# 
    If this bot_status is added to decide function at decide.py, bot will 
    acts like a copilot and operator must always beware and plays some hands 
    beside the bot.
    """
    shout("* bot_status == 'OPERATOR_SHOULD_PLAY_THE_HAND' *",
          color='on_green')
    sound('Play yourself')
    shout('OPERATOR MUST PLAY THIS HAND!', color='rainbow', save=False)
    wait_hand_ends(waiting_minutes=5)
    config.bot_status = 'WAITING_FOR_FIRST_HAND'
    fix_game_disruption("Game was played manually for a hand")
Exemple #20
0
def wait_hand_ends_when_observing(waiting_minutes=5):
    shout('waiting till current hand ends...')
    t1 = time.time()
    fixing_retry = 1
    while True:
        c.new_hand = hand_is_ended()
        if c.new_hand:
            declare_the_winners()
            wait_celebration_ends(waiting_seconds=10)
            shout("-------- Hand ended --------", color='on_green')
            break
        if (time.time() - t1) > (
            (60 * waiting_minutes) / 4) and fixing_retry <= 1:
            fixing_retry += 1
            fix_game_disruption()
        if time.time() - t1 > 60 * waiting_minutes:
            c.bot_status = 'ON_MAIN_MENU'
            shout("No hand ending after %s minutes, "\
                  "call operator to go to main menu" %waiting_minutes)
            break
        if game_is_paused():
            fix_game_disruption('game is unpaused')
            break
Exemple #21
0
def wait_for_my_new_hand(waiting_minutes = 10):
    shout("Looking for my cards in 'I_AM_PLAYING' Section..."
          , color = 'light_magenta')
    t1 = time.time()
    while True:
        if pm.player_cards_pixel(c.game_position, c.my_seat_number):
            shout("My cards are founded", color = 'light_magenta')
            c.preflop_stage = True
            break
        # 2021: It's not reasonable to break here at all. 
        # So I comment these 3 lines:
        #c.new_hand = hand_is_ended()
        #if not c.new_hand:
        #    break
        if time.time() - t1 > 60*waiting_minutes:
            fix_game_disruption('My cards are not founded for new hand '\
                                'after %s minutes wating'%waiting_minutes)
            if not pm.player_cards_pixel(c.game_position, 
                                         c.my_seat_number):
                c.bot_status = 'WAITING_FOR_FIRST_HAND'
            break
        if game_is_paused():
            fix_game_disruption('game is unpaused')
            break 
Exemple #22
0
def wait_for_my_first_hand(waiting_minutes = 5):
    """Don't break this waiting function if c.new_hand is True, because 
    I'm waiting for first hand and maybe several hands are played without me.
    """
    shout("Looking for cards in 'WAITING_FOR_FIRST_HAND' Section..."
          , color = 'light_magenta')
    t1 = time.time()
    fixing_retry = 1
    while True:

        if pm.player_cards_pixel(c.game_position, c.my_seat_number):
            shout("My cards are founded", color = 'light_magenta')
            c.bot_status = 'I_AM_PLAYING'
            break
        if (time.time()-t1) > ((60*waiting_minutes)/3) and fixing_retry <= 1:
            fixing_retry += 1
            fix_game_disruption()
        if time.time() - t1 > 60 * waiting_minutes :
            c.bot_status = 'ON_MAIN_MENU'
            shout("No one join the table, call operator to go to main menu")
            break
        if game_is_paused():
            fix_game_disruption('game is unpaused')
            break 
Exemple #23
0
def raising(Blinds):
    """ 
    Act for both raising and betting 
    Blinds is the amount of money like in ocr; not the number of blinds
    if Blinds == BLIND_VALUE (or less): won't click on plus button
    """
    #global game_position, just_do_check_fold , my_seat_number , MY_PROFILE_NAME , bot_status,\
    #preflop_stage , flop_stage , turn_stage , river_stage , did_i_raised_at , my_last_raise_at , BLIND_VALUE

    if config.preflop_stage == True and config.flop_stage == False:
        stage = "Pre_Flop"
    elif config.flop_stage == True and config.turn_stage == False:
        stage = "Flop"
    elif config.turn_stage == True and config.river_stage == False:
        stage = "Turn"
    elif config.river_stage == True:
        stage = "River"

    config.did_i_raised_at[stage] = True

    Bets = [
        last_bets_cache[Seat] for Seat in range(1, config.TOTAL_SEATS + 1)
        if last_red_chips_cache[Seat] and last_bets_cache[Seat] != None
    ]

    if config.preflop_stage and not config.flop_stage:
        Bets.append(config.BLIND_VALUE)
    else:
        Bets.append(
            0
        )  #That's why raising() algorithm can be use and act for betting too.

    Bets.sort(reverse=True)

    Raise_base = max(Bets)

    Bets_difference = [Bets[i] - Bets[i + 1] for i in range(len(Bets) - 1)]

    if Bets_difference == []:
        Raise_add = config.BLIND_VALUE
    elif max(Bets_difference) <= config.BLIND_VALUE:
        Raise_add = config.BLIND_VALUE
    else:
        Raise_add = max(Bets_difference)

    if Blinds > Raise_base + Raise_add:
        config.my_last_raise_at[stage] = Blinds
    else:
        config.my_last_raise_at[stage] = Raise_base + Raise_add

    number_of_clicks_on_button('plus', (Blinds - (Raise_base + Raise_add)) //
                               config.BLIND_VALUE)
    #Till here as same as raising()

    if pm.button_pixel(config.game_position, 'raise'):
        click('raise')
    elif pm.button_pixel(config.game_position, 'bet'):
        click('bet')
    else:

        fix_game_disruption("RAISE() Button, No Raise nor Bet Button founded")
        if pm.button_pixel(config.game_position, 'raise'):
            click('raise')
        elif pm.button_pixel(config.game_position, 'bet'):
            click('bet')
        else:
            set_just_do_check_fold_to_true("No raise nor bet button founded")
Exemple #24
0
        shout("Waiting for my turn at preflop_stage...", 'light_magenta')
        t1 = time.time()
        # Playing a whole hand in this loop
        while True:
            if shifted_to_next_stage():
                read_board_cards()
                if not stages_are_sequenced():
                    set_just_do_check_fold_to_true('stages are not sequenced')
                    screenshot_error('stages are not sequenced')
            if its_my_turn():
                update_betting_rounds()
                read_and_save_bets()
                if config.bot_status == 'I_AM_PLAYING':
                    click_decision()
            if t1 - time.time() > 5 * 60:
                fix_game_disruption('This hand last more than 5 minutes')
            new_hand = hand_is_ended()
            if new_hand:
                shout("-------- Hand ended --------", color='on_green')
                break
            if config.bot_status != 'I_AM_PLAYING':
                break

    else:
        # Develop 'OBSERVING' status for bot_status later.
        # 'OBSERVING' status can be used to test screen monitoring or to
        # get opponents playing styles or to gather statistical data.
        raise Exception("bot_status is can be only 'ON_MAIN_MENU' or "\
                        "'WAITING_FOR_FIRST_HAND' or 'I_AM_PLAYING'")