diff --git a/assets/jsons/translations/en.json b/assets/jsons/translations/en.json index 352d6fb1..65ee205b 100644 --- a/assets/jsons/translations/en.json +++ b/assets/jsons/translations/en.json @@ -133,6 +133,7 @@ "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.", + "beatmods-down": "Beatmods is currently unreachable. Please retry later. If the issue persists, inform us on Discord/GitHub.", "unknown": "An unknown error occurred ¯\\_(ツ)_/¯" }, "buttons": { diff --git a/src/main/ipcs/bs-mods-ipcs.ts b/src/main/ipcs/bs-mods-ipcs.ts index 627d541d..c024037b 100644 --- a/src/main/ipcs/bs-mods-ipcs.ts +++ b/src/main/ipcs/bs-mods-ipcs.ts @@ -1,6 +1,6 @@ import { BsModsManagerService } from "../services/mods/bs-mods-manager.service"; import { IpcService } from "../services/ipc.service"; -import { from, of } from "rxjs"; +import { from } from "rxjs"; const ipc = IpcService.getInstance(); @@ -36,6 +36,6 @@ ipc.on("bs-mods.uninstall-all-mods", (args, reply) => { ipc.on("bs-mods.get-mods-grid-status", (_, reply) => { const modsManager = BsModsManagerService.getInstance(); - reply(of(modsManager.getModsGridStatus())); -}) + reply(from(modsManager.getModsGridStatus())); +}); diff --git a/src/main/services/mods/beat-mods-api.service.ts b/src/main/services/mods/beat-mods-api.service.ts index 07ba0d79..c8e4bfd6 100644 --- a/src/main/services/mods/beat-mods-api.service.ts +++ b/src/main/services/mods/beat-mods-api.service.ts @@ -26,6 +26,17 @@ export class BeatModsApiService { this.requestService = RequestService.getInstance(); } + public async isUp(): Promise { + try { + // The data in status can be dropped + await this.requestService.getJSON<{}>(`${this.MODS_REPO_API_URL}/status`); + return true; + } catch (error) { + log.error("Could not connect to beatmods", error); + return false; + } + } + private getVersionModsUrl(version: BSVersion): string { const platform: BbmPlatform = version.oculus || version.metadata?.store === BsStore.OCULUS ? BbmPlatform.OculusPC : BbmPlatform.SteamPC; return `${this.MODS_REPO_API_URL}/mods?status=verified&gameVersion=${version.BSVersion}&gameName=BeatSaber&platform=${platform}`; diff --git a/src/main/services/mods/bs-mods-manager.service.ts b/src/main/services/mods/bs-mods-manager.service.ts index 95d66a0d..7d0997f6 100644 --- a/src/main/services/mods/bs-mods-manager.service.ts +++ b/src/main/services/mods/bs-mods-manager.service.ts @@ -566,7 +566,7 @@ export class BsModsManagerService { }); } - public getModsGridStatus(): ModsGridStatus { + public async getModsGridStatus(): Promise { if (process.platform === "linux") { const wineprefix = this.linuxService.getWinePrefixPath(); if (!wineprefix) { @@ -575,6 +575,12 @@ export class BsModsManagerService { } } + const beatModsUp = await this.beatModsApi.isUp(); + if (!beatModsUp) { + return ModsGridStatus.BEATMODS_DOWN; + } + + return ModsGridStatus.OK; } } 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 71a6d5fb..a6afcccd 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 @@ -9,7 +9,7 @@ import BeatWaitingImg from "../../../../../../assets/images/apngs/beat-waiting.p import BeatConflictImg from "../../../../../../assets/images/apngs/beat-conflict.png"; import { useObservable } from "renderer/hooks/use-observable.hook"; import { lastValueFrom } from "rxjs"; -import { useTranslation, useTranslationV2 } from "renderer/hooks/use-translation.hook"; +import { useTranslationV2 } from "renderer/hooks/use-translation.hook"; import { LinkOpenerService } from "renderer/services/link-opener.service"; import { ModalExitCode, ModalService } from "renderer/services/modale.service"; import { ModsDisclaimerModal } from "renderer/components/modal/modal-types/mods-disclaimer-modal.component"; @@ -232,10 +232,7 @@ export const ModsSlide = forwardRef(({ version, isActive, o return onDisclamerDecline?.(); } - let status = ModsGridStatus.OK; - if (window.electron.platform === "linux") { - status = await modsManager.getModsGridStatus(); - } + const status = await modsManager.getModsGridStatus(); setGridStatus(status); loadMods(); @@ -347,12 +344,12 @@ export const ModsSlide = forwardRef(({ version, isActive, o }); function ModStatus({ text, image, spin = false, children }: { text: string; image: string; spin?: boolean, children?: ReactNode}) { - const t = useTranslation(); + const { text: t } = useTranslationV2(); return (
 - {t(text)} + {t(text)} {children}
); diff --git a/src/shared/models/mods/mod-ipc.model.ts b/src/shared/models/mods/mod-ipc.model.ts index f97ddd4a..b3ce700d 100644 --- a/src/shared/models/mods/mod-ipc.model.ts +++ b/src/shared/models/mods/mod-ipc.model.ts @@ -16,6 +16,7 @@ export interface UninstallModsResult { export enum ModsGridStatus { OK = "", NO_WINEPREFIX = "no-wineprefix", + BEATMODS_DOWN = "beatmods-down", UNKNOWN = "unknown" }