write modinfo.json after installing mod

This commit is contained in:
SpikeHD
2022-07-24 20:03:16 -07:00
parent 5077c19fdc
commit 552d612e7c
6 changed files with 84 additions and 36 deletions

View File

@@ -1,4 +1,4 @@
use std::fs::File; use std::fs::{read_dir, File};
use std::path; use std::path;
use std::thread; 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); 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 // Run extraction in seperate thread
thread::spawn(move || { thread::spawn(move || {
let full_path = write_path; let full_path = &write_path;
window.emit("extract_start", &zipfile).unwrap(); 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();
}); });
} }

View File

@@ -1,3 +1,4 @@
import { invoke } from '@tauri-apps/api'
import React from 'react' import React from 'react'
import DownloadHandler from '../utils/download' import DownloadHandler from '../utils/download'
import { getModDownload, ModData } from '../utils/gamebanana' import { getModDownload, ModData } from '../utils/gamebanana'
@@ -69,8 +70,15 @@ export class Mods extends React.Component<IProps, IState> {
this.props.downloadHandler.addDownload(firstLink, modPath, async () => { this.props.downloadHandler.addDownload(firstLink, modPath, async () => {
console.log('Unzipping:', mod.name) console.log('Unzipping:', mod.name)
unzip(modPath, modFolder, false, () => { const unzipRes = await unzip(modPath, modFolder, false)
console.log('DONE MOD DOWNLOAD')
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),
}) })
}) })
} }

View File

@@ -111,8 +111,9 @@ export default class Downloads extends React.Component<IProps, IState> {
async downloadGrasscutterStableRepo() { async downloadGrasscutterStableRepo() {
const folder = await this.getGrasscutterFolder() const folder = await this.getGrasscutterFolder()
this.props.downloadManager.addDownload(STABLE_REPO_DOWNLOAD, folder + '\\grasscutter_repo.zip', () => { this.props.downloadManager.addDownload(STABLE_REPO_DOWNLOAD, folder + '\\grasscutter_repo.zip', async () => {
unzip(folder + '\\grasscutter_repo.zip', folder + '\\', true, this.toggleButtons) await unzip(folder + '\\grasscutter_repo.zip', folder + '\\', true)
this.toggleButtons()
}) })
this.toggleButtons() this.toggleButtons()
@@ -120,8 +121,9 @@ export default class Downloads extends React.Component<IProps, IState> {
async downloadGrasscutterDevRepo() { async downloadGrasscutterDevRepo() {
const folder = await this.getGrasscutterFolder() const folder = await this.getGrasscutterFolder()
this.props.downloadManager.addDownload(DEV_REPO_DOWNLOAD, folder + '\\grasscutter_repo.zip', () => { this.props.downloadManager.addDownload(DEV_REPO_DOWNLOAD, folder + '\\grasscutter_repo.zip', async () => {
unzip(folder + '\\grasscutter_repo.zip', folder + '\\', true, this.toggleButtons) await unzip(folder + '\\grasscutter_repo.zip', folder + '\\', true)
this.toggleButtons()
}) })
this.toggleButtons() this.toggleButtons()
@@ -129,8 +131,9 @@ export default class Downloads extends React.Component<IProps, IState> {
async downloadGrasscutterStable() { async downloadGrasscutterStable() {
const folder = await this.getGrasscutterFolder() const folder = await this.getGrasscutterFolder()
this.props.downloadManager.addDownload(STABLE_DOWNLOAD, folder + '\\grasscutter.zip', () => { this.props.downloadManager.addDownload(STABLE_DOWNLOAD, folder + '\\grasscutter.zip', async () => {
unzip(folder + '\\grasscutter.zip', folder + '\\', true, this.toggleButtons) await unzip(folder + '\\grasscutter.zip', folder + '\\', true)
this.toggleButtons
}) })
// Also add repo download // Also add repo download
@@ -141,8 +144,9 @@ export default class Downloads extends React.Component<IProps, IState> {
async downloadGrasscutterLatest() { async downloadGrasscutterLatest() {
const folder = await this.getGrasscutterFolder() const folder = await this.getGrasscutterFolder()
this.props.downloadManager.addDownload(DEV_DOWNLOAD, folder + '\\grasscutter.zip', () => { this.props.downloadManager.addDownload(DEV_DOWNLOAD, folder + '\\grasscutter.zip', async () => {
unzip(folder + '\\grasscutter.zip', folder + '\\', true, this.toggleButtons) await unzip(folder + '\\grasscutter.zip', folder + '\\', true)
this.toggleButtons()
}) })
// Also add repo download // Also add repo download
@@ -165,7 +169,7 @@ export default class Downloads extends React.Component<IProps, IState> {
}) })
} }
await unzip(folder + '\\resources.zip', folder + '\\', true, () => { await unzip(folder + '\\resources.zip', folder + '\\', true)
// Rename folder to resources // Rename folder to resources
invoke('rename', { invoke('rename', {
path: folder + '\\Resources', path: folder + '\\Resources',
@@ -174,7 +178,6 @@ export default class Downloads extends React.Component<IProps, IState> {
this.toggleButtons() this.toggleButtons()
}) })
})
this.toggleButtons() this.toggleButtons()
} }

View File

@@ -45,13 +45,12 @@ export default class Downloads extends React.Component<IProps, IState> {
async downloadGame() { async downloadGame() {
const folder = this.state.gameDownloadFolder const folder = this.state.gameDownloadFolder
this.props.downloadManager.addDownload(GAME_DOWNLOAD, folder + '\\game.zip', () => { this.props.downloadManager.addDownload(GAME_DOWNLOAD, folder + '\\game.zip', async () => {
unzip(folder + '\\game.zip', folder + '\\', true, () => { await unzip(folder + '\\game.zip', folder + '\\', true)
this.setState({ this.setState({
gameDownloading: false, gameDownloading: false,
}) })
}) })
})
this.setState({ this.setState({
gameDownloading: true, gameDownloading: true,

View File

@@ -49,6 +49,10 @@ export class ModList extends React.Component<IProps, IState> {
return mod return mod
} }
const newInfo = mod.info as PartialModData
console.log(newInfo)
return mod return mod
}) })

View File

@@ -1,7 +1,13 @@
import { invoke } from '@tauri-apps/api' import { invoke } from '@tauri-apps/api'
import { listen } from '@tauri-apps/api/event' import { listen } from '@tauri-apps/api/event'
export function unzip(file: string, dest: string, topLevelStrip?: boolean, onFinish?: () => void) { interface UnzipPayload {
file: string
new_folder: string
}
export function unzip(file: string, dest: string, topLevelStrip?: boolean): Promise<UnzipPayload> {
return new Promise((resolve) => {
invoke('unzip', { invoke('unzip', {
zipfile: file, zipfile: file,
destpath: dest, destpath: dest,
@@ -9,8 +15,10 @@ export function unzip(file: string, dest: string, topLevelStrip?: boolean, onFin
}) })
listen('extract_end', ({ payload }) => { listen('extract_end', ({ payload }) => {
if (payload === file && onFinish) { // @ts-expect-error Payload is an object
onFinish() if (payload?.file === file) {
resolve(payload as UnzipPayload)
} }
}) })
})
} }