diff --git a/assets/jsons/translations/de.json b/assets/jsons/translations/de.json index a1644cf7..5bb02c52 100644 --- a/assets/jsons/translations/de.json +++ b/assets/jsons/translations/de.json @@ -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." } } }, diff --git a/assets/jsons/translations/en.json b/assets/jsons/translations/en.json index b881d2ff..30668322 100644 --- a/assets/jsons/translations/en.json +++ b/assets/jsons/translations/en.json @@ -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." } } }, diff --git a/assets/jsons/translations/es.json b/assets/jsons/translations/es.json index 50da2c5c..06d68788 100644 --- a/assets/jsons/translations/es.json +++ b/assets/jsons/translations/es.json @@ -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." } } }, diff --git a/assets/jsons/translations/fr.json b/assets/jsons/translations/fr.json index e3b586ea..9bf5d10b 100644 --- a/assets/jsons/translations/fr.json +++ b/assets/jsons/translations/fr.json @@ -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." } } }, diff --git a/assets/jsons/translations/it.json b/assets/jsons/translations/it.json index 325856e4..fc627bb0 100644 --- a/assets/jsons/translations/it.json +++ b/assets/jsons/translations/it.json @@ -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." } } }, diff --git a/assets/jsons/translations/ja.json b/assets/jsons/translations/ja.json index 0abecefc..ab297372 100644 --- a/assets/jsons/translations/ja.json +++ b/assets/jsons/translations/ja.json @@ -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を起動してください。" } } }, diff --git a/assets/jsons/translations/ko.json b/assets/jsons/translations/ko.json index 0d43b598..e8e6d500 100644 --- a/assets/jsons/translations/ko.json +++ b/assets/jsons/translations/ko.json @@ -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를 실행하세요." } } }, diff --git a/assets/jsons/translations/pt-br.json b/assets/jsons/translations/pt-br.json index 16d8eb5a..0c017c15 100644 --- a/assets/jsons/translations/pt-br.json +++ b/assets/jsons/translations/pt-br.json @@ -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." } } }, diff --git a/assets/jsons/translations/ru.json b/assets/jsons/translations/ru.json index 5a10299b..504869cf 100644 --- a/assets/jsons/translations/ru.json +++ b/assets/jsons/translations/ru.json @@ -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." } } }, diff --git a/assets/jsons/translations/tl.json b/assets/jsons/translations/tl.json index eb916211..4a99478f 100644 --- a/assets/jsons/translations/tl.json +++ b/assets/jsons/translations/tl.json @@ -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." } } }, diff --git a/assets/jsons/translations/uk.json b/assets/jsons/translations/uk.json index b9b3a383..1c69a75e 100644 --- a/assets/jsons/translations/uk.json +++ b/assets/jsons/translations/uk.json @@ -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." } } }, diff --git a/assets/jsons/translations/zh-tw.json b/assets/jsons/translations/zh-tw.json index 650fa7b4..8e7aca31 100644 --- a/assets/jsons/translations/zh-tw.json +++ b/assets/jsons/translations/zh-tw.json @@ -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。" } } }, diff --git a/assets/jsons/translations/zh.json b/assets/jsons/translations/zh.json index 6678d935..783309fc 100644 --- a/assets/jsons/translations/zh.json +++ b/assets/jsons/translations/zh.json @@ -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。" } } }, diff --git a/src/main/ipcs/bs-mods-ipcs.ts b/src/main/ipcs/bs-mods-ipcs.ts index 0792538a..fd0cc1d9 100644 --- a/src/main/ipcs/bs-mods-ipcs.ts +++ b/src/main/ipcs/bs-mods-ipcs.ts @@ -33,3 +33,4 @@ ipc.on("bs-mods.uninstall-all-mods", (args, reply) => { const modsManager = BsModsManagerService.getInstance(); reply(modsManager.uninstallAllMods(args)); }); + diff --git a/src/main/ipcs/linux.ipcs.ts b/src/main/ipcs/linux.ipcs.ts index d40ad9fa..c1ac2387 100644 --- a/src/main/ipcs/linux.ipcs.ts +++ b/src/main/ipcs/linux.ipcs.ts @@ -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())); +}); + diff --git a/src/main/services/mods/bs-mods-manager.service.ts b/src/main/services/mods/bs-mods-manager.service.ts index 4b084653..f127ecaf 100644 --- a/src/main/services/mods/bs-mods-manager.service.ts +++ b/src/main/services/mods/bs-mods-manager.service.ts @@ -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(resolve => { diff --git a/src/renderer/components/version-viewer/slides/mods/mods-slide.component.tsx b/src/renderer/components/version-viewer/slides/mods/mods-slide.component.tsx index 97854b4d..e2c423bd 100644 --- a/src/renderer/components/version-viewer/slides/mods/mods-slide.component.tsx +++ b/src/renderer/components/version-viewer/slides/mods/mods-slide.component.tsx @@ -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; @@ -42,6 +43,7 @@ export const ModsSlide = forwardRef(({ version, isActive, o const os = useService(OsDiagnosticService); const progress = useService(ProgressBarService); + const [gridStatus, setGridStatus] = useState(ModsGridStatus.OK); const [modsAvailable, setModsAvailable] = useState(null as Map); const [modsInstalled, setModsInstalled] = useState(null as Map); const [modsSelected, setModsSelected] = useState([] as BbmFullMod[]); @@ -185,8 +187,23 @@ export const ModsSlide = forwardRef(({ version, isActive, o setModsSelected(() => []); } + const ensureDisclaimerAccepted = async (): Promise => { + if (configService.get(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 => { - if (os.isOffline) { + if (os.isOffline || gridStatus !== ModsGridStatus.OK) { return Promise.resolve(); } @@ -209,24 +226,14 @@ export const ModsSlide = forwardRef(({ version, isActive, o return noop(); } - (async () => { - if (configService.get(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(({ version, isActive, o setMoreInfoMod(null); setModsAvailable(null); setModsInstalled(null); + setGridStatus(ModsGridStatus.OK); }; }, [isActive, isOnline, version]); @@ -262,6 +270,9 @@ export const ModsSlide = forwardRef(({ version, isActive, o if (!isOnline) { return ; } + if (gridStatus !== ModsGridStatus.OK) { + return ; + } if (!modsAvailable) { return ; } @@ -337,7 +348,7 @@ function ModStatus({ text, image, spin = false, children }: { text: string; imag return (
 - {t(text)} + {t(text)} {children}
); diff --git a/src/renderer/services/bs-mods-manager.service.ts b/src/renderer/services/bs-mods-manager.service.ts index 1fe17e10..dd712cf9 100644 --- a/src/renderer/services/bs-mods-manager.service.ts +++ b/src/renderer/services/bs-mods-manager.service.ts @@ -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 = 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 { @@ -204,4 +208,17 @@ export class BsModsManagerService { return { available: (available ?? []), installed: (installedMods ?? []) }; } + public async getModsGridStatus(): Promise { + + 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; + } + } diff --git a/src/renderer/services/linux.service.ts b/src/renderer/services/linux.service.ts new file mode 100644 index 00000000..f08829a4 --- /dev/null +++ b/src/renderer/services/linux.service.ts @@ -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 { + return this.ipc.sendV2("linux.get-wine-prefix-path"); + } + + +} diff --git a/src/shared/models/ipc/ipc-routes.ts b/src/shared/models/ipc/ipc-routes.ts index 9337b337..db3748df 100644 --- a/src/shared/models/ipc/ipc-routes.ts +++ b/src/shared/models/ipc/ipc-routes.ts @@ -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 }; diff --git a/src/shared/models/mods/mod-ipc.model.ts b/src/shared/models/mods/mod-ipc.model.ts index f1c4613d..f97ddd4a 100644 --- a/src/shared/models/mods/mod-ipc.model.ts +++ b/src/shared/models/mods/mod-ipc.model.ts @@ -12,3 +12,10 @@ export interface UninstallModsResult { nbModsToUninstall: number; nbUninstalledMods: number; } + +export enum ModsGridStatus { + OK = "", + NO_WINEPREFIX = "no-wineprefix", + UNKNOWN = "unknown" +} +