From b59b48b567fc9136a3263e04d4572f2f91383719 Mon Sep 17 00:00:00 2001
From: mactan <mactan@edgetransit.dev>
Date: Mon, 19 May 2025 18:56:38 -0500
Subject: [PATCH] preflight check and correction for lutris global runner

---
 lug-helper.sh | 73 +++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 71 insertions(+), 2 deletions(-)

diff --git a/lug-helper.sh b/lug-helper.sh
index a2d71b5..53eab78 100755
--- a/lug-helper.sh
+++ b/lug-helper.sh
@@ -92,9 +92,15 @@ lutris_flatpak_dir="$HOME/.var/app/net.lutris.Lutris"
 # Lutris native game configs directory
 lutris_native_conf_dir="$conf_dir/lutris/games"
 
+# Lutris native wine config
+lutris_native_wine_yml="$conf_dir/lutris/runners/wine.yml"
+
 # Lutris flatpak game configs directory
 lutris_flatpak_conf_dir="$lutris_flatpak_dir/config/lutris/games"
 
+# Lutris flatpak wine config
+lutris_flatpak_wine_yml="$lutris_flatpak_dir/data/lutris/runners/wine.yml"
+
 # Helper directory
 helper_dir="$(realpath "$0" | xargs -0 dirname)"
 
@@ -200,6 +206,9 @@ wine_required="9.4"
 # Lutris minimum version
 lutris_required="0.5.18"
 
+# Lutris runner minimum version
+lutris_runner_required="ge-proton"
+
 # Minimum amount of RAM in GiB
 memory_required="16"
 # Minimum amount of combined RAM + swap in GiB
@@ -922,6 +931,20 @@ lutris_check() {
         else
             preflight_pass+=("Lutris is installed and sufficiently up to date.")
         fi
+
+        if [[ "$lutris_native_runner" == "$lutris_runner_required" ]]; then
+            # All good
+            preflight_pass+=("Lutris runner is set to $lutris_runner.")
+        else
+            # The setting should be changed
+            preflight_fail+=("Lutris runner should be set to $lutris_runner_required")
+
+            preflight_action_funcs+=("lutris_set_runner $conf_dir/lutris/runners/wine.yml")
+            preflight_fix_results+=("The Lutris global wine runner has been configured.")
+
+            # Add info for manually changing the setting
+            preflight_manual+=("To change Lutris global Wine runner, edit global preferences in Lutris")
+        fi
     fi
 
     # Check the flatpak lutris version number
@@ -935,25 +958,71 @@ lutris_check() {
         else
             preflight_pass+=("Flatpak Lutris is installed and sufficiently up to date.")
         fi
+
+        if [[ "$lutris_flatpak_runner" == "$lutris_runner_required" ]]; then
+            # All good
+            preflight_pass+=("Flatpak Lutris runner is set to $lutris_runner.")
+        else
+            # The setting should be changed
+            preflight_fail+=("Flatpak Lutris runner should be set to $lutris_runner_required")
+
+            preflight_action_funcs+=("lutris_set_runner $lutris_flatpak_dir/data/lutris/runners/wine.yml")
+            preflight_fix_results+=("The Flatpak Lutris global wine runner has been configured.")
+
+            # Add info for manually changing the setting
+            preflight_manual+=("To change Flatpak Lutris global Wine runner, edit global preferences in Flatpak Lutris")
+        fi
     fi
 }
 
 # Detect if lutris is installed
 lutris_detect() {
     lutris_installed="false"
+
     lutris_native="false"
+    lutris_native_runner=""
+
     lutris_flatpak="false"
+    lutris_flatpak_runner=""
 
     # Detect native lutris
     if [ -x "$(command -v lutris)" ]; then
         lutris_installed="true"
         lutris_native="true"
+        if [ -f  "$lutris_native_wine_yml" ]; then
+            lutris_native_runner="$(sed -En '/^wine:/,/^[^[:space:]]/ { /^[[:space:]]*version:/s/^[[:space:]]*version:[[:space:]]*//p }' "$lutris_native_wine_yml")"
+        fi
     fi
 
     # Detect flatpak lutris
     if [ -x "$(command -v flatpak)" ] && flatpak list --app | grep -q Lutris; then
-            lutris_installed="true"
-            lutris_flatpak="true"
+        lutris_installed="true"
+        lutris_flatpak="true"
+        if [ -f "$lutris_flatpak_wine_yml" ]; then
+            lutris_flatpak_runner="$(sed -En '/^wine:/,/^[^[:space:]]/ { /^[[:space:]]*version:/s/^[[:space:]]*version:[[:space:]]*//p }' "$lutris_flatpak_wine_yml")"
+        fi
+    fi
+}
+
+lutris_set_runner() {
+    # This function expects a string to be passed as an argument
+    if [ -z "$1" ]; then
+        debug_print exit "Script error:  The lutris_set_runner() function expects an argument. Aborting."
+    fi
+
+    version_sed_string="version: "
+    if [ ! -f "$1" ] || [ -z "$(sed -En '/^wine:/,/^[^[:blank:]]/p' "$1")" ]; then
+        # the file doesn't exist yet, make it with the wine version content
+        preflight_user_actions+=("mkdir -p \$(dirname \"\$1\"); printf 'wine:\n  version: $lutris_runner_required\n' > '$1'")
+    else
+        # If it doesn't exist, add it at the start of the wine: grouping
+        if [ -z "$(sed -En '/^wine:/,/^[^[:space:]]/ { /^[[:space:]]*version:/p }' "$1")" ]; then
+            # This assumes an indent of two spaces before the key:value pair
+            preflight_user_actions+=("sed -i -e '/^wine:/a\' -e \"  ${version_sed_string}${lutris_runner_required}\" '$1'")
+        else
+            # Replace the appropriate key:value line if it exists
+            preflight_user_actions+=("sed -Ei '/^wine:/,/^[^[:blank:]]/ {/^[[:blank:]]*${version_sed_string}/s/${version_sed_string}.*/${version_sed_string}${lutris_runner_required}/}' '$1'")
+        fi
     fi
 }