Guest User

UMU KDE Script

a guest
Jun 25th, 2026
81
0
Never
3
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.79 KB | None | 0 0
  1. { config, pkgs, lib, ... }:
  2. let
  3. homeDir = config.home.homeDirectory;
  4. in
  5. {
  6. # --- umu-run-game: run a Windows .exe with UMU/Proton ---
  7. home.file.".local/bin/umu-run-game" = {
  8. executable = true;
  9. text = ''
  10. #!/usr/bin/env bash
  11. GAME_DIR="$(dirname "$1")"
  12. GAME_NAME="$(basename "$GAME_DIR" | tr " " "-" | tr "[:upper:]" "[:lower:]")"
  13. export GAMEID=0
  14. export WINEPREFIX="$HOME/Games/umu/$GAME_NAME"
  15. mkdir -p "$WINEPREFIX"
  16. exec umu-run "$1"
  17. '';
  18. };
  19.  
  20. # --- KDE right-click: "Run with UMU (Proton)" ---
  21. home.file.".local/share/kio/servicemenus/umu-run.desktop" = {
  22. executable = true;
  23. text = ''
  24. [Desktop Entry]
  25. Type=Service
  26. MimeType=application/x-ms-dos-executable;application/x-msdos-program;application/x-executable-wine;
  27. X-KDE-ServiceTypes=KonqPopupMenu/Plugin
  28. Actions=umu-run
  29.  
  30. [Desktop Action umu-run]
  31. Name=Run with UMU (Proton)
  32. Icon=wine
  33. Exec=${homeDir}/.local/bin/umu-run-game %f
  34. '';
  35. };
  36.  
  37. # --- Double-click .exe association ---
  38. xdg.desktopEntries.umu-run-game = {
  39. name = "UMU (Proton)";
  40. icon = "wine";
  41. exec = "${homeDir}/.local/bin/umu-run-game %f";
  42. mimeType = [
  43. "application/x-ms-dos-executable"
  44. "application/x-msdos-program"
  45. ];
  46. noDisplay = true;
  47. };
  48.  
  49. # --- umu-lnk-parse: extract target .exe from Windows .lnk files ---
  50. home.file.".local/bin/umu-lnk-parse" = {
  51. executable = true;
  52. text = ''
  53. #!/usr/bin/env bash
  54. set -euo pipefail
  55.  
  56. extract_exe_from_lnk() {
  57. local lnk="$1"
  58. local path
  59. path=$(${pkgs.exiftool}/bin/exiftool -s3 -LocalBasePath "$lnk" 2>/dev/null)
  60. if [[ -n "$path" ]] && echo "$path" | grep -qi '\.exe$'; then
  61. echo "$path"
  62. fi
  63. }
  64.  
  65. TARGET="$1"
  66.  
  67. if [[ -f "$TARGET" ]]; then
  68. extract_exe_from_lnk "$TARGET"
  69. exit $?
  70. fi
  71.  
  72. # Directory mode: scan prefix for .lnk files
  73. shopt -s globstar nullglob
  74. declare -A FOUND
  75. declare -A FOUND_LNK
  76.  
  77. for lnk in \
  78. "$TARGET"/drive_c/ProgramData/Microsoft/Windows/Start\ Menu/**/*.lnk \
  79. "$TARGET"/drive_c/users/*/AppData/Roaming/Microsoft/Windows/Start\ Menu/**/*.lnk \
  80. "$TARGET"/drive_c/users/*/Desktop/*.lnk; do
  81.  
  82. exe_path=$(extract_exe_from_lnk "$lnk")
  83. [[ -z "$exe_path" ]] && continue
  84.  
  85. name=$(basename "$lnk" .lnk)
  86. name_lower=$(echo "$name" | tr '[:upper:]' '[:lower:]')
  87.  
  88. case "$name_lower" in
  89. *uninstall*|*remove*|*uninst*) continue ;;
  90. esac
  91. FOUND_LNK["$name"]="$lnk"
  92. FOUND["$name"]="$exe_path"
  93. done
  94.  
  95. while IFS= read -r -d $'\0' name; do
  96. printf '%s\t%s\t%s\n' "$name" "''${FOUND[$name]}" "''${FOUND_LNK[$name]}"
  97. done < <(printf '%s\0' "''${!FOUND[@]}" | sort -z)
  98. '';
  99. };
  100.  
  101. # --- umu-create-launcher: create a .desktop file for a Windows app ---
  102. home.file.".local/bin/umu-create-launcher" = {
  103. executable = true;
  104. text = ''
  105. #!/usr/bin/env bash
  106. set -euo pipefail
  107.  
  108. NAME="$1"
  109. WIN_EXE="$2"
  110. PREFIX="$3"
  111. LNK_FILE="''${4:-}"
  112.  
  113. SAFE_NAME=$(echo "$NAME" | tr ' ' '-' | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9_-]//g')
  114. DESKTOP_FILE="$HOME/.local/share/applications/umu-''${SAFE_NAME}.desktop"
  115. ICON_DIR="$HOME/.local/share/icons/umu"
  116. LAUNCHER_DIR="$HOME/.local/bin/umu-launchers"
  117. mkdir -p "$ICON_DIR" "$LAUNCHER_DIR"
  118.  
  119. # Convert Windows path to Unix path inside prefix
  120. UNIX_REL=$(echo "$WIN_EXE" | sed 's|\\|/|g' | sed 's|^[A-Za-z]:/||')
  121. UNIX_EXE="$PREFIX/drive_c/$UNIX_REL"
  122.  
  123. PREFIX_NAME=$(basename "$PREFIX")
  124. ICON_PATH="wine"
  125.  
  126. # --- Icon extraction ---
  127. extract_icon() {
  128. local source="$1"
  129. local out="$ICON_DIR/''${SAFE_NAME}.png"
  130. local tmpdir
  131. tmpdir=$(mktemp -d /tmp/umu-ico-XXXXXX)
  132.  
  133. if [[ "$source" == *.ico ]]; then
  134. if ${pkgs.icoutils}/bin/icotool -x -o "$tmpdir" "$source" 2>/dev/null; then
  135. BEST=$(ls -S "$tmpdir"/*.png 2>/dev/null | head -1 || true)
  136. if [[ -n "$BEST" ]] && [[ -f "$BEST" ]]; then
  137. mv "$BEST" "$out"
  138. rm -rf "$tmpdir"
  139. echo "$out"
  140. return 0
  141. fi
  142. fi
  143. elif [[ "$source" == *.exe ]]; then
  144. local tmpico="$tmpdir/extracted.ico"
  145. if ${pkgs.icoutils}/bin/wrestool -x -t 14 -o "$tmpico" "$source" 2>/dev/null && [[ -s "$tmpico" ]]; then
  146. if ${pkgs.icoutils}/bin/icotool -x -o "$tmpdir" "$tmpico" 2>/dev/null; then
  147. BEST=$(ls -S "$tmpdir"/*.png 2>/dev/null | head -1 || true)
  148. if [[ -n "$BEST" ]] && [[ -f "$BEST" ]]; then
  149. mv "$BEST" "$out"
  150. rm -rf "$tmpdir"
  151. echo "$out"
  152. return 0
  153. fi
  154. fi
  155. fi
  156. fi
  157. rm -rf "$tmpdir"
  158. return 1
  159. }
  160.  
  161. # Strategy 1: .ico referenced in the .lnk
  162. if [[ -n "$LNK_FILE" ]] && [[ -f "$LNK_FILE" ]]; then
  163. ICO_WIN=$(${pkgs.exiftool}/bin/exiftool -s3 -IconFileName "$LNK_FILE" 2>/dev/null || true)
  164. if [[ -n "$ICO_WIN" ]]; then
  165. ICO_REL=$(echo "$ICO_WIN" | sed 's|\\|/|g' | sed 's|^[A-Za-z]:/||')
  166. ICO_UNIX="$PREFIX/drive_c/$ICO_REL"
  167. if [[ -f "$ICO_UNIX" ]]; then
  168. RESULT=$(extract_icon "$ICO_UNIX") && ICON_PATH="$RESULT"
  169. fi
  170. fi
  171. fi
  172.  
  173. # Strategy 2: .ico next to the .exe
  174. if [[ "$ICON_PATH" == "wine" ]] && [[ -f "$UNIX_EXE" ]]; then
  175. EXE_DIR=$(dirname "$UNIX_EXE")
  176. ICO_FILE=$(find "$EXE_DIR" -maxdepth 1 -iname '*.ico' -print -quit 2>/dev/null || true)
  177. if [[ -n "$ICO_FILE" ]]; then
  178. RESULT=$(extract_icon "$ICO_FILE") && ICON_PATH="$RESULT"
  179. fi
  180. fi
  181.  
  182. # Strategy 3: extract from .exe
  183. if [[ "$ICON_PATH" == "wine" ]] && [[ -f "$UNIX_EXE" ]]; then
  184. RESULT=$(extract_icon "$UNIX_EXE") && ICON_PATH="$RESULT"
  185. fi
  186.  
  187. # Strategy 4: try GOG icon search
  188. if [[ "$ICON_PATH" == "wine" ]]; then
  189. SEARCH_NAME=$(echo "$NAME" | sed 's/[^a-zA-Z0-9 ]//g' | sed 's/ /+/g')
  190. DL_ICON="$ICON_DIR/''${SAFE_NAME}.png"
  191. GOG_ICON=$(${pkgs.curl}/bin/curl -sf -L \
  192. "https://api.gog.com/products?search=$SEARCH_NAME&limit=1" 2>/dev/null \
  193. | ${pkgs.jq}/bin/jq -r '.products[0].images.icon // empty' 2>/dev/null || true)
  194. if [[ -n "$GOG_ICON" ]]; then
  195. ${pkgs.curl}/bin/curl -sf -L -o "$DL_ICON" "https:$GOG_ICON" 2>/dev/null \
  196. && [[ -s "$DL_ICON" ]] && ICON_PATH="$DL_ICON"
  197. fi
  198. fi
  199.  
  200. # --- Create a wrapper script ---
  201. LAUNCHER="$LAUNCHER_DIR/$SAFE_NAME"
  202. cat > "$LAUNCHER" <<'SCRIPT_HEAD'
  203. #!/usr/bin/env bash
  204. SCRIPT_HEAD
  205. cat >> "$LAUNCHER" <<SCRIPT_BODY
  206. export GAMEID=0
  207. export WINEPREFIX="$PREFIX"
  208. exec ${pkgs.umu-launcher}/bin/umu-run "$UNIX_EXE"
  209. SCRIPT_BODY
  210. sed -i 's/^ //' "$LAUNCHER"
  211. chmod +x "$LAUNCHER"
  212.  
  213. # --- Create .desktop pointing to the wrapper ---
  214. cat > "$DESKTOP_FILE" <<DESKTOP
  215. [Desktop Entry]
  216. Type=Application
  217. Name=$NAME
  218. Comment=Windows app (UMU/Proton) — prefix: $PREFIX_NAME
  219. Exec=$LAUNCHER
  220. Icon=$ICON_PATH
  221. Terminal=false
  222. Categories=Game;
  223. Keywords=windows;wine;proton;umu;
  224. DESKTOP
  225. sed -i 's/^ //' "$DESKTOP_FILE"
  226.  
  227. echo "$DESKTOP_FILE"
  228. '';
  229. };
  230.  
  231. # --- umu-scan: scan prefix(es) for installed programs, create launchers ---
  232. home.file.".local/bin/umu-scan" = {
  233. executable = true;
  234. text = ''
  235. #!/usr/bin/env bash
  236. set -euo pipefail
  237.  
  238. UMU_DIR="$HOME/Games/umu"
  239.  
  240. if [[ ! -d "$UMU_DIR" ]]; then
  241. ${pkgs.kdePackages.kdialog}/bin/kdialog --sorry "No prefixes found in $UMU_DIR" --title "UMU Scan"
  242. exit 0
  243. fi
  244.  
  245. # Use indexed arrays to avoid space/quoting issues
  246. NAMES=()
  247. EXES=()
  248. LNKS=()
  249. PREFIXES=()
  250. CHECKLIST_ARGS=()
  251.  
  252. for PREFIX in "$UMU_DIR"/*/; do
  253. [[ -d "$PREFIX/drive_c" ]] || continue
  254. PREFIX_NAME=$(basename "$PREFIX")
  255.  
  256. while IFS=$'\t' read -r name exe_path lnk_path; do
  257. [[ -z "$name" ]] && continue
  258. IDX=''${#NAMES[@]}
  259. NAMES+=("$name")
  260. EXES+=("$exe_path")
  261. LNKS+=("$lnk_path")
  262. PREFIXES+=("$PREFIX")
  263. CHECKLIST_ARGS+=("$IDX" "$name ($PREFIX_NAME)" "off")
  264. done < <("$HOME/.local/bin/umu-lnk-parse" "$PREFIX" 2>/dev/null || true)
  265. done
  266.  
  267. if [[ ''${#NAMES[@]} -eq 0 ]]; then
  268. ${pkgs.kdePackages.kdialog}/bin/kdialog \
  269. --sorry "No installed programs found in any prefix." \
  270. --title "UMU Scan"
  271. exit 0
  272. fi
  273.  
  274. SELECTED=$(${pkgs.kdePackages.kdialog}/bin/kdialog \
  275. --checklist "Select programs to create launchers for:" \
  276. "''${CHECKLIST_ARGS[@]}" \
  277. --title "UMU — Installed Programs" \
  278. --geometry 600x400) || exit 0
  279.  
  280. COUNT=0
  281. for IDX in $SELECTED; do
  282. IDX=$(echo "$IDX" | tr -d '"')
  283. "$HOME/.local/bin/umu-create-launcher" \
  284. "''${NAMES[$IDX]}" "''${EXES[$IDX]}" "''${PREFIXES[$IDX]}" "''${LNKS[$IDX]}"
  285. COUNT=$((COUNT + 1))
  286. done
  287.  
  288. ${pkgs.kdePackages.kdialog}/bin/kdialog \
  289. --passivepopup "Created $COUNT launcher(s). Check your app menu!" 5 \
  290. --title "UMU Scan Complete"
  291. '';
  292. };
  293.  
  294. # --- umu-install: run a setup.exe, then scan for installed programs ---
  295. home.file.".local/bin/umu-install" = {
  296. executable = true;
  297. text = ''
  298. #!/usr/bin/env bash
  299. set -euo pipefail
  300.  
  301. SETUP_EXE="$1"
  302. GAME_DIR="$(dirname "$SETUP_EXE")"
  303. GAME_NAME="$(basename "$GAME_DIR" | tr " " "-" | tr "[:upper:]" "[:lower:]")"
  304.  
  305. GAME_NAME=$(${pkgs.kdePackages.kdialog}/bin/kdialog \
  306. --inputbox "Prefix name for this installation:" "$GAME_NAME" \
  307. --title "UMU Install") || exit 0
  308.  
  309. export GAMEID=0
  310. export WINEPREFIX="$HOME/Games/umu/$GAME_NAME"
  311. mkdir -p "$WINEPREFIX"
  312.  
  313. ${pkgs.kdePackages.kdialog}/bin/kdialog \
  314. --passivepopup "Starting installer in prefix: $GAME_NAME" 5 \
  315. --title "UMU Install" &
  316.  
  317. umu-run "$SETUP_EXE"
  318.  
  319. sleep 1
  320.  
  321. NAMES=()
  322. EXES=()
  323. LNKS=()
  324. CHECKLIST_ARGS=()
  325.  
  326. while IFS=$'\t' read -r name exe_path lnk_path; do
  327. [[ -z "$name" ]] && continue
  328. IDX=''${#NAMES[@]}
  329. NAMES+=("$name")
  330. EXES+=("$exe_path")
  331. LNKS+=("$lnk_path")
  332. CHECKLIST_ARGS+=("$IDX" "$name" "on")
  333. done < <("$HOME/.local/bin/umu-lnk-parse" "$WINEPREFIX" 2>/dev/null || true)
  334.  
  335. if [[ ''${#NAMES[@]} -eq 0 ]]; then
  336. ${pkgs.kdePackages.kdialog}/bin/kdialog \
  337. --msgbox "Installation finished.\nNo shortcuts detected — browse:\n$WINEPREFIX/drive_c/" \
  338. --title "UMU Install"
  339. exit 0
  340. fi
  341.  
  342. SELECTED=$(${pkgs.kdePackages.kdialog}/bin/kdialog \
  343. --checklist "Installation finished! Create launchers for:" \
  344. "''${CHECKLIST_ARGS[@]}" \
  345. --title "UMU — Create Launchers" \
  346. --geometry 500x350) || exit 0
  347.  
  348. COUNT=0
  349. for IDX in $SELECTED; do
  350. IDX=$(echo "$IDX" | tr -d '"')
  351. "$HOME/.local/bin/umu-create-launcher" \
  352. "''${NAMES[$IDX]}" "''${EXES[$IDX]}" "$WINEPREFIX" "''${LNKS[$IDX]}"
  353. COUNT=$((COUNT + 1))
  354. done
  355.  
  356. ${pkgs.kdePackages.kdialog}/bin/kdialog \
  357. --passivepopup "Created $COUNT launcher(s) — check your app menu!" 5 \
  358. --title "UMU Install Complete"
  359. '';
  360. };
  361.  
  362. # --- KDE right-click: "Install with UMU (Proton)" ---
  363. home.file.".local/share/kio/servicemenus/umu-install.desktop" = {
  364. text = ''
  365. [Desktop Entry]
  366. Type=Service
  367. MimeType=application/x-ms-dos-executable;application/x-msdos-program;
  368. X-KDE-ServiceTypes=KonqPopupMenu/Plugin
  369. Actions=umu-install
  370.  
  371. [Desktop Action umu-install]
  372. Name=Install with UMU (Proton)
  373. Icon=package-x-generic
  374. Exec=${homeDir}/.local/bin/umu-install %f
  375. '';
  376. };
  377.  
  378. # --- Desktop entry for umu-scan (app menu) ---
  379. xdg.desktopEntries.umu-scan = {
  380. name = "UMU — Scan Installed Apps";
  381. comment = "Find installed Windows programs and create launchers";
  382. icon = "system-search";
  383. exec = "${homeDir}/.local/bin/umu-scan";
  384. terminal = false;
  385. categories = [ "Utility" ];
  386. };
  387.  
  388. # --- Mime associations ---
  389. xdg.mimeApps = {
  390. enable = true;
  391. defaultApplications = {
  392. "application/x-ms-dos-executable" = "umu-run-game.desktop";
  393. "application/x-msdos-program" = "umu-run-game.desktop";
  394. };
  395. };
  396. }
  397.  
Advertisement
Comments
  • User was banned
  • User was banned
  • Nissie93
    14 hours
    # CSS 0.83 KB | 0 0
    1. ✅ Leaked Exploit Documentation:
    2.  
    3. https://drive.google.com/file/d/1cvQPOZ7JecI0L6lqdIzIHJbHQBiDRT4U/view?usp=sharing
    4.  
    5. This made me $13,000 in 2 days.
    6.  
    7. Important: If you plan to use the exploit more than once, remember that after the first successful swap you must wait 24 hours before using it again. Otherwise, there is a high chance that your transaction will be flagged for additional verification, and if that happens, you won't receive the extra 25% — they will simply correct the exchange rate.
    8. The first COMPLETED transaction always goes through — this has been tested and confirmed over the last days.
    9.  
    10. Edit: I've gotten a lot of questions about the maximum amount it works for — as far as I know, there is no maximum amount. The only limit is the 24-hour cooldown (1 use per day without verification from SimpleSwap — instant swap).
Add Comment
Please, Sign In to add comment