commit d54b1a07e7f8aceedaffb599da1b2937587c2e22 Author: bobey6 Date: Wed May 14 12:34:46 2025 -0400 Add files via upload diff --git a/dig.py b/dig.py new file mode 100644 index 0000000..e67ba42 --- /dev/null +++ b/dig.py @@ -0,0 +1,236 @@ +import pyautogui +import time +import pygame +import datetime +import pytz +import sys +from threading import Thread, Event +import signal + +# Initialize pygame for audio playback +pygame.mixer.init() + +# Global flag to control the main loop +running = True +stop_event = Event() + +def signal_handler(sig, frame): + """Handle Ctrl+C to gracefully exit the script""" + global running + print("\nCtrl+C detected! Exiting script...") + running = False + stop_event.set() + sys.exit(0) + +# Set up the signal handler +signal.signal(signal.SIGINT, signal_handler) + +def get_est_timestamp(): + """Get current timestamp in EST timezone""" + est = pytz.timezone('US/Eastern') + utc_now = datetime.datetime.now(pytz.utc) + est_now = utc_now.astimezone(est) + return est_now.strftime('%Y-%m-%d %H:%M:%S EST') + +def countdown_timer(seconds, step_name, stop_event): + """Display a countdown timer for a given step""" + start_time = time.time() + while time.time() - start_time < seconds and not stop_event.is_set(): + remaining = int(seconds - (time.time() - start_time)) + print(f"\r{step_name} - Time remaining: {remaining} seconds", end="") + time.sleep(0.5) + print() # New line after countdown finishes + +def start_countdown(seconds, step_name): + """Start a countdown timer in a separate thread""" + countdown_thread = Thread(target=countdown_timer, args=(seconds, step_name, stop_event)) + countdown_thread.daemon = True + countdown_thread.start() + return countdown_thread + +def find_image(image_names, confidence=0.8, timeout=60, click_type=None, show_countdown=True): + """ + Look for specified images on the screen + + Args: + image_names: List of image filenames to search for + confidence: Confidence threshold for image recognition + timeout: How long to search before giving up (seconds) + click_type: None, 'single', or 'double' + show_countdown: Whether to show countdown timer + + Returns: + (found_image_name, location) or (None, None) if timeout + """ + if isinstance(image_names, str): + image_names = [image_names] + + if show_countdown: + countdown_thread = start_countdown( + timeout, + f"Looking for {', '.join(image_names)}" + ) + + start_time = time.time() + while time.time() - start_time < timeout and running: + for img_name in image_names: + try: + location = pyautogui.locateCenterOnScreen(img_name, confidence=confidence) + if location: + print(f"\n{get_est_timestamp()} Found {img_name} with confidence {confidence}") + + if click_type == 'single': + pyautogui.click(location) + print(f"{get_est_timestamp()} Single clicked {img_name}") + elif click_type == 'double': + pyautogui.doubleClick(location) + print(f"{get_est_timestamp()} Double clicked {img_name}") + + stop_event.set() # Stop any running countdown + time.sleep(0.5) # Brief pause after action + stop_event.clear() # Reset the stop event + + return img_name, location + except: + # Silently continue if there's an error + pass + + # Small pause between attempts to reduce CPU usage + time.sleep(0.1) + + # If we reach here, we didn't find any image within timeout + print(f"\n{get_est_timestamp()} Could not find any of: {', '.join(image_names)}") + return None, None + +def play_sound(sound_file): + """Play a sound file using pygame""" + try: + pygame.mixer.music.load(sound_file) + pygame.mixer.music.play() + except: + print(f"{get_est_timestamp()} Could not play sound: {sound_file}") + +def main_process(): + """Main automated process loop""" + global running + + while running: + print(f"\n{get_est_timestamp()} Starting the process...") + + # Step 1: Look for dig.png or dig_bluestacks.png + print(f"{get_est_timestamp()} Looking for dig.png or dig_bluestacks.png...") + found_img, _ = find_image(['dig.png', 'dig_bluestacks.png'], confidence=0.70, timeout=60, click_type='double', show_countdown=False) + + if not running: + break + + if found_img is None: + # Timeout occurred, start over + continue + + # If we found dig_bluestacks.png, play sound and start over + if found_img == 'dig_bluestacks.png': + play_sound('dingdong.mp3') + print(f"{get_est_timestamp()} Found dig_bluestacks.png - starting over") + continue + elif found_img == 'dig.png': + play_sound('dingdong.mp3') + + # Step 2: Look for dig_cords.png or dig_cords_drone.png + found_img, _ = find_image(['dig_cords.png', 'dig_cords_drone.png'], confidence=0.70, timeout=60, click_type='double') + if found_img is None or not running: + continue # Timeout occurred, start over + + # Step 3: Look for start_digging1.png or start_digging1_drone.png + found_img, _ = find_image(['start_digging1.png', 'start_digging1_drone.png'], confidence=0.70, timeout=60, click_type='single') + if found_img is None or not running: + continue # Timeout occurred, start over + + # Step 4: Look for start_digging2.png or start_digging2_drone.png (with retry logic) + retry_count = 0 + while retry_count < 2 and running: + found_img, _ = find_image(['start_digging2.png', 'start_digging2_drone.png'], confidence=0.75, timeout=15, click_type='double') + if found_img: + break + + if not running: + break + + # If not found, go back and click start_digging1 again + print(f"{get_est_timestamp()} Going back to start_digging1...") + found_img, _ = find_image(['start_digging1.png', 'start_digging1_drone.png'], confidence=0.70, timeout=60, click_type='single') + if found_img is None: + break # If we can't find it, break the retry loop and start over + + retry_count += 1 + + if found_img is None or not running: + continue # Timeout occurred, start over + + # Step 5: Look for start_digging3.png (with retry logic) + retry_count = 0 + while retry_count < 2 and running: + found_img, _ = find_image('start_digging3.png', confidence=0.75, timeout=8, click_type='double') + if found_img: + break + + if not running: + break + + # If not found, go back and click start_digging2 again + print(f"{get_est_timestamp()} Going back to start_digging2...") + found_img, _ = find_image(['start_digging2.png', 'start_digging2_drone.png'], confidence=0.75, timeout=60, click_type='double') + if found_img is None: + break # If we can't find it, break the retry loop and start over + + retry_count += 1 + + if found_img is None or not running: + continue # Timeout occurred, start over + + # Step 6: Look for start_digging4.png every 50ms, wait up to 5 minutes + print(f"{get_est_timestamp()} Looking for start_digging4.png (checking every 50ms, waiting up to 5 minutes)...") + start_time = time.time() + found = False + + # Start countdown for this longer wait + countdown_thread = start_countdown(300, "Looking for start_digging4.png") + + while time.time() - start_time < 300 and running and not found: # 5 minutes = 300 seconds + try: + location = pyautogui.locateCenterOnScreen('start_digging4.png', confidence=0.75) + if location: + print(f"\n{get_est_timestamp()} Found start_digging4.png with confidence 0.75") + pyautogui.doubleClick(location) + print(f"{get_est_timestamp()} Double clicked start_digging4.png") + found = True + stop_event.set() # Stop the countdown + time.sleep(0.5) + stop_event.clear() + break + except: + pass + time.sleep(0.05) # 50 milliseconds + + if not found or not running: + continue # Timeout occurred, start over + + # Step 7: Look for finish_digging.png + found_img, _ = find_image('finish_digging.png', confidence=0.8, timeout=60, click_type='single') + if found_img is None or not running: + continue # Timeout occurred, start over + + print(f"{get_est_timestamp()} Completed one cycle, starting over...") + +if __name__ == "__main__": + print(f"{get_est_timestamp()} Starting dig automation script") + print("Press Ctrl+C to exit") + + try: + main_process() + except KeyboardInterrupt: + print("\nExiting script...") + except Exception as e: + print(f"An unexpected error occurred: {e}") + finally: + pygame.quit()