Skip to content

Commit 830e6fb

Browse files
author
Earth1283
committed
fuck telemetry
1 parent bb8baa2 commit 830e6fb

2 files changed

Lines changed: 59 additions & 0 deletions

File tree

pymcl/settings_page.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,11 @@ def __init__(self, parent=None):
7575
images_dir_layout.addWidget(images_dir_browse_button)
7676
general_layout.addLayout(images_dir_layout)
7777

78+
# Telemetry Setting
79+
self.disable_telemetry_check = QCheckBox("Disable Microsoft Telemetry")
80+
self.disable_telemetry_check.setToolTip("Attempts to disable telemetry by modifying game options and using JVM arguments.")
81+
general_layout.addWidget(self.disable_telemetry_check)
82+
7883
# Open Data Folder Button
7984
open_data_dir_button = QPushButton("Open Data Folder")
8085
open_data_dir_button.setObjectName("secondary_button")
@@ -246,6 +251,7 @@ def load_settings(self):
246251
self.mute_video_check.setChecked(self.config_manager.get("video_mute", True))
247252
self.enable_slideshow_check.setChecked(self.config_manager.get("enable_slideshow", True))
248253
self.slideshow_interval_input.setValue(self.config_manager.get("slideshow_interval", 30))
254+
self.disable_telemetry_check.setChecked(self.config_manager.get("disable_telemetry", False))
249255

250256
resolution = self.config_manager.get("resolution", {})
251257
self.width_input.setText(resolution.get("width", ""))
@@ -261,6 +267,7 @@ def save_settings(self):
261267
self.config_manager.set("video_mute", self.mute_video_check.isChecked())
262268
self.config_manager.set("enable_slideshow", self.enable_slideshow_check.isChecked())
263269
self.config_manager.set("slideshow_interval", self.slideshow_interval_input.value())
270+
self.config_manager.set("disable_telemetry", self.disable_telemetry_check.isChecked())
264271
self.config_manager.set("resolution", {
265272
"width": self.width_input.text().strip(),
266273
"height": self.height_input.text().strip()

pymcl/workers.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import requests
1313
from PyQt6.QtCore import QObject, pyqtSignal, pyqtSlot
1414

15+
from .config_manager import ConfigManager
1516
from .constants import (
1617
MINECRAFT_DIR,
1718
VERSIONS_CACHE_PATH,
@@ -249,6 +250,57 @@ def set_progress(value: int, maximum: int = 100) -> None:
249250
cleaned_options["gameDirectory"] = game_dir
250251
print(f"Launching with game directory: {game_dir}")
251252

253+
# --- Telemetry & Privacy Logic ---
254+
config_manager = ConfigManager()
255+
if config_manager.get("disable_telemetry", False):
256+
print("Disabling telemetry features...")
257+
258+
# 1. Modify options.txt
259+
options_txt_path = os.path.join(game_dir, "options.txt")
260+
try:
261+
current_options = {}
262+
if os.path.exists(options_txt_path):
263+
with open(options_txt_path, "r") as f:
264+
for line in f:
265+
if ":" in line:
266+
key, val = line.strip().split(":", 1)
267+
current_options[key] = val
268+
269+
# Force disable keys
270+
current_options["snooperEnabled"] = "false"
271+
current_options["telemetry"] = "false"
272+
current_options["onboardAccessibility"] = "false" # Often triggers data collection
273+
274+
with open(options_txt_path, "w") as f:
275+
for key, val in current_options.items():
276+
f.write(f"{key}:{val}\n")
277+
print(f"Updated options.txt at {options_txt_path}")
278+
except Exception as e:
279+
print(f"Failed to update options.txt: {e}")
280+
281+
# 2. Add JVM Arguments
282+
if "jvmArguments" not in cleaned_options:
283+
cleaned_options["jvmArguments"] = []
284+
285+
# Ensure it's a list (minecraft-launcher-lib handles list or string, but we want list)
286+
if isinstance(cleaned_options["jvmArguments"], str):
287+
cleaned_options["jvmArguments"] = cleaned_options["jvmArguments"].split()
288+
289+
telemetry_args = [
290+
"-Dminecraft.api.env=custom",
291+
"-Dminecraft.telemetry.target=0.0.0.0", # Placeholder/Signal
292+
"-Dsnooper.enabled=false",
293+
"-Dlog4j2.formatMsgNoLookups=true",
294+
"-Duser.language=en", # Reduce fingerprinting
295+
"-Duser.country=US",
296+
]
297+
298+
# Note: We cannot easily map DNS to 0.0.0.0 via JVM args without an agent or hosts file.
299+
# These args are best-effort.
300+
301+
cleaned_options["jvmArguments"].extend(telemetry_args)
302+
print("Added telemetry-disabling JVM arguments.")
303+
252304
command = minecraft_launcher_lib.command.get_minecraft_command(
253305
version=self.version_to_launch,
254306
minecraft_directory=MINECRAFT_DIR,

0 commit comments

Comments
 (0)