computer-use-ootb-internal 0.0.178__py3-none-any.whl → 0.0.180__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- computer_use_ootb_internal/app_teachmode.py +651 -644
- computer_use_ootb_internal/computer_use_demo/animation/test_animation.py +39 -39
- computer_use_ootb_internal/guard_service.py +950 -950
- computer_use_ootb_internal/preparation/excel_prepare.py +99 -0
- computer_use_ootb_internal/preparation/powerpoint_prepare.py +99 -73
- computer_use_ootb_internal/preparation/pr_prepare.py +101 -0
- computer_use_ootb_internal/preparation/star_rail_prepare.py +99 -99
- computer_use_ootb_internal/preparation/word_prepare.py +99 -0
- computer_use_ootb_internal/run_teachmode_ootb_args.py +237 -235
- computer_use_ootb_internal/service_manager.py +194 -194
- computer_use_ootb_internal/signal_connection.py +47 -47
- computer_use_ootb_internal/{test_click_0425.py → test_autogui.py} +96 -58
- {computer_use_ootb_internal-0.0.178.dist-info → computer_use_ootb_internal-0.0.180.dist-info}/METADATA +9 -8
- {computer_use_ootb_internal-0.0.178.dist-info → computer_use_ootb_internal-0.0.180.dist-info}/RECORD +16 -13
- computer_use_ootb_internal-0.0.180.dist-info/entry_points.txt +4 -0
- computer_use_ootb_internal-0.0.178.dist-info/entry_points.txt +0 -2
- {computer_use_ootb_internal-0.0.178.dist-info → computer_use_ootb_internal-0.0.180.dist-info}/WHEEL +0 -0
@@ -0,0 +1,99 @@
|
|
1
|
+
import os
|
2
|
+
import platform
|
3
|
+
import subprocess
|
4
|
+
import logging
|
5
|
+
from pathlib import Path
|
6
|
+
import time
|
7
|
+
|
8
|
+
log = logging.getLogger(__name__)
|
9
|
+
|
10
|
+
def run_preparation(state):
|
11
|
+
"""
|
12
|
+
Performs environment preparation specific to Excel on Windows.
|
13
|
+
Opens a specific template file located on the user's desktop and maximizes the window.
|
14
|
+
Kills existing Excel processes first.
|
15
|
+
"""
|
16
|
+
if platform.system() != "Windows":
|
17
|
+
log.warning("Excel preparation skipped: Not running on Windows.")
|
18
|
+
return
|
19
|
+
|
20
|
+
log.info(f"Excel preparation: Starting on Windows platform...")
|
21
|
+
|
22
|
+
try:
|
23
|
+
# Determine the desktop path for Windows
|
24
|
+
try:
|
25
|
+
username = os.environ.get("USERNAME", "")
|
26
|
+
if not username:
|
27
|
+
log.error("Could not determine Windows username from environment")
|
28
|
+
return
|
29
|
+
|
30
|
+
log.info(f"Using Windows username: {username}")
|
31
|
+
desktop_path = Path(f"C:/Users/{username}/Desktop")
|
32
|
+
|
33
|
+
if not desktop_path.exists():
|
34
|
+
log.error(f"Desktop path not found at: {desktop_path}")
|
35
|
+
alt_path = Path(f"C:/Documents and Settings/{username}/Desktop")
|
36
|
+
if alt_path.exists():
|
37
|
+
desktop_path = alt_path
|
38
|
+
log.info(f"Using alternative desktop path: {desktop_path}")
|
39
|
+
else:
|
40
|
+
log.error("Failed to find user's desktop directory")
|
41
|
+
return
|
42
|
+
|
43
|
+
except Exception as e:
|
44
|
+
log.error(f"Error determining Windows user desktop: {e}", exc_info=True)
|
45
|
+
return
|
46
|
+
|
47
|
+
# Construct path to template file
|
48
|
+
template_file = desktop_path / "template.xlsx" # Changed extension
|
49
|
+
log.info(f"Looking for template file at: {template_file}")
|
50
|
+
|
51
|
+
if not template_file.exists():
|
52
|
+
log.error(f"Template file not found at: {template_file}")
|
53
|
+
return
|
54
|
+
|
55
|
+
# --- Kill existing Excel processes ---
|
56
|
+
log.info("Attempting to close existing Microsoft Excel processes...")
|
57
|
+
try:
|
58
|
+
# Command to forcefully terminate Excel processes by image name
|
59
|
+
kill_cmd = ['taskkill', '/F', '/IM', 'EXCEL.EXE'] # Changed process name
|
60
|
+
kill_result = subprocess.run(kill_cmd,
|
61
|
+
capture_output=True, text=True, check=False)
|
62
|
+
|
63
|
+
# Check taskkill result
|
64
|
+
if kill_result.returncode == 0:
|
65
|
+
log.info("Successfully sent termination signal to EXCEL.EXE processes.")
|
66
|
+
elif "not found" in kill_result.stderr.lower() or "not found" in kill_result.stdout.lower():
|
67
|
+
log.info("No running EXCEL.EXE processes found to close.")
|
68
|
+
else:
|
69
|
+
log.warning(f"taskkill command finished with return code {kill_result.returncode}. Output: {kill_result.stdout} Stderr: {kill_result.stderr}")
|
70
|
+
time.sleep(2)
|
71
|
+
except FileNotFoundError:
|
72
|
+
log.error("Error: 'taskkill' command not found. Make sure it's in the system PATH.")
|
73
|
+
except Exception as e:
|
74
|
+
log.error(f"Error occurred while trying to close Excel: {e}", exc_info=True)
|
75
|
+
# --- End of kill process ---
|
76
|
+
|
77
|
+
# Open the file with Excel maximized on Windows
|
78
|
+
log.info(f"Attempting to open {template_file} with Excel maximized on Windows...")
|
79
|
+
try:
|
80
|
+
# Use start command with /max flag on Windows
|
81
|
+
cmd = ['cmd', '/c', 'start', '/max', 'excel', str(template_file)] # Changed app name
|
82
|
+
# Temporarily commented out file opening
|
83
|
+
# result = subprocess.run(cmd, check=False, capture_output=True, text=True)
|
84
|
+
log.info(f"(Skipped) Would open file with command: {' '.join(cmd)}")
|
85
|
+
result = None # Set result to None or mock success if needed elsewhere
|
86
|
+
|
87
|
+
# if result and result.returncode == 0:
|
88
|
+
# log.info(f"Successfully launched Excel maximized with {template_file}")
|
89
|
+
# else:
|
90
|
+
# log.error(f"Error opening Excel: {result.stderr.strip() if result else 'Command not run'}")
|
91
|
+
# if result and result.stdout:
|
92
|
+
# log.error(f"Stdout from start command: {result.stdout.strip()}")
|
93
|
+
except FileNotFoundError:
|
94
|
+
log.error("Error: 'cmd' or 'start' command not found. Ensure system PATH is configured correctly.")
|
95
|
+
except Exception as e:
|
96
|
+
log.error(f"Exception opening Excel on Windows: {e}", exc_info=True)
|
97
|
+
|
98
|
+
except Exception as e:
|
99
|
+
log.error(f"An unexpected error occurred during Excel preparation: {e}", exc_info=True)
|
@@ -1,74 +1,100 @@
|
|
1
|
-
import os
|
2
|
-
import platform
|
3
|
-
import subprocess
|
4
|
-
import logging
|
5
|
-
from pathlib import Path
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
log.
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
1
|
+
import os
|
2
|
+
import platform
|
3
|
+
import subprocess
|
4
|
+
import logging
|
5
|
+
from pathlib import Path
|
6
|
+
import time
|
7
|
+
|
8
|
+
log = logging.getLogger(__name__)
|
9
|
+
|
10
|
+
def run_preparation(state):
|
11
|
+
"""
|
12
|
+
Performs environment preparation specific to PowerPoint on Windows.
|
13
|
+
Opens a specific template file located on the user's desktop and maximizes the window.
|
14
|
+
"""
|
15
|
+
if platform.system() != "Windows":
|
16
|
+
log.warning("PowerPoint preparation skipped: Not running on Windows.")
|
17
|
+
return
|
18
|
+
|
19
|
+
log.info(f"PowerPoint preparation: Starting on Windows platform...")
|
20
|
+
|
21
|
+
try:
|
22
|
+
# Determine the desktop path for Windows
|
23
|
+
try:
|
24
|
+
username = os.environ.get("USERNAME", "")
|
25
|
+
if not username:
|
26
|
+
log.error("Could not determine Windows username from environment")
|
27
|
+
return
|
28
|
+
|
29
|
+
log.info(f"Using Windows username: {username}")
|
30
|
+
desktop_path = Path(f"C:/Users/{username}/Desktop")
|
31
|
+
|
32
|
+
if not desktop_path.exists():
|
33
|
+
log.error(f"Desktop path not found at: {desktop_path}")
|
34
|
+
alt_path = Path(f"C:/Documents and Settings/{username}/Desktop")
|
35
|
+
if alt_path.exists():
|
36
|
+
desktop_path = alt_path
|
37
|
+
log.info(f"Using alternative desktop path: {desktop_path}")
|
38
|
+
else:
|
39
|
+
log.error("Failed to find user's desktop directory")
|
40
|
+
return
|
41
|
+
|
42
|
+
except Exception as e:
|
43
|
+
log.error(f"Error determining Windows user desktop: {e}", exc_info=True)
|
44
|
+
return
|
45
|
+
|
46
|
+
# Construct path to template file
|
47
|
+
template_file = desktop_path / "template.pptx"
|
48
|
+
log.info(f"Looking for template file at: {template_file}")
|
49
|
+
|
50
|
+
if not template_file.exists():
|
51
|
+
log.error(f"Template file not found at: {template_file}")
|
52
|
+
return
|
53
|
+
|
54
|
+
# --- Kill existing PowerPoint processes ---
|
55
|
+
log.info("Attempting to close existing Microsoft PowerPoint processes...")
|
56
|
+
try:
|
57
|
+
# Command to forcefully terminate PowerPoint processes by image name
|
58
|
+
kill_cmd = ['taskkill', '/F', '/IM', 'POWERPNT.EXE']
|
59
|
+
kill_result = subprocess.run(kill_cmd,
|
60
|
+
capture_output=True, text=True, check=False)
|
61
|
+
|
62
|
+
# Check taskkill result
|
63
|
+
if kill_result.returncode == 0:
|
64
|
+
log.info("Successfully sent termination signal to POWERPNT.EXE processes.")
|
65
|
+
elif "not found" in kill_result.stderr.lower() or "not found" in kill_result.stdout.lower():
|
66
|
+
log.info("No running POWERPNT.EXE processes found to close.")
|
67
|
+
else:
|
68
|
+
# Log potential issues if taskkill ran but didn't return 0 or expected "not found" message
|
69
|
+
log.warning(f"taskkill command finished with return code {kill_result.returncode}. Output: {kill_result.stdout} Stderr: {kill_result.stderr}")
|
70
|
+
# Add a small delay to allow processes to close
|
71
|
+
time.sleep(2)
|
72
|
+
except FileNotFoundError:
|
73
|
+
log.error("Error: 'taskkill' command not found. Make sure it's in the system PATH.")
|
74
|
+
except Exception as e:
|
75
|
+
# Catch other potential errors during taskkill execution
|
76
|
+
log.error(f"Error occurred while trying to close PowerPoint: {e}", exc_info=True)
|
77
|
+
# --- End of kill process ---
|
78
|
+
|
79
|
+
# Open the file with PowerPoint maximized on Windows
|
80
|
+
log.info(f"Attempting to open {template_file} with PowerPoint maximized on Windows...")
|
81
|
+
try:
|
82
|
+
# Use start command with /max flag on Windows
|
83
|
+
cmd = ['cmd', '/c', 'start', '/max', 'powerpnt', str(template_file)]
|
84
|
+
result = subprocess.run(cmd, check=False, capture_output=True, text=True)
|
85
|
+
|
86
|
+
if result.returncode == 0:
|
87
|
+
log.info(f"Successfully launched PowerPoint maximized with {template_file}")
|
88
|
+
else:
|
89
|
+
# Log stderr for debugging potential start command issues
|
90
|
+
log.error(f"Error opening PowerPoint: {result.stderr.strip()}")
|
91
|
+
# Also log stdout as start command might output info there
|
92
|
+
if result.stdout:
|
93
|
+
log.error(f"Stdout from start command: {result.stdout.strip()}")
|
94
|
+
except FileNotFoundError:
|
95
|
+
log.error("Error: 'cmd' or 'start' command not found. Ensure system PATH is configured correctly.")
|
96
|
+
except Exception as e:
|
97
|
+
log.error(f"Exception opening PowerPoint on Windows: {e}", exc_info=True)
|
98
|
+
|
99
|
+
except Exception as e:
|
74
100
|
log.error(f"An unexpected error occurred during PowerPoint preparation: {e}", exc_info=True)
|
@@ -0,0 +1,101 @@
|
|
1
|
+
import os
|
2
|
+
import platform
|
3
|
+
import subprocess
|
4
|
+
import logging
|
5
|
+
from pathlib import Path
|
6
|
+
import time
|
7
|
+
|
8
|
+
log = logging.getLogger(__name__)
|
9
|
+
|
10
|
+
def run_preparation(state):
|
11
|
+
"""
|
12
|
+
Performs environment preparation specific to Adobe Premiere Pro on Windows.
|
13
|
+
Opens a specific template project file located on the user's desktop and maximizes the window.
|
14
|
+
Kills existing Premiere Pro processes first.
|
15
|
+
"""
|
16
|
+
if platform.system() != "Windows":
|
17
|
+
log.warning("Premiere Pro preparation skipped: Not running on Windows.")
|
18
|
+
return
|
19
|
+
|
20
|
+
log.info(f"Premiere Pro preparation: Starting on Windows platform...")
|
21
|
+
|
22
|
+
try:
|
23
|
+
# Determine the desktop path for Windows
|
24
|
+
try:
|
25
|
+
username = os.environ.get("USERNAME", "")
|
26
|
+
if not username:
|
27
|
+
log.error("Could not determine Windows username from environment")
|
28
|
+
return
|
29
|
+
|
30
|
+
log.info(f"Using Windows username: {username}")
|
31
|
+
desktop_path = Path(f"C:/Users/{username}/Desktop")
|
32
|
+
|
33
|
+
if not desktop_path.exists():
|
34
|
+
log.error(f"Desktop path not found at: {desktop_path}")
|
35
|
+
alt_path = Path(f"C:/Documents and Settings/{username}/Desktop")
|
36
|
+
if alt_path.exists():
|
37
|
+
desktop_path = alt_path
|
38
|
+
log.info(f"Using alternative desktop path: {desktop_path}")
|
39
|
+
else:
|
40
|
+
log.error("Failed to find user's desktop directory")
|
41
|
+
return
|
42
|
+
|
43
|
+
except Exception as e:
|
44
|
+
log.error(f"Error determining Windows user desktop: {e}", exc_info=True)
|
45
|
+
return
|
46
|
+
|
47
|
+
# Construct path to template file
|
48
|
+
template_file = desktop_path / "template.prproj" # Changed extension
|
49
|
+
log.info(f"Looking for template file at: {template_file}")
|
50
|
+
|
51
|
+
if not template_file.exists():
|
52
|
+
log.error(f"Template file not found at: {template_file}")
|
53
|
+
return
|
54
|
+
|
55
|
+
# --- Kill existing Premiere Pro processes ---
|
56
|
+
log.info("Attempting to close existing Adobe Premiere Pro processes...")
|
57
|
+
try:
|
58
|
+
# Command to forcefully terminate Premiere Pro processes by image name
|
59
|
+
# Assuming the process name includes the year for 2024 version.
|
60
|
+
kill_cmd = ['taskkill', '/F', '/IM', 'Adobe Premiere Pro 2024.exe'] # Updated process name
|
61
|
+
kill_result = subprocess.run(kill_cmd,
|
62
|
+
capture_output=True, text=True, check=False)
|
63
|
+
|
64
|
+
# Check taskkill result
|
65
|
+
if kill_result.returncode == 0:
|
66
|
+
log.info("Successfully sent termination signal to Adobe Premiere Pro 2024.exe processes.")
|
67
|
+
elif "not found" in kill_result.stderr.lower() or "not found" in kill_result.stdout.lower():
|
68
|
+
log.info("No running Adobe Premiere Pro 2024.exe processes found to close.")
|
69
|
+
else:
|
70
|
+
log.warning(f"taskkill command finished with return code {kill_result.returncode}. Output: {kill_result.stdout} Stderr: {kill_result.stderr}")
|
71
|
+
time.sleep(2) # Increased sleep time slightly for potentially heavier app
|
72
|
+
except FileNotFoundError:
|
73
|
+
log.error("Error: 'taskkill' command not found. Make sure it's in the system PATH.")
|
74
|
+
except Exception as e:
|
75
|
+
log.error(f"Error occurred while trying to close Premiere Pro: {e}", exc_info=True)
|
76
|
+
# --- End of kill process ---
|
77
|
+
|
78
|
+
# Open the file with Premiere Pro maximized on Windows
|
79
|
+
log.info(f"Attempting to open {template_file} with Premiere Pro maximized on Windows...")
|
80
|
+
try:
|
81
|
+
# Use start command with /max flag on Windows.
|
82
|
+
# Assuming the application name for start command includes the year.
|
83
|
+
cmd = ['cmd', '/c', 'start', '/max', '"Adobe Premiere Pro 2024"', str(template_file)] # Updated app name, kept quotes
|
84
|
+
# Temporarily commented out file opening
|
85
|
+
# result = subprocess.run(cmd, check=False, capture_output=True, text=True)
|
86
|
+
log.info(f"(Skipped) Would open file with command: {' '.join(cmd)}")
|
87
|
+
result = None # Set result to None or mock success if needed elsewhere
|
88
|
+
|
89
|
+
# if result and result.returncode == 0:
|
90
|
+
# log.info(f"Successfully launched Premiere Pro maximized with {template_file}")
|
91
|
+
# else:
|
92
|
+
# log.error(f"Error opening Premiere Pro: {result.stderr.strip() if result else 'Command not run'}")
|
93
|
+
# if result and result.stdout:
|
94
|
+
# log.error(f"Stdout from start command: {result.stdout.strip()}")
|
95
|
+
except FileNotFoundError:
|
96
|
+
log.error("Error: 'cmd' or 'start' command not found. Ensure system PATH is configured correctly.")
|
97
|
+
except Exception as e:
|
98
|
+
log.error(f"Exception opening Premiere Pro on Windows: {e}", exc_info=True)
|
99
|
+
|
100
|
+
except Exception as e:
|
101
|
+
log.error(f"An unexpected error occurred during Premiere Pro preparation: {e}", exc_info=True)
|
@@ -1,100 +1,100 @@
|
|
1
|
-
# src/computer_use_ootb_internal/preparation/star_rail_prepare.py
|
2
|
-
import time
|
3
|
-
import platform
|
4
|
-
import subprocess # Added for taskkill
|
5
|
-
import pyautogui
|
6
|
-
import webbrowser
|
7
|
-
import logging # Use logging instead of print for better practice
|
8
|
-
|
9
|
-
# Set up logging for this module if needed, or rely on root logger
|
10
|
-
log = logging.getLogger(__name__)
|
11
|
-
|
12
|
-
def run_preparation(state):
|
13
|
-
"""
|
14
|
-
Performs environment preparation specific to Star Rail on Windows.
|
15
|
-
Closes existing Edge browsers, opens the specified URL in a new Edge instance,
|
16
|
-
and performs initial clicks.
|
17
|
-
"""
|
18
|
-
if platform.system() != "Windows":
|
19
|
-
log.info("Star Rail preparation skipped: Not running on Windows.")
|
20
|
-
return
|
21
|
-
|
22
|
-
log.info("Star Rail preparation: Starting environment setup on Windows...")
|
23
|
-
url = "https://sr.mihoyo.com/cloud/#/" # Consider making this configurable later
|
24
|
-
browser_opened = False
|
25
|
-
try:
|
26
|
-
# Attempt to close existing Microsoft Edge processes
|
27
|
-
log.info("Attempting to close existing Microsoft Edge processes...")
|
28
|
-
try:
|
29
|
-
# /F forces termination, /IM specifies image name
|
30
|
-
result = subprocess.run(['taskkill', '/F', '/IM', 'msedge.exe'],
|
31
|
-
capture_output=True, text=True, check=False)
|
32
|
-
if result.returncode == 0:
|
33
|
-
log.info("Successfully sent termination signal to msedge.exe processes.")
|
34
|
-
elif "not found" in result.stderr.lower() or "not found" in result.stdout.lower():
|
35
|
-
log.info("No running msedge.exe processes found to close.")
|
36
|
-
else:
|
37
|
-
log.warning(f"taskkill command finished with return code {result.returncode}. Output: {result.stdout} Stderr: {result.stderr}")
|
38
|
-
time.sleep(2) # Give processes time to close
|
39
|
-
except FileNotFoundError:
|
40
|
-
log.error("Error: 'taskkill' command not found. Make sure it's in the system PATH.")
|
41
|
-
except Exception as e:
|
42
|
-
log.error(f"Error occurred while trying to close Edge: {e}", exc_info=True)
|
43
|
-
|
44
|
-
# Use only webbrowser.open
|
45
|
-
log.info(f"Attempting to open {url} using webbrowser.open()...")
|
46
|
-
if webbrowser.open(url):
|
47
|
-
log.info(f"Successfully requested browser to open {url} via webbrowser.open().")
|
48
|
-
browser_opened = True
|
49
|
-
# Ensure sleep time for browser load before clicks is present
|
50
|
-
time.sleep(5)
|
51
|
-
else:
|
52
|
-
log.warning("webbrowser.open() returned False, indicating potential failure.")
|
53
|
-
|
54
|
-
if not browser_opened:
|
55
|
-
log.error("Failed to confirm browser opening via webbrowser.open(). Will still attempt clicks.")
|
56
|
-
|
57
|
-
# Add pyautogui click after attempting to open the browser
|
58
|
-
log.info("Proceeding with pyautogui actions...")
|
59
|
-
time.sleep(5) # Wait time for the browser to load
|
60
|
-
|
61
|
-
# Get screen size
|
62
|
-
screen_width, screen_height = pyautogui.size()
|
63
|
-
log.info(f"Detected screen size: {screen_width}x{screen_height}")
|
64
|
-
|
65
|
-
# Calculate click coordinates based on a reference resolution (e.g., 1280x720)
|
66
|
-
# TODO: Make these coordinates more robust or configurable
|
67
|
-
click_x_1 = int(screen_width * (1036 / 1280))
|
68
|
-
click_y_1 = int(screen_height * (500 / 720))
|
69
|
-
log.info(f"Calculated click coordinates for starting the game: ({click_x_1}, {click_y_1})")
|
70
|
-
click_x_2 = int(screen_width * (1233 / 1280))
|
71
|
-
click_y_2 = int(screen_height * (30 / 720))
|
72
|
-
log.info(f"Calculated click coordinates for closing the browser warning: ({click_x_2}, {click_y_2})")
|
73
|
-
|
74
|
-
# Disable failsafe before clicking
|
75
|
-
pyautogui.FAILSAFE = False
|
76
|
-
log.info("PyAutoGUI failsafe temporarily disabled.")
|
77
|
-
|
78
|
-
log.info(f"Clicking at coordinates: ({click_x_1}, {click_y_1})")
|
79
|
-
pyautogui.click(click_x_1, click_y_1)
|
80
|
-
time.sleep(2)
|
81
|
-
pyautogui.click(click_x_1, click_y_1) # Double click?
|
82
|
-
|
83
|
-
# Press F11 to attempt fullscreen
|
84
|
-
log.info("Pressing F11 to enter fullscreen...")
|
85
|
-
time.sleep(1) # Short delay before pressing F11
|
86
|
-
pyautogui.press('f11')
|
87
|
-
time.sleep(1)
|
88
|
-
log.info(f"Clicking at coordinates: ({click_x_2}, {click_y_2})")
|
89
|
-
pyautogui.click(click_x_2, click_y_2)
|
90
|
-
time.sleep(1)
|
91
|
-
pyautogui.click(click_x_2, click_y_2)
|
92
|
-
|
93
|
-
log.info("Star Rail preparation clicks completed.")
|
94
|
-
|
95
|
-
except Exception as e:
|
96
|
-
log.error(f"Error during Star Rail preparation (browser/click): {e}", exc_info=True)
|
97
|
-
finally:
|
98
|
-
# Ensure failsafe is re-enabled
|
99
|
-
pyautogui.FAILSAFE = True
|
1
|
+
# src/computer_use_ootb_internal/preparation/star_rail_prepare.py
|
2
|
+
import time
|
3
|
+
import platform
|
4
|
+
import subprocess # Added for taskkill
|
5
|
+
import pyautogui
|
6
|
+
import webbrowser
|
7
|
+
import logging # Use logging instead of print for better practice
|
8
|
+
|
9
|
+
# Set up logging for this module if needed, or rely on root logger
|
10
|
+
log = logging.getLogger(__name__)
|
11
|
+
|
12
|
+
def run_preparation(state):
|
13
|
+
"""
|
14
|
+
Performs environment preparation specific to Star Rail on Windows.
|
15
|
+
Closes existing Edge browsers, opens the specified URL in a new Edge instance,
|
16
|
+
and performs initial clicks.
|
17
|
+
"""
|
18
|
+
if platform.system() != "Windows":
|
19
|
+
log.info("Star Rail preparation skipped: Not running on Windows.")
|
20
|
+
return
|
21
|
+
|
22
|
+
log.info("Star Rail preparation: Starting environment setup on Windows...")
|
23
|
+
url = "https://sr.mihoyo.com/cloud/#/" # Consider making this configurable later
|
24
|
+
browser_opened = False
|
25
|
+
try:
|
26
|
+
# Attempt to close existing Microsoft Edge processes
|
27
|
+
log.info("Attempting to close existing Microsoft Edge processes...")
|
28
|
+
try:
|
29
|
+
# /F forces termination, /IM specifies image name
|
30
|
+
result = subprocess.run(['taskkill', '/F', '/IM', 'msedge.exe'],
|
31
|
+
capture_output=True, text=True, check=False)
|
32
|
+
if result.returncode == 0:
|
33
|
+
log.info("Successfully sent termination signal to msedge.exe processes.")
|
34
|
+
elif "not found" in result.stderr.lower() or "not found" in result.stdout.lower():
|
35
|
+
log.info("No running msedge.exe processes found to close.")
|
36
|
+
else:
|
37
|
+
log.warning(f"taskkill command finished with return code {result.returncode}. Output: {result.stdout} Stderr: {result.stderr}")
|
38
|
+
time.sleep(2) # Give processes time to close
|
39
|
+
except FileNotFoundError:
|
40
|
+
log.error("Error: 'taskkill' command not found. Make sure it's in the system PATH.")
|
41
|
+
except Exception as e:
|
42
|
+
log.error(f"Error occurred while trying to close Edge: {e}", exc_info=True)
|
43
|
+
|
44
|
+
# Use only webbrowser.open
|
45
|
+
log.info(f"Attempting to open {url} using webbrowser.open()...")
|
46
|
+
if webbrowser.open(url):
|
47
|
+
log.info(f"Successfully requested browser to open {url} via webbrowser.open().")
|
48
|
+
browser_opened = True
|
49
|
+
# Ensure sleep time for browser load before clicks is present
|
50
|
+
time.sleep(5)
|
51
|
+
else:
|
52
|
+
log.warning("webbrowser.open() returned False, indicating potential failure.")
|
53
|
+
|
54
|
+
if not browser_opened:
|
55
|
+
log.error("Failed to confirm browser opening via webbrowser.open(). Will still attempt clicks.")
|
56
|
+
|
57
|
+
# Add pyautogui click after attempting to open the browser
|
58
|
+
log.info("Proceeding with pyautogui actions...")
|
59
|
+
time.sleep(5) # Wait time for the browser to load
|
60
|
+
|
61
|
+
# Get screen size
|
62
|
+
screen_width, screen_height = pyautogui.size()
|
63
|
+
log.info(f"Detected screen size: {screen_width}x{screen_height}")
|
64
|
+
|
65
|
+
# Calculate click coordinates based on a reference resolution (e.g., 1280x720)
|
66
|
+
# TODO: Make these coordinates more robust or configurable
|
67
|
+
click_x_1 = int(screen_width * (1036 / 1280))
|
68
|
+
click_y_1 = int(screen_height * (500 / 720))
|
69
|
+
log.info(f"Calculated click coordinates for starting the game: ({click_x_1}, {click_y_1})")
|
70
|
+
click_x_2 = int(screen_width * (1233 / 1280))
|
71
|
+
click_y_2 = int(screen_height * (30 / 720))
|
72
|
+
log.info(f"Calculated click coordinates for closing the browser warning: ({click_x_2}, {click_y_2})")
|
73
|
+
|
74
|
+
# Disable failsafe before clicking
|
75
|
+
pyautogui.FAILSAFE = False
|
76
|
+
log.info("PyAutoGUI failsafe temporarily disabled.")
|
77
|
+
|
78
|
+
log.info(f"Clicking at coordinates: ({click_x_1}, {click_y_1})")
|
79
|
+
pyautogui.click(click_x_1, click_y_1)
|
80
|
+
time.sleep(2)
|
81
|
+
pyautogui.click(click_x_1, click_y_1) # Double click?
|
82
|
+
|
83
|
+
# Press F11 to attempt fullscreen
|
84
|
+
log.info("Pressing F11 to enter fullscreen...")
|
85
|
+
time.sleep(1) # Short delay before pressing F11
|
86
|
+
pyautogui.press('f11')
|
87
|
+
time.sleep(1)
|
88
|
+
log.info(f"Clicking at coordinates: ({click_x_2}, {click_y_2})")
|
89
|
+
pyautogui.click(click_x_2, click_y_2)
|
90
|
+
time.sleep(1)
|
91
|
+
pyautogui.click(click_x_2, click_y_2)
|
92
|
+
|
93
|
+
log.info("Star Rail preparation clicks completed.")
|
94
|
+
|
95
|
+
except Exception as e:
|
96
|
+
log.error(f"Error during Star Rail preparation (browser/click): {e}", exc_info=True)
|
97
|
+
finally:
|
98
|
+
# Ensure failsafe is re-enabled
|
99
|
+
pyautogui.FAILSAFE = True
|
100
100
|
log.info("PyAutoGUI failsafe re-enabled.")
|