From c46cf726f0ba62b5afabb99bac5f4c5ba925576a Mon Sep 17 00:00:00 2001
From: xgui4 <134389196+xgui4@users.noreply.github.com>
Date: Sun, 3 May 2026 00:47:10 -0400
Subject: [PATCH] added start of stea managers
---
data/defaults_instances/default.lce_inst | 2 +-
src/lce_qt_launcher/managers/steam_manager.py | 3 +-
src/lce_qt_launcher/managers/steam_manager.rs | 109 ++++++++++++++++++
3 files changed, 112 insertions(+), 2 deletions(-)
create mode 100644 src/lce_qt_launcher/managers/steam_manager.rs
diff --git a/data/defaults_instances/default.lce_inst b/data/defaults_instances/default.lce_inst
index d07e260..196622c 100644
--- a/data/defaults_instances/default.lce_inst
+++ b/data/defaults_instances/default.lce_inst
@@ -6,7 +6,7 @@
"archive_file": "LCEWindows64.zip",
"exe_name": "Minecraft.Client.exe",
"repo_url": "https://github.com/MCLCE/MinecraftConsoles",
- "image" : ":/assets/minecraft.png",
+ "image" : ":/assets/mclce-ico.png",
"news_feed" : "https://github.com/MCLCE/MinecraftConsoles/commits/main/",
"instance_source": "InstanceSource.GITHUB_RELEASE",
"instance_type": "InstanceType.CLIENT_VANILLA",
diff --git a/src/lce_qt_launcher/managers/steam_manager.py b/src/lce_qt_launcher/managers/steam_manager.py
index 99bff09..2bc81dc 100644
--- a/src/lce_qt_launcher/managers/steam_manager.py
+++ b/src/lce_qt_launcher/managers/steam_manager.py
@@ -16,7 +16,7 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see .
"""
-
+
def main():
print(
"""
@@ -26,5 +26,6 @@ def main():
under certain conditions; type `show c' for details.
""")
+
if __name__ == "__main__":
main()
\ No newline at end of file
diff --git a/src/lce_qt_launcher/managers/steam_manager.rs b/src/lce_qt_launcher/managers/steam_manager.rs
new file mode 100644
index 0000000..f5f1228
--- /dev/null
+++ b/src/lce_qt_launcher/managers/steam_manager.rs
@@ -0,0 +1,109 @@
+#[tauri::command]
+async fn add_to_steam(
+ _app: AppHandle,
+ instance_id: String,
+ name: String,
+ title_base64: String,
+ panorama_base64: String,
+) -> Result<(), String> {
+ let exe_path = std::env::current_exe().map_err(|e| e.to_string())?;
+ let exe_str = exe_path.to_string_lossy().to_string();
+ let launch_options = format!("\"{}\"", instance_id);
+ let start_dir = exe_path.parent().map(|p| p.to_string_lossy().to_string()).unwrap_or_default();
+ let app_id_32 = steam_shortcuts_util::app_id_generator::calculate_app_id(&exe_str, &name);
+ //let app_id_64 = ((app_id_32 as u64) << 32) | 0x02000000; //neo: just in case we'll need later.
+ let mut userdata_dirs: Vec = Vec::new();
+ #[cfg(target_os = "linux")]
+ {
+ if let Ok(home) = std::env::var("HOME") {
+ let h = PathBuf::from(home);
+ userdata_dirs.push(h.join(".steam/steam/userdata"));
+ userdata_dirs.push(h.join(".local/share/Steam/userdata"));
+ userdata_dirs.push(h.join(".var/app/com.valvesoftware.Steam/.local/share/Steam/userdata"));
+ }
+ }
+ #[cfg(target_os = "windows")]
+ {
+ userdata_dirs.push(PathBuf::from("C:\\Program Files\\Steam\\userdata"));
+ userdata_dirs.push(PathBuf::from("C:\\Program Files (x86)\\Steam\\userdata"));
+ }
+ #[cfg(target_os = "macos")]
+ {
+ if let Ok(home) = std::env::var("HOME") {
+ let h = PathBuf::from(home);
+ userdata_dirs.push(h.join("Library/Application Support/Steam/userdata"));
+ }
+ }
+
+ let valid_userdata_dirs: Vec = userdata_dirs.into_iter().filter(|d| d.exists()).collect();
+ if valid_userdata_dirs.is_empty() {
+ return Err("Steam userdata directory not found.".into());
+ }
+
+ for userdata_root in valid_userdata_dirs {
+ let entries = fs::read_dir(&userdata_root).map_err(|e| e.to_string())?;
+ for entry in entries.flatten() {
+ if entry.file_type().map(|t| t.is_dir()).unwrap_or(false) {
+ let user_config_dir = entry.path().join("config");
+ let shortcuts_path = user_config_dir.join("shortcuts.vdf");
+ if !user_config_dir.exists() { continue; }
+ let content = if shortcuts_path.exists() {
+ fs::read(&shortcuts_path).unwrap_or_default()
+ } else {
+ Vec::new()
+ };
+
+ let shortcuts = if !content.is_empty() {
+ parse_shortcuts(&content).map_err(|e| e.to_string())?
+ } else {
+ Vec::new()
+ };
+
+ let mut owned_shortcuts: Vec = shortcuts.iter().map(|s| s.to_owned()).collect();
+ if owned_shortcuts.iter().any(|s| s.app_name == name && s.exe == exe_str) {
+ continue;
+ }
+
+ owned_shortcuts.push(steam_shortcuts_util::shortcut::ShortcutOwned {
+ order: owned_shortcuts.len().to_string(),
+ app_id: app_id_32,
+ app_name: name.clone(),
+ exe: exe_str.clone(),
+ start_dir: start_dir.clone(),
+ icon: "".to_string(),
+ shortcut_path: "".to_string(),
+ launch_options: launch_options.clone(),
+ is_hidden: false,
+ allow_desktop_config: true,
+ allow_overlay: true,
+ open_vr: 0,
+ dev_kit: 0,
+ dev_kit_game_id: "".to_string(),
+ dev_kit_overrite_app_id: 0,
+ last_play_time: 0,
+ tags: Vec::new(),
+ });
+
+ let final_shortcuts: Vec = owned_shortcuts.iter().map(|s| s.borrow()).collect();
+ let new_content = shortcuts_to_bytes(&final_shortcuts);
+ fs::write(&shortcuts_path, new_content).map_err(|e| e.to_string())?;
+ let grid_dir = user_config_dir.join("grid");
+ if !grid_dir.exists() {
+ let _ = fs::create_dir_all(&grid_dir);
+ }
+
+ if grid_dir.exists() {
+ let panorama_data = general_purpose::STANDARD.decode(panorama_base64.clone()).map_err(|e| e.to_string())?;
+ let title_data = general_purpose::STANDARD.decode(title_base64.clone()).map_err(|e| e.to_string())?;
+ let _ = fs::write(grid_dir.join(format!("{}p.png", app_id_32)), &panorama_data);
+ let _ = fs::write(grid_dir.join(format!("{}_hero.png", app_id_32)), &panorama_data);
+ let _ = fs::write(grid_dir.join(format!("{}.png", app_id_32)), &panorama_data);
+ let _ = fs::write(grid_dir.join(format!("{}_logo.png", app_id_32)), &title_data);
+ let _ = fs::write(grid_dir.join(format!("{}.json", app_id_32)), "{\"nVersion\":1,\"logoPosition\":{\"pinnedPosition\":\"CenterCenter\",\"nWidthPct\":50,\"nHeightPct\":50}}".as_bytes()); //neo: if you're confused, this is for logo position
+ }
+ }
+ }
+ }
+
+ Ok(())
+}
\ No newline at end of file