From 5e6c6112645f713e33b686350d3128215c8d613c Mon Sep 17 00:00:00 2001 From: rs189 <35667100+rs189@users.noreply.github.com> Date: Sun, 1 Dec 2024 11:00:30 +0000 Subject: [PATCH] Linux: Make Discord Rich Presence work (#998) * Linux: Make Discord Rich Presence work * Fix file already exists * Fix chmod file name --- Dotnet/AppApi/GameHandler.cs | 19 ++++++++++++++++-- Dotnet/Wine.cs | 34 ++++++++++++++++----------------- Linux/install-vrcx.sh | 7 ++++++- Linux/vrcx | 23 ++++++++++++++++++++++ Linux/winediscordipcbridge.exe | Bin 0 -> 16910 bytes html/src/classes/updateLoop.js | 7 ++++++- 6 files changed, 69 insertions(+), 21 deletions(-) create mode 100755 Linux/vrcx create mode 100644 Linux/winediscordipcbridge.exe diff --git a/Dotnet/AppApi/GameHandler.cs b/Dotnet/AppApi/GameHandler.cs index 0a399559..1ca86af9 100644 --- a/Dotnet/AppApi/GameHandler.cs +++ b/Dotnet/AppApi/GameHandler.cs @@ -27,9 +27,24 @@ namespace VRCX var isGameRunning = false; var isSteamVRRunning = false; - if (ProcessMonitor.Instance.IsProcessRunning("VRChat")) + if (Wine.GetIfWine()) { - isGameRunning = true; + var wineTmpPath = Path.Combine(Program.AppDataDirectory, "wine.tmp"); + if (File.Exists(wineTmpPath)) + { + var wineTmp = File.ReadAllText(wineTmpPath); + if (wineTmp.Contains("isGameRunning=true")) + { + isGameRunning = true; + } + } + } + else + { + if (ProcessMonitor.Instance.IsProcessRunning("VRChat")) + { + isGameRunning = true; + } } if (ProcessMonitor.Instance.IsProcessRunning("vrserver")) diff --git a/Dotnet/Wine.cs b/Dotnet/Wine.cs index 9a3215a4..39344a1d 100644 --- a/Dotnet/Wine.cs +++ b/Dotnet/Wine.cs @@ -1,23 +1,23 @@ using System; using System.Runtime.InteropServices; -namespace VRCX; - -public static class Wine +namespace VRCX { - [DllImport("ntdll.dll")] - private static extern IntPtr wine_get_version(); - - public static bool GetIfWine() + public static class Wine { - // wine_get_version should be guaranteed to exist exclusively in Wine envs, - // unlike some other suggestions like checking Wine registry keys - try - { - wine_get_version(); - return true; - } - catch { return false; } - } -} + [DllImport("ntdll.dll")] + private static extern IntPtr wine_get_version(); + public static bool GetIfWine() + { + // wine_get_version should be guaranteed to exist exclusively in Wine envs, + // unlike some other suggestions like checking Wine registry keys + try + { + wine_get_version(); + return true; + } + catch { return false; } + } + } +} \ No newline at end of file diff --git a/Linux/install-vrcx.sh b/Linux/install-vrcx.sh index 76b6a31e..e38d9e85 100644 --- a/Linux/install-vrcx.sh +++ b/Linux/install-vrcx.sh @@ -83,6 +83,11 @@ cp seguiemj.ttf "$WINEPREFIX/drive_c/windows/Fonts" WINEPREFIX=$WINEPREFIX wine reg add 'HKLM\Software\Microsoft\Windows NT\CurrentVersion\Fonts' /v 'seguiemj' /t REG_SZ /d 'seguiemj.ttf' /f rm seguiemj.ttf +curl -L https://raw.githubusercontent.com/vrcx-team/VRCX/master/Linux/vrcx.sh -o $WINEPREFIX/drive_c/vrcx.sh +chmod +x $WINEPREFIX/drive_c/vrcx.sh + +curl -L https://raw.githubusercontent.com/vrcx-team/VRCX/master/Linux/winediscordipcbridge.exe -o $WINEPREFIX/drive_c/winediscordipcbridge.exe + echo "Install VRCX.png to $XDG_DATA_HOME/icons" curl -L https://raw.githubusercontent.com/vrcx-team/VRCX/master/VRCX.png -o "$XDG_DATA_HOME/icons/VRCX.png" @@ -91,7 +96,7 @@ echo "[Desktop Entry] Type=Application Name=VRCX Categories=Utility; -Exec=WINEPREFIX=$WINEPREFIX wine '$INSTALL_LOCATION/VRCX.exe' +Exec=$WINEPREFIX/drive_c/vrcx.sh Icon=VRCX " > $XDG_DATA_HOME/applications/vrcx.exe.desktop diff --git a/Linux/vrcx b/Linux/vrcx new file mode 100755 index 00000000..e626f139 --- /dev/null +++ b/Linux/vrcx @@ -0,0 +1,23 @@ +#!/usr/bin/env bash + +export WINEPREFIX=~/.local/share/vrcx + +wine ~/.local/share/vrcx/drive_c/winediscordipcbridge.exe & +IPCBRIDGE_PID=$! + +wine ~/.local/share/vrcx/drive_c/vrcx/VRCX.exe & +VRCX_PID=$! + +while kill -0 $VRCX_PID 2>/dev/null; do + if ps -A | grep -i "VRChat.exe" > /dev/null; then + isGameRunning=true + else + isGameRunning=false + fi + echo "isGameRunning=$isGameRunning" > "$WINEPREFIX/drive_c/users/$USER/AppData/Roaming/VRCX/wine.tmp" + sleep 1 +done + +echo "isGameRunning=false" > "$WINEPREFIX/drive_c/users/$USER/AppData/Roaming/VRCX/wine.tmp" + +kill $IPCBRIDGE_PID 2>/dev/null \ No newline at end of file diff --git a/Linux/winediscordipcbridge.exe b/Linux/winediscordipcbridge.exe new file mode 100644 index 0000000000000000000000000000000000000000..1eb725f69449c64d962b61da6ea920224ce6b1de GIT binary patch literal 16910 zcmeHO4|G)3nZGmh0%J1FjG9QKVSRQ74K_f6=pjnj2}vMmfItE$M8c4nAyX%rF!P24 z4L0#*fah~G?b5E>s)sB+TaVj4Yr9lXv<)N@sL&#^Ef%!YvfY=4p3+v4D(l8eYL47o-yDjGZPCd3sINtA^0l@`Byn9pjK*8VP^(zEq)u#!_yf}?Ovv__OV?I0 zR%5ZVH~!|P^=zI2Jk4CT9EB1&2a zwDGLP|LK08Yf-XM zrW>%-rx$qB*TrJgKS9i`rPk$77tswFbh!?pOEwO8voFQ<5?;l!dV-P&tP6M~2iZ2` z@e-aC=5&dD)@$NnAoD@DKePW?`%l-vKynxN60_=+&lZ&Q2fNG2s}`*q%Ia8KOF_hj zvZQpY&1}W<)x0^t>wcNADUy?qQA=92)3Mge`g(wu=$GaU2_7q!&<@^+kG=R%^Pa+x z;@19|ce;$u2H0FKD=79di&S0GFAo+B1bZ=;$ZL-Sb7X(8*R^|Tez5z)9E(&&l{LOy zeyIlt&W)=2sK_FbRk~7agV2<3L-;M;p`%P-zE{66C=m z@Sm*l2=bY8`i6_kmH%A1qORoRQu%D5dPnVsTITNq8dE!jk;x{>U~lP=t7jV|#!4FU zm;Mv^te~7Y=lV{WpKCMzPG2(`B`4(z7FW*(VDf&V-_`R5P0O-_K52}DIZ_ba#7S3A z4Fv(IZ zpx#09Cg*&QQkOEvqt!zsbu#Hf*_Sx)dcqH)$(0wC1InV)N#S~B`6;F94D6!XY7Ogr{IuJjoE;_9)KV|vh5HZb^2}DVo zh@{g;wovoJ;8wB1CiXtg1jOqj7HJtbEi-{!bEg|0i9@cQ!&pSkBb_CVNwH+$-2JQ9 zG(M2@T};IVSL0q%DCsis%i$FcCJ92{FhHB`m}hivABa4|0hfwz5$CQ$xoI2!^3EknBT!b z+MkB9C<T~lw&^P(pBWvBnr}N-5z?OsSO_ck*?JPuAI6(L9?&ccpL^SGhfv0 zq0I#0)3{piabJRi^(az4X&h1i3FF8|;IkNVl1;&OF1oW&=cAsDn#9XREoe)jJW4_- z_FlvUL~?3A(fP#r*IsG z7ql-)v9ytu{vl?U2P|E8v-o?cOaBl(0^OJNbCaW$to(w7w_&k# z!XiPSfl4o2L?y2uNc49cG%(!U@rb+vpZ-@GJ%G{Y!9e!`0&7zV#`zzv$jJ7)_pnXNq>_@SI2ra7^;JSrzBYi0WMrh}CRNwABjCl=^RA&x0bFe)t{%X473~DI4*?gR zct_Xll6bM}#STkCj~AL6=yiQxm@5xih}RO#DgEe6zrj4(lxa7k-wVP;=&%xfB%kzY z>*UVMVWmHJ$!j2iaspV`DlsGRqaV(E;&J;fDpstdfr+d0=dxtDfEsJj==l&?;1o8e{hN4hjMaZncKO%?DUp;`lSkiC2$CUxO-=gLw2sv>qes1K|ly4aX`qsjF;BLH`KZddhK;n+{ zkN_q917@Z(DkC3y?I7iQb#w%8J+Y zfKd8Q{CAg41dT#?gJ5QdbW(c{R=yP3;Bu_|E9&-MoCjl^t;b4hReN%&E`ONSK3*;O zYJR1cz3t6c+l03pJk@V|-Ke~8d+jif71E$LTYJ@oMy013apF*r1c?<#1?Dw)M8LgJ z7n=EK&PMIlCctgw!Fq~!!wx5Zd8s|fKTHD229HN;00As&{~Rd77JTPLvI3_V{Aq`2 z+}v*#qYYb$#0Ut(T!JQmp!OvUm?}lM!-dWkt9Lw3j)EOaHkRw_MW^JD-0x7`rEf-^ z*rVB2+DqSbJt~8iyw4){=a&91{w`&;=V5(ih&Es!V2sa97QDFcmsZOOrNcc07%0Am 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 O_RP}*&Bix