Merge pull request #793 from silentrald/bugfix/linux-wineprefix-fallback

[bugfix] Don't fallback to system WINEPREFIX
This commit is contained in:
MathieuG-P
2025-02-10 23:06:04 +01:00
committed by GitHub
21 changed files with 166 additions and 34 deletions
+6 -1
View File
@@ -131,6 +131,10 @@
"loading-mods": "Lade Mods...",
"no-internet": "Kein Internet",
"mods-not-available": "Für diese Version von Beat Saber sind noch keine Mods verfügbar.",
"status": {
"no-wineprefix": "Konnte den BSManager WINEPREFIX-Pfad nicht finden. Bitte starte Beat Saber zuerst in BSManager.",
"unknown": "Ein unbekannter Fehler ist aufgetreten ¯\\_(ツ)_/¯"
},
"buttons": {
"more-infos": "Mehr Infos",
"install-or-update": "Installieren oder aktualisieren",
@@ -592,7 +596,8 @@
"msg": {
"success": "Alle Mods wurden entfernt.",
"errors": {
"no-mods": "Keine Mods sind in dieser Version installiert 😑"
"no-mods": "Keine Mods sind in dieser Version installiert 😑",
"no-wineprefix": "Konnte den BSManager WINEPREFIX-Pfad nicht finden. Bitte starte Beat Saber zuerst in BSManager."
}
}
},
+6 -1
View File
@@ -131,6 +131,10 @@
"loading-mods": "Loading mods...",
"no-internet": "No internet",
"mods-not-available": "No mods are available yet for this version of Beat Saber",
"status": {
"no-wineprefix": "Could not find BSManager WINEPREFIX path. Please launch Beat Saber in BSManager first.",
"unknown": "An unknown error occurred ¯\\_(ツ)_/¯"
},
"buttons": {
"more-infos": "More info",
"install-or-update": "Install or update",
@@ -592,7 +596,8 @@
"msg": {
"success": "All mods have been uninstalled.",
"errors": {
"no-mods": "No mods are installed in this version 😑"
"no-mods": "No mods are installed in this version 😑",
"no-wineprefix": "Could not find BSManager WINEPREFIX path. Please launch Beat Saber in BSManager first."
}
}
},
+6 -1
View File
@@ -131,6 +131,10 @@
"loading-mods": "Cargando mods...",
"no-internet": "Sin internet",
"mods-not-available": "Aún no hay mods disponibles para esta versión de Beat Saber",
"status": {
"no-wineprefix": "No se pudo encontrar la ruta del WINEPREFIX de BSManager. Por favor, inicia Beat Saber en BSManager primero.",
"unknown": "Se ha producido un error desconocido ¯\\_(ツ)_/¯"
},
"buttons": {
"more-infos": "Más información",
"install-or-update": "Instalar o actualizar",
@@ -592,7 +596,8 @@
"msg": {
"success": "Todos los mods han sido desinstalados.",
"errors": {
"no-mods": "No hay mods instalados en esta versión 😑"
"no-mods": "No hay mods instalados en esta versión 😑",
"no-wineprefix": "No se pudo encontrar la ruta del WINEPREFIX de BSManager. Por favor, inicia Beat Saber en BSManager primero."
}
}
},
+6 -1
View File
@@ -131,6 +131,10 @@
"loading-mods": "Chargement des mods...",
"no-internet": "Pas d'accès Internet",
"mods-not-available": "Aucun mod n'est encore disponible pour cette version de Beat Saber",
"status": {
"no-wineprefix": "Impossible de trouver le chemin WINEPREFIX de BSManager. Veuillez d'abord lancer Beat Saber dans BSManager.",
"unknown": "Une erreur inconnue s'est produite ¯\\_(ツ)_/¯"
},
"buttons": {
"more-infos": "Plus d'infos",
"install-or-update": "Installer ou mettre à jour",
@@ -592,7 +596,8 @@
"msg": {
"success": "Tous les mods ont été désinstallés.",
"errors": {
"no-mods": "Aucun mod n'est installé dans dans cette version 😑"
"no-mods": "Aucun mod n'est installé dans dans cette version 😑",
"no-wineprefix": "Impossible de trouver le chemin WINEPREFIX de BSManager. Veuillez d'abord lancer Beat Saber dans BSManager."
}
}
},
+6 -1
View File
@@ -131,6 +131,10 @@
"loading-mods": "Caricamento delle mod in corso...",
"no-internet": "Internet non disponibile",
"mods-not-available": "Nessuna mod è ancora disponibile per questa versione di Beat Saber",
"status": {
"no-wineprefix": "Impossibile trovare il percorso del WINEPREFIX di BSManager. Per favore avvia prima Beat Saber in BSManager.",
"unknown": "È accaduto un errore sconosciuto ¯\\_(ツ)_/¯"
},
"buttons": {
"more-infos": "Più info",
"install-or-update": "Installa o aggiorna",
@@ -592,7 +596,8 @@
"msg": {
"success": "Tutte le mod sono state installate.",
"errors": {
"no-mods": "Non ci sono mod installate su questa versione 😑"
"no-mods": "Non ci sono mod installate su questa versione 😑",
"no-wineprefix": "Impossibile trovare il percorso del WINEPREFIX di BSManager. Per favore avvia prima Beat Saber in BSManager."
}
}
},
+6 -1
View File
@@ -131,6 +131,10 @@
"loading-mods": "Modを読み込み中...",
"no-internet": "インターネット接続がありません!",
"mods-not-available": "このバージョンで使用できるMODはまだありません。",
"status": {
"no-wineprefix": "BSManager WINEPREFIXのパスが見つかりませんでした。まずBSManagerでBeat Saberを起動してください。",
"unknown": "不明なエラーが発生しました (´・ω・`)"
},
"buttons": {
"more-infos": "詳細情報",
"install-or-update": "インストールとアップデート",
@@ -592,7 +596,8 @@
"msg": {
"success": "すべてのModをアンインストールしました。",
"errors": {
"no-mods": "このバージョンのModはインストールされていません 😑"
"no-mods": "このバージョンのModはインストールされていません 😑",
"no-wineprefix": "BSManager WINEPREFIXのパスが見つかりませんでした。まずBSManagerでBeat Saberを起動してください。"
}
}
},
+6 -1
View File
@@ -131,6 +131,10 @@
"loading-mods": "모드를 불러오는 중...",
"no-internet": "인터넷 연결이 없습니다!",
"mods-not-available": "이 버전에서 사용할 수 있는 모드가 아직 없습니다.",
"status": {
"no-wineprefix": "BSManager WINEPREFIX 경로를 찾을 수 없습니다. 먼저 BSManager에서 Beat Saber를 실행하세요.",
"unknown": "알 수 없는 오류가 발생했습니다 (´・ω・`)"
},
"buttons": {
"more-infos": "자세히 보기",
"install-or-update": "설치 및 업데이트",
@@ -592,7 +596,8 @@
"msg": {
"success": "모든 Mod가 제거되었습니다.",
"errors": {
"no-mods": "이 버전에 설치된 Mod가 없습니다 😑"
"no-mods": "이 버전에 설치된 Mod가 없습니다 😑",
"no-wineprefix": "BSManager WINEPREFIX 경로를 찾을 수 없습니다. 먼저 BSManager에서 Beat Saber를 실행하세요."
}
}
},
+6 -1
View File
@@ -131,6 +131,10 @@
"loading-mods": "Carregando mods...",
"no-internet": "Sem internet",
"mods-not-available": "Nenhum mod está disponível para essa versão de Beat Saber ainda",
"status": {
"no-wineprefix": "Não foi possível encontrar o caminho WINEPREFIX do BSManager. Por favor, inicie o Beat Saber no BSManager primeiro.",
"unknown": "Um erro desconhecido aconteceu ¯\\_(ツ)_/¯"
},
"buttons": {
"more-infos": "Mais informações",
"install-or-update": "Instalar ou Atualizar",
@@ -592,7 +596,8 @@
"msg": {
"success": "Todos os mods foram desinstalados.",
"errors": {
"no-mods": "Nenhum mod está instalado nessa versão 😑"
"no-mods": "Nenhum mod está instalado nessa versão 😑",
"no-wineprefix": "Não foi possível encontrar o caminho WINEPREFIX do BSManager. Por favor, inicie o Beat Saber no BSManager primeiro."
}
}
},
+6 -1
View File
@@ -131,6 +131,10 @@
"loading-mods": "Загрузка модов...",
"no-internet": "Нет интернета",
"mods-not-available": "Не найдены моды для этой версии Beat Saber",
"status": {
"no-wineprefix": "Не удалось найти путь WINEPREFIX BSManager. Пожалуйста, сначала запустите Beat Saber в BSManager.",
"unknown": "Неизвестная ошибка ¯\\_(ツ)_/¯"
},
"buttons": {
"more-infos": "Подробнее",
"install-or-update": "Установить или обновить",
@@ -592,7 +596,8 @@
"msg": {
"success": "Все моды были удалены.",
"errors": {
"no-mods": "Для этой версии не было установлено модов 😑"
"no-mods": "Для этой версии не было установлено модов 😑",
"no-wineprefix": "Не удалось найти путь WINEPREFIX BSManager. Пожалуйста, сначала запустите Beat Saber в BSManager."
}
}
},
+6 -1
View File
@@ -131,6 +131,10 @@
"loading-mods": "Naglo-load ng mga mod...",
"no-internet": "Walang internet",
"mods-not-available": "Walang mod na available pa para sa bersyon na ito ng Beat Saber",
"status": {
"no-wineprefix": "Hindi mahanap ang WINEPREFIX path ng BSManager. Pakilunsad muna ang Beat Saber sa BSManager.",
"unknown": "May naganap na hindi kilalang error ¯\\_(ツ)_/¯"
},
"buttons": {
"more-infos": "Higit pang impormasyon",
"install-or-update": "I-install o i-update",
@@ -592,7 +596,8 @@
"msg": {
"success": "Lahat ng mod ay na-uninstall na.",
"errors": {
"no-mods": "Walang mod na naka-install sa bersyong ito 😑"
"no-mods": "Walang mod na naka-install sa bersyong ito 😑",
"no-wineprefix": "Hindi mahanap ang WINEPREFIX path ng BSManager. Pakilunsad muna ang Beat Saber sa BSManager."
}
}
},
+6 -1
View File
@@ -131,6 +131,10 @@
"loading-mods": "Завантаження модів...",
"no-internet": "Немає інтернету",
"mods-not-available": "Для цієї версії Beat Saber поки що немає модів",
"status": {
"no-wineprefix": "Не вдалося знайти шлях до WINEPREFIX BSManager. Будь ласка, спочатку запустіть Beat Saber у BSManager.",
"unknown": "Сталася невідома помилка ¯\\_(ツ)_/¯"
},
"buttons": {
"more-infos": "Більше інформації",
"install-or-update": "Встановити або оновити",
@@ -592,7 +596,8 @@
"msg": {
"success": "Усі моди були видалені.",
"errors": {
"no-mods": "У цій версії не встановлено жодних модів 😑"
"no-mods": "У цій версії не встановлено жодних модів 😑",
"no-wineprefix": "Не вдалося знайти шлях до WINEPREFIX BSManager. Будь ласка, спочатку запустіть Beat Saber у BSManager."
}
}
},
+6 -1
View File
@@ -131,6 +131,10 @@
"loading-mods": "Mod 載入中...",
"no-internet": "無網路",
"mods-not-available": "該版本 BeatSaber 暫無可用 Mod",
"status": {
"no-wineprefix": "找不到 BSManager WINEPREFIX 路徑。請先在 BSManager 中啟動 Beat Saber。",
"unknown": "發生了一個錯誤 ¯\\_(ツ)_/¯"
},
"buttons": {
"more-infos": "更多資訊",
"install-or-update": "安裝或更新",
@@ -592,7 +596,8 @@
"msg": {
"success": "所有 Mod 已被移除。",
"errors": {
"no-mods": "該版本中沒有安裝 Mod 😑"
"no-mods": "該版本中沒有安裝 Mod 😑",
"no-wineprefix": "找不到 BSManager WINEPREFIX 路徑。請先在 BSManager 中啟動 Beat Saber。"
}
}
},
+7 -2
View File
@@ -21,7 +21,7 @@
"copied": "已复制!",
"confirm": "确认",
"choose-folder": "选择文件夹",
"Unknown": "发生了一个错误 ¯\\_(ツ)_/¯",
"unknown": "发生了一个错误 ¯\\_(ツ)_/¯",
"warning": "警告",
"continue": "继续",
"shared": "共享",
@@ -131,6 +131,10 @@
"loading-mods": "Mod 加载中...",
"no-internet": "无网络",
"mods-not-available": "该版本 BeatSaber 暂无可用 Mod",
"status": {
"no-wineprefix": "找不到 BSManager WINEPREFIX 路径。请先在 BSManager 中启动 Beat Saber。",
"unknown": "发生了一个错误 ¯\\_(ツ)_/¯"
},
"buttons": {
"more-infos": "更多信息",
"install-or-update": "安装或更新",
@@ -592,7 +596,8 @@
"msg": {
"success": "所有 Mod 已被卸载。",
"errors": {
"no-mods": "该版本中没有安装 Mod 😑"
"no-mods": "该版本中没有安装 Mod 😑",
"no-wineprefix": "找不到 BSManager WINEPREFIX 路径。请先在 BSManager 中启动 Beat Saber。"
}
}
},
+1
View File
@@ -33,3 +33,4 @@ ipc.on("bs-mods.uninstall-all-mods", (args, reply) => {
const modsManager = BsModsManagerService.getInstance();
reply(modsManager.uninstallAllMods(args));
});
+5
View File
@@ -9,3 +9,8 @@ ipc.on("linux.verify-proton-folder", (_, reply) => {
reply(of(linuxService.verifyProtonPath()));
});
ipc.on("linux.get-wine-prefix-path", (_, reply) => {
const linuxService = LinuxService.getInstance();
reply(of(linuxService.getWinePrefixPath()));
});
@@ -158,11 +158,10 @@ export class BsModsManagerService {
winePath = `"${winePathResult}"`;
const winePrefix = this.linuxService.getWinePrefixPath();
if (winePrefix) {
env.WINEPREFIX = winePrefix;
} else {
log.warn("Could not find BSManager WINEPREFIX path, using system's default value instead");
if (!winePrefix) {
throw new CustomError("Could not find BSManager WINEPREFIX path", "no-wineprefix");
}
env.WINEPREFIX = winePrefix;
}
return new Promise<boolean>(resolve => {
@@ -22,6 +22,7 @@ import { UninstallAllModsModal } from "renderer/components/modal/modal-types/uni
import Tippy from "@tippyjs/react";
import { ProgressBarService } from "renderer/services/progress-bar.service";
import { Dropzone } from "renderer/components/shared/dropzone.component";
import { ModsGridStatus } from "shared/models/mods/mod-ipc.model";
export type ModsSlideRef = {
loadMods: () => Promise<void>;
@@ -42,6 +43,7 @@ export const ModsSlide = forwardRef<ModsSlideRef, Props>(({ version, isActive, o
const os = useService(OsDiagnosticService);
const progress = useService(ProgressBarService);
const [gridStatus, setGridStatus] = useState(ModsGridStatus.OK);
const [modsAvailable, setModsAvailable] = useState(null as Map<BbmCategories, BbmFullMod[]>);
const [modsInstalled, setModsInstalled] = useState(null as Map<BbmCategories, BbmFullMod[]>);
const [modsSelected, setModsSelected] = useState([] as BbmFullMod[]);
@@ -185,8 +187,23 @@ export const ModsSlide = forwardRef<ModsSlideRef, Props>(({ version, isActive, o
setModsSelected(() => []);
}
const ensureDisclaimerAccepted = async (): Promise<boolean> => {
if (configService.get<boolean>(ACCEPTED_DISCLAIMER_KEY)) {
return true;
}
const res = await modals.openModal(ModsDisclaimerModal);
const haveAccepted = res.exitCode === ModalExitCode.COMPLETED;
if (haveAccepted) {
configService.set(ACCEPTED_DISCLAIMER_KEY, true);
}
return haveAccepted;
}
const loadMods = async (): Promise<void> => {
if (os.isOffline) {
if (os.isOffline || gridStatus !== ModsGridStatus.OK) {
return Promise.resolve();
}
@@ -209,24 +226,14 @@ export const ModsSlide = forwardRef<ModsSlideRef, Props>(({ version, isActive, o
return noop();
}
(async () => {
if (configService.get<boolean>(ACCEPTED_DISCLAIMER_KEY)) {
return true;
}
const res = await modals.openModal(ModsDisclaimerModal);
const haveAccepted = res.exitCode === ModalExitCode.COMPLETED;
if (haveAccepted) {
configService.set(ACCEPTED_DISCLAIMER_KEY, true);
}
return haveAccepted;
})().then(canLoad => {
ensureDisclaimerAccepted().then(async canLoad => {
if (!canLoad) {
return onDisclamerDecline?.();
}
const status = await modsManager.getModsGridStatus();
setGridStatus(() => status);
loadMods();
});
@@ -234,6 +241,7 @@ export const ModsSlide = forwardRef<ModsSlideRef, Props>(({ version, isActive, o
setMoreInfoMod(null);
setModsAvailable(null);
setModsInstalled(null);
setGridStatus(ModsGridStatus.OK);
};
}, [isActive, isOnline, version]);
@@ -262,6 +270,9 @@ export const ModsSlide = forwardRef<ModsSlideRef, Props>(({ version, isActive, o
if (!isOnline) {
return <ModStatus text="pages.version-viewer.mods.no-internet" image={BeatConflictImg} />;
}
if (gridStatus !== ModsGridStatus.OK) {
return <ModStatus text={`pages.version-viewer.mods.status.${gridStatus}`} image={BeatConflictImg} />;
}
if (!modsAvailable) {
return <ModStatus text="pages.version-viewer.mods.loading-mods" image={BeatWaitingImg} spin />;
}
@@ -337,7 +348,7 @@ function ModStatus({ text, image, spin = false, children }: { text: string; imag
return (
<div className="w-full h-full flex flex-col items-center justify-center text-gray-800 dark:text-gray-200">
<img className={`w-32 h-32 ${spin ? "spin-loading" : ""}`} src={image} alt=" " />
<span className="text-xl mt-3 italic">{t(text)}</span>
<span className="text-xl mt-3 italic text-center">{t(text)}</span>
{children}
</div>
);
@@ -8,6 +8,8 @@ import { Progression } from "main/helpers/fs.helpers";
import { ProgressionInterface } from "shared/models/progress-bar";
import { BbmFullMod, BbmModVersion } from "shared/models/mods/mod.interface";
import { logRenderError } from "renderer";
import { ModsGridStatus } from "shared/models/mods/mod-ipc.model";
import { LinuxService } from "./linux.service";
export class BsModsManagerService {
private static instance: BsModsManagerService;
@@ -17,6 +19,7 @@ export class BsModsManagerService {
private readonly ipcService: IpcService;
private readonly progressBar: ProgressBarService;
private readonly notifications: NotificationService;
private readonly linux: LinuxService
public readonly isUninstalling$: BehaviorSubject<boolean> = new BehaviorSubject(false);
@@ -31,6 +34,7 @@ export class BsModsManagerService {
this.ipcService = IpcService.getInstance();
this.progressBar = ProgressBarService.getInstance();
this.notifications = NotificationService.getInstance();
this.linux = LinuxService.getInstance();
}
public getAvailableMods(version: BSVersion): Observable<BbmFullMod[]> {
@@ -204,4 +208,17 @@ export class BsModsManagerService {
return { available: (available ?? []), installed: (installedMods ?? []) };
}
public async getModsGridStatus(): Promise<ModsGridStatus> {
if(window.electron.platform === "linux"){
const winePrefix = await lastValueFrom(this.linux.getWinePrefixPath());
if(!winePrefix){
logRenderError("Could not find BSManager WINEPREFIX path");
return ModsGridStatus.NO_WINEPREFIX;
}
}
return ModsGridStatus.OK;
}
}
+26
View File
@@ -0,0 +1,26 @@
import { Observable } from "rxjs";
import { IpcService } from "./ipc.service";
export class LinuxService {
private static instance: LinuxService;
public static getInstance(): LinuxService {
if (!LinuxService.instance) {
LinuxService.instance = new LinuxService();
}
return LinuxService.instance;
}
private readonly ipc: IpcService;
private constructor() {
this.ipc = IpcService.getInstance();
}
public getWinePrefixPath(): Observable<string> {
return this.ipc.sendV2("linux.get-wine-prefix-path");
}
}
+1
View File
@@ -159,6 +159,7 @@ export interface IpcChannelMapping {
/* ** linux.ipcs ** */
"linux.verify-proton-folder": { request: void, response: boolean };
"linux.get-wine-prefix-path": { request: void, response: string };
/* ** oculus.ipcs ** */
"is-oculus-sideloaded-apps-enabled": { request: void, response: boolean };
+7
View File
@@ -12,3 +12,10 @@ export interface UninstallModsResult {
nbModsToUninstall: number;
nbUninstalledMods: number;
}
export enum ModsGridStatus {
OK = "",
NO_WINEPREFIX = "no-wineprefix",
UNKNOWN = "unknown"
}