From 552d612e7c11299ea4513a759a47722adf96b717 Mon Sep 17 00:00:00 2001 From: SpikeHD Date: Sun, 24 Jul 2022 20:03:16 -0700 Subject: [PATCH] write modinfo.json after installing mod --- src-tauri/src/unzip.rs | 32 ++++++++++++++++++++++--- src/ui/Mods.tsx | 12 ++++++++-- src/ui/components/menu/Downloads.tsx | 35 +++++++++++++++------------- src/ui/components/menu/Game.tsx | 9 ++++--- src/ui/components/mods/ModList.tsx | 4 ++++ src/utils/zipUtils.ts | 28 ++++++++++++++-------- 6 files changed, 84 insertions(+), 36 deletions(-) diff --git a/src-tauri/src/unzip.rs b/src-tauri/src/unzip.rs index b46444a..cfa1810 100644 --- a/src-tauri/src/unzip.rs +++ b/src-tauri/src/unzip.rs @@ -1,4 +1,4 @@ -use std::fs::File; +use std::fs::{read_dir, File}; use std::path; use std::thread; @@ -15,9 +15,19 @@ pub fn unzip(window: tauri::Window, zipfile: String, destpath: String, top_level let write_path = path::PathBuf::from(&destpath); + // Get a list of all current directories + let mut dirs = vec![]; + for entry in read_dir(&write_path).unwrap() { + let entry = entry.unwrap(); + let entry_path = entry.path(); + if entry_path.is_dir() { + dirs.push(entry_path); + } + } + // Run extraction in seperate thread thread::spawn(move || { - let full_path = write_path; + let full_path = &write_path; window.emit("extract_start", &zipfile).unwrap(); @@ -62,6 +72,22 @@ pub fn unzip(window: tauri::Window, zipfile: String, destpath: String, top_level } }; - window.emit("extract_end", &zipfile).unwrap(); + // Get any new directory that could have been created + let mut new_dir: String = String::new(); + for entry in read_dir(&write_path).unwrap() { + let entry = entry.unwrap(); + let entry_path = entry.path(); + if entry_path.is_dir() { + if !dirs.contains(&entry_path) { + new_dir = entry_path.to_str().unwrap().to_string(); + } + } + } + + let mut res_hash = std::collections::HashMap::new(); + res_hash.insert("file", zipfile.to_string()); + res_hash.insert("new_folder", new_dir.to_string()); + + window.emit("extract_end", &res_hash).unwrap(); }); } diff --git a/src/ui/Mods.tsx b/src/ui/Mods.tsx index d34d0b1..5397cac 100644 --- a/src/ui/Mods.tsx +++ b/src/ui/Mods.tsx @@ -1,3 +1,4 @@ +import { invoke } from '@tauri-apps/api' import React from 'react' import DownloadHandler from '../utils/download' import { getModDownload, ModData } from '../utils/gamebanana' @@ -69,8 +70,15 @@ export class Mods extends React.Component { this.props.downloadHandler.addDownload(firstLink, modPath, async () => { console.log('Unzipping:', mod.name) - unzip(modPath, modFolder, false, () => { - console.log('DONE MOD DOWNLOAD') + const unzipRes = await unzip(modPath, modFolder, false) + + console.log(`${unzipRes.new_folder}/modinfo.json`) + console.log(unzipRes) + + // Write a modinfo.json file + invoke('write_file', { + path: `${unzipRes.new_folder}/modinfo.json`, + contents: JSON.stringify(mod), }) }) } diff --git a/src/ui/components/menu/Downloads.tsx b/src/ui/components/menu/Downloads.tsx index be14405..d0ed2d1 100644 --- a/src/ui/components/menu/Downloads.tsx +++ b/src/ui/components/menu/Downloads.tsx @@ -111,8 +111,9 @@ export default class Downloads extends React.Component { async downloadGrasscutterStableRepo() { const folder = await this.getGrasscutterFolder() - this.props.downloadManager.addDownload(STABLE_REPO_DOWNLOAD, folder + '\\grasscutter_repo.zip', () => { - unzip(folder + '\\grasscutter_repo.zip', folder + '\\', true, this.toggleButtons) + this.props.downloadManager.addDownload(STABLE_REPO_DOWNLOAD, folder + '\\grasscutter_repo.zip', async () => { + await unzip(folder + '\\grasscutter_repo.zip', folder + '\\', true) + this.toggleButtons() }) this.toggleButtons() @@ -120,8 +121,9 @@ export default class Downloads extends React.Component { async downloadGrasscutterDevRepo() { const folder = await this.getGrasscutterFolder() - this.props.downloadManager.addDownload(DEV_REPO_DOWNLOAD, folder + '\\grasscutter_repo.zip', () => { - unzip(folder + '\\grasscutter_repo.zip', folder + '\\', true, this.toggleButtons) + this.props.downloadManager.addDownload(DEV_REPO_DOWNLOAD, folder + '\\grasscutter_repo.zip', async () => { + await unzip(folder + '\\grasscutter_repo.zip', folder + '\\', true) + this.toggleButtons() }) this.toggleButtons() @@ -129,8 +131,9 @@ export default class Downloads extends React.Component { async downloadGrasscutterStable() { const folder = await this.getGrasscutterFolder() - this.props.downloadManager.addDownload(STABLE_DOWNLOAD, folder + '\\grasscutter.zip', () => { - unzip(folder + '\\grasscutter.zip', folder + '\\', true, this.toggleButtons) + this.props.downloadManager.addDownload(STABLE_DOWNLOAD, folder + '\\grasscutter.zip', async () => { + await unzip(folder + '\\grasscutter.zip', folder + '\\', true) + this.toggleButtons }) // Also add repo download @@ -141,8 +144,9 @@ export default class Downloads extends React.Component { async downloadGrasscutterLatest() { const folder = await this.getGrasscutterFolder() - this.props.downloadManager.addDownload(DEV_DOWNLOAD, folder + '\\grasscutter.zip', () => { - unzip(folder + '\\grasscutter.zip', folder + '\\', true, this.toggleButtons) + this.props.downloadManager.addDownload(DEV_DOWNLOAD, folder + '\\grasscutter.zip', async () => { + await unzip(folder + '\\grasscutter.zip', folder + '\\', true) + this.toggleButtons() }) // Also add repo download @@ -165,15 +169,14 @@ export default class Downloads extends React.Component { }) } - await unzip(folder + '\\resources.zip', folder + '\\', true, () => { - // Rename folder to resources - invoke('rename', { - path: folder + '\\Resources', - newName: 'resources', - }) - - this.toggleButtons() + await unzip(folder + '\\resources.zip', folder + '\\', true) + // Rename folder to resources + invoke('rename', { + path: folder + '\\Resources', + newName: 'resources', }) + + this.toggleButtons() }) this.toggleButtons() diff --git a/src/ui/components/menu/Game.tsx b/src/ui/components/menu/Game.tsx index 4f1ed2f..403239e 100644 --- a/src/ui/components/menu/Game.tsx +++ b/src/ui/components/menu/Game.tsx @@ -45,11 +45,10 @@ export default class Downloads extends React.Component { async downloadGame() { const folder = this.state.gameDownloadFolder - this.props.downloadManager.addDownload(GAME_DOWNLOAD, folder + '\\game.zip', () => { - unzip(folder + '\\game.zip', folder + '\\', true, () => { - this.setState({ - gameDownloading: false, - }) + this.props.downloadManager.addDownload(GAME_DOWNLOAD, folder + '\\game.zip', async () => { + await unzip(folder + '\\game.zip', folder + '\\', true) + this.setState({ + gameDownloading: false, }) }) diff --git a/src/ui/components/mods/ModList.tsx b/src/ui/components/mods/ModList.tsx index 497f702..118dee0 100644 --- a/src/ui/components/mods/ModList.tsx +++ b/src/ui/components/mods/ModList.tsx @@ -49,6 +49,10 @@ export class ModList extends React.Component { return mod } + const newInfo = mod.info as PartialModData + + console.log(newInfo) + return mod }) diff --git a/src/utils/zipUtils.ts b/src/utils/zipUtils.ts index fa09373..ffd9d59 100644 --- a/src/utils/zipUtils.ts +++ b/src/utils/zipUtils.ts @@ -1,16 +1,24 @@ import { invoke } from '@tauri-apps/api' import { listen } from '@tauri-apps/api/event' -export function unzip(file: string, dest: string, topLevelStrip?: boolean, onFinish?: () => void) { - invoke('unzip', { - zipfile: file, - destpath: dest, - topLevelStrip, - }) +interface UnzipPayload { + file: string + new_folder: string +} - listen('extract_end', ({ payload }) => { - if (payload === file && onFinish) { - onFinish() - } +export function unzip(file: string, dest: string, topLevelStrip?: boolean): Promise { + return new Promise((resolve) => { + invoke('unzip', { + zipfile: file, + destpath: dest, + topLevelStrip, + }) + + listen('extract_end', ({ payload }) => { + // @ts-expect-error Payload is an object + if (payload?.file === file) { + resolve(payload as UnzipPayload) + } + }) }) }