diff --git a/assets/images/gifs/yuruyuri-dance.gif b/assets/images/gifs/yuruyuri-dance.gif new file mode 100644 index 00000000..03524548 Binary files /dev/null and b/assets/images/gifs/yuruyuri-dance.gif differ diff --git a/src/main/ipcs/bs-mods-ipcs.ts b/src/main/ipcs/bs-mods-ipcs.ts index b93bd3d8..3b757048 100644 --- a/src/main/ipcs/bs-mods-ipcs.ts +++ b/src/main/ipcs/bs-mods-ipcs.ts @@ -11,4 +11,13 @@ ipcMain.on("get-available-mods", (event, request: IpcRequest) => { modsManager.getAvailableMods(request.args).then(mods => { utils.ipcSend(request.responceChannel, {success: true, data: mods}); }).catch(() => utils.ipcSend(request.responceChannel, {success: false})); +}); + +ipcMain.on("get-installed-mods", (event, request: IpcRequest) => { + const utils = UtilsService.getInstance(); + const modsManager = BsModsManagerService.getInstance(); + + modsManager.getInstalledMods(request.args).then(mods => { + utils.ipcSend(request.responceChannel, {success: true, data: mods}); + }).catch(() => utils.ipcSend(request.responceChannel, {success: false})); }); \ No newline at end of file diff --git a/src/main/main.ts b/src/main/main.ts index 88808868..a0120845 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -31,10 +31,6 @@ log.catchErrors(); const utilsService = UtilsService.getInstance(); utilsService.setAssetsPath(app.isPackaged ? path.join(process.resourcesPath, 'assets') : path.join(__dirname, '../../assets')); -BsModsManagerService.getInstance().getInstalledMods({BSVersion: "1.18.3"}).then(mods => { - console.log(mods); -}) - if (process.env.NODE_ENV === 'production') { const sourceMapSupport = require('source-map-support'); sourceMapSupport.install(); diff --git a/src/main/services/mods/bs-mods-manager.service.ts b/src/main/services/mods/bs-mods-manager.service.ts index b6ca219e..7c7b76da 100644 --- a/src/main/services/mods/bs-mods-manager.service.ts +++ b/src/main/services/mods/bs-mods-manager.service.ts @@ -14,6 +14,8 @@ export class BsModsManagerService { private bsLocalService: BSLocalVersionService; private utilsService: UtilsService; + private manifestMatches: Mod[]; + public static getInstance(): BsModsManagerService{ if(!BsModsManagerService.instance){ BsModsManagerService.instance = new BsModsManagerService(); } return BsModsManagerService.instance; @@ -51,12 +53,24 @@ export class BsModsManagerService { return (async() => { const filePath = path.join(modsPath, f) const ext = path.extname(f); - if(ext !== ".dll" && ext !== ".exe" && ext !== ".manifest"){ return; } + if(ext !== ".dll" && ext !== ".exe" && ext !== ".manifest"){ return undefined; } const hash = await md5File(filePath); - return this.getModFromHash(hash); + const mod = await this.getModFromHash(hash); + if(!mod){ return undefined; } + if(ext === ".manifest"){ + this.manifestMatches.push(mod); + return undefined; + } + if(filePath.includes("Libs")){ + if(!this.manifestMatches.some(m => m.name === mod.name)){ return undefined; } + const modIndex = this.manifestMatches.indexOf(mod); + if(modIndex > -1){ this.manifestMatches.splice(modIndex, 1); } + } + return mod; })() }); - return Promise.all(promises) + const mods = await Promise.all(promises) + return mods.filter(m => !!m); } private async getBsipaInstalled(version: BSVersion): Promise{ @@ -72,10 +86,17 @@ export class BsModsManagerService { } public async getInstalledMods(version: BSVersion): Promise{ + this.manifestMatches = []; await this.beatModsApi.loadAllMods(); - this.getBsipaInstalled(version).then(bsipa => console.log(bsipa)); - this.getModsInDir(version, ModsInstallFolder.LIBS).then(mods => console.log(mods)); - return []; + const bsipa = await this.getBsipaInstalled(version); + return Promise.all([ + this.getModsInDir(version, ModsInstallFolder.PLUGINS_PENDING), + this.getModsInDir(version, ModsInstallFolder.LIBS_PENDING), + this.getModsInDir(version, ModsInstallFolder.PLUGINS), + this.getModsInDir(version, ModsInstallFolder.LIBS) + ]).then(dirMods => { + return [((!!bsipa) && bsipa), ...Array.from(new Map(dirMods.flat().map(m => [m.name, m])).values())]; + }) } public installMods(mods: Mod[], version: BSVersion){ diff --git a/src/renderer/components/shared/UwU/spoiler-click.component.tsx b/src/renderer/components/shared/UwU/spoiler-click.component.tsx new file mode 100644 index 00000000..4ff222ab --- /dev/null +++ b/src/renderer/components/shared/UwU/spoiler-click.component.tsx @@ -0,0 +1,23 @@ +import {motion, useCycle} from "framer-motion" +import { useState } from "react" + +type Props = {className?: string, nbClickToShow?: number, children?: JSX.Element} + +export function SpoilerClick({className, children, nbClickToShow = 5}: Props) { + + const [remainingClicks, setRemainingClicks] = useState(nbClickToShow); + const [translateY, setTranslateY] = useState("100%") + + console.log(translateY); + + const handleClicks = () => { + if(remainingClicks - 1 > 0){ setRemainingClicks(nb => nb - 1); } + setTranslateY(`${(((remainingClicks - 1) / nbClickToShow) * 100)}%`) + } + + return ( + + {children} + + ) +} diff --git a/src/renderer/components/shared/bsm-checkbox.component.tsx b/src/renderer/components/shared/bsm-checkbox.component.tsx index 4cc83d64..cb715a3d 100644 --- a/src/renderer/components/shared/bsm-checkbox.component.tsx +++ b/src/renderer/components/shared/bsm-checkbox.component.tsx @@ -21,7 +21,7 @@ export function BsmCheckbox({className, checked, onChange, disabled} : Props) { {!disabled &&
}
{e.stopPropagation(); handleClick()}}> - +
diff --git a/src/renderer/components/version-viewer/slides/mods/mods-grid.component.tsx b/src/renderer/components/version-viewer/slides/mods/mods-grid.component.tsx index 4d3cc044..21a573d6 100644 --- a/src/renderer/components/version-viewer/slides/mods/mods-grid.component.tsx +++ b/src/renderer/components/version-viewer/slides/mods/mods-grid.component.tsx @@ -36,7 +36,7 @@ export function ModsGrid({modsMap, installed, modsSelected, onModChange, moreInf } return modsMap && ( -
+
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 5d6b85d2..ec423e83 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 @@ -8,7 +8,10 @@ import { ConfigurationService } from "renderer/services/configuration.service"; import { DefaultConfigKey } from "renderer/config/default-configuration.config"; import { BsmButton } from "renderer/components/shared/bsm-button.component"; import { IpcService } from "renderer/services/ipc.service"; - +import BeatWaitingImg from "../../../../../../assets/images/apngs/beat-waiting.png" +import { SpoilerClick } from "renderer/components/shared/UwU/spoiler-click.component"; +import YuruYuriDance from "../../../../../../assets/images/gifs/yuruyuri-dance.gif" + export function ModsSlide({version}: {version: BSVersion}) { const modsManager = BsModsManagerService.getInstance(); @@ -54,12 +57,15 @@ export function ModsSlide({version}: {version: BSVersion}) { useEffect(() => { if(isVisible){ - modsManager.getAvailableMods(version).then(mods => { - setModsAvailable(modsToCategoryMap(mods)); + Promise.all([ + modsManager.getAvailableMods(version), + modsManager.getInstalledMods(version) + ]).then(([available, installed]) => { const defaultMods = configService.get("default_mods" as DefaultConfigKey); - setModsSelected(mods.filter(m => m.required || defaultMods.some(d => m.name === d))); + setModsAvailable(modsToCategoryMap(available)); + setModsSelected(available.filter(m => m.required || defaultMods.some(d => m.name === d))); + setModsInstalled(modsToCategoryMap(installed)) }); - modsManager.getInstalledMods(version).then(mods => setModsInstalled(modsToCategoryMap(mods))); } return () => { @@ -75,13 +81,25 @@ export function ModsSlide({version}: {version: BSVersion}) {
-
- -
-
- - -
+ {modsAvailable ? ( + <> +
+ +
+
+ + +
+ + ) : ( +
+ + Chargement des mods... + + + +
+ )}
diff --git a/src/renderer/services/bs-mods-manager.service.ts b/src/renderer/services/bs-mods-manager.service.ts index e12cb54a..2f1af9f5 100644 --- a/src/renderer/services/bs-mods-manager.service.ts +++ b/src/renderer/services/bs-mods-manager.service.ts @@ -21,8 +21,8 @@ export class BsModsManagerService { return this.ipcService.send("get-available-mods", {args: version}).then(res => res.data); } - public async getInstalledMods(version: BSVersion): Promise{ - return []; + public getInstalledMods(version: BSVersion): Promise{ + return this.ipcService.send("get-installed-mods", {args: version}).then(res => res.data); } public installMods(mods: Mod[], version: BSVersion){