diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 33629ba..a03d748 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -149,6 +149,7 @@ async fn download( name: String, hash: String, download_type: i8, + mod_id: String, ) -> String { println!("[download] Starting download for '{}' from '{}'", name, url); let _ = app.emit("download-start", format!("{}", name)); @@ -464,7 +465,11 @@ async fn download( app.clone(), download_zip_path.clone(), if download_type == 2 { - game_path.join(&name).join("BepInEx").join("plugins") + game_path + .join(&name) + .join("BepInEx") + .join("plugins") + .join(&mod_id) } else { game_path.join(&name) }, diff --git a/src/app/GlobalProvider.tsx b/src/app/GlobalProvider.tsx index 190ba42..8ec529f 100644 --- a/src/app/GlobalProvider.tsx +++ b/src/app/GlobalProvider.tsx @@ -44,7 +44,14 @@ type GlobalCtxType = { viewingInfoFromDownloads: boolean version: string | null downloadVersions: ( - list: Array<{ id: string; type: 0 | 1 | 2 }> + list: Array<{ + id: string + type: 0 | 1 | 2 + modDownload?: number + gameId?: number + modId?: number + modVersion?: string + }> ) => Promise category: number setCategory: Dispatch> diff --git a/src/app/layout.tsx b/src/app/layout.tsx index b24be22..6d31e8d 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -366,7 +366,16 @@ export default function RootLayout ({ }, []) const downloadVersions = useCallback( - async (list: Array<{ id: string; type: 0 | 1 | 2 }>): Promise => { + async ( + list: Array<{ + id: string + type: 0 | 1 | 2 + modDownload?: number + gameId?: number + modId?: number + modVersion?: string + }> + ): Promise => { if (list.length === 0) return setSelectedVersionList([]) @@ -399,7 +408,11 @@ export default function RootLayout ({ null, null, null, - item.type + item.type, + item.modDownload ?? null, + item.gameId ?? null, + item.modId ?? null, + item.modVersion ?? null ) ) @@ -444,7 +457,9 @@ export default function RootLayout ({ (downloadInfo.type == 0 ? '?gameId=' + info.id + '&downloadId=' + info.download : '?downloadId=' + - (downloadInfo.type == 1 ? info.modSupportDownload : '')) + (downloadInfo.type == 1 + ? info.modSupportDownload + : downloadInfo.modDownload)) ) const signature = downloadInfoRequest.headers.get('x-signature') ?? '' const data = await downloadInfoRequest.json() @@ -487,25 +502,39 @@ export default function RootLayout ({ url: data.data.url, name: info.id, hash: data.data.hash, - downloadType: downloadInfo.type + downloadType: downloadInfo.type, + modId: String(downloadInfo.modId ?? '') }) if (res === '1') { setDownloadProgress(prev => prev.filter(d => d.version !== versionId)) - setDownloadedVersionsConfig(prev => { - if (!prev) return prev + if (downloadInfo.type != 1) { + setDownloadedVersionsConfig(prev => { + if (!prev) return prev - const updated = { - ...prev, - list: { - ...prev.list, - [versionId]: Date.now() - } - } + const updated = + downloadInfo.type == 2 + ? { + ...prev, + mods: { + ...prev.mods, + [downloadInfo.modGame! + '-' + downloadInfo.modId!]: { + [downloadInfo.modVersion!]: Date.now() + } + } + } + : { + ...prev, + list: { + ...prev.list, + [versionId]: Date.now() + } + } - writeVersionsConfig(updated) - return updated - }) + writeVersionsConfig(updated) + return updated + }) + } } else if (res == '0') { setDownloadProgress(prev => { const i = prev.findIndex(d => d.version === info.id) diff --git a/src/componets/popups/Downloads.tsx b/src/componets/popups/Downloads.tsx index c955b26..a6004bd 100644 --- a/src/componets/popups/Downloads.tsx +++ b/src/componets/popups/Downloads.tsx @@ -171,7 +171,11 @@ export default function DownloadsPopup () {

- {v.type == 1 ? 'Mod Manager for ' : null}{' '} + {v.type == 1 + ? 'Mod Manager for ' + : v.type == 2 + ? 'Mod for ' + : null}{' '} {getVersionInfo(v.version)?.displayName}

diff --git a/src/componets/popups/ModDownloads.tsx b/src/componets/popups/ModDownloads.tsx index 6d9982b..a0e4722 100644 --- a/src/componets/popups/ModDownloads.tsx +++ b/src/componets/popups/ModDownloads.tsx @@ -1,6 +1,7 @@ 'use client' import { useGlobal } from '@/app/GlobalProvider' +import { writeVersionsConfig } from '@/lib/BazookaManager' import { verifySignature } from '@/lib/Util' import { Mod } from '@/types/Mod' import { @@ -10,10 +11,12 @@ import { faDownload, faGlobe, faPeopleGroup, - faRefresh + faRefresh, + faTrash } from '@fortawesome/free-solid-svg-icons' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { message } from '@tauri-apps/plugin-dialog' +import { BaseDirectory, exists, remove } from '@tauri-apps/plugin-fs' import { arch, platform } from '@tauri-apps/plugin-os' import { useEffect, useState } from 'react' @@ -23,7 +26,10 @@ export default function ModDownloadsPopup () { managingVersion, downloadedVersionsConfig, showModInfo, - setShowModInfo + setShowModInfo, + downloadVersions, + downloadProgress, + setDownloadedVersionsConfig } = useGlobal() const [mods, setMods] = useState(0) @@ -106,16 +112,14 @@ export default function ModDownloadsPopup () { ) : !showModInfo ? (
{mods - .filter( - v => - !downloadedVersionsConfig || - (tab == 0 - ? Object.keys(downloadedVersionsConfig.mods).includes( - String(v.id) - ) - : !Object.keys(downloadedVersionsConfig.mods).includes( - String(v.id) - )) + .filter(v => + tab == 0 + ? Object.keys(downloadedVersionsConfig?.mods ?? []).includes( + String(versionInfo?.game + '-' + v.id) + ) + : !Object.keys(downloadedVersionsConfig?.mods ?? []).includes( + String(versionInfo?.game + '-' + v.id) + ) ) .map(v => { return ( @@ -181,17 +185,63 @@ export default function ModDownloadsPopup () {
{Object.keys(downloadedVersionsConfig?.mods ?? []).includes( - String(showModInfo.id) + String(versionInfo?.game + '-' + showModInfo.id) ) ? ( - ) : ( -