Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
| window.dragDropModelInstallation = (eType, event) => { | |
| if (["dragenter", "dragover"].includes(eType)) { | |
| left.style.background = "#5b5b5b" | |
| left.style.color = "white" | |
| } | |
| if (["dragleave", "drop"].includes(eType)) { | |
| left.style.background = "rgba(0,0,0,0)" | |
| left.style.color = "white" | |
| } | |
| event.preventDefault() | |
| event.stopPropagation() | |
| const dataLines = [] | |
| if (eType=="drop") { | |
| const dataTransfer = event.dataTransfer | |
| const files = Array.from(dataTransfer.files) | |
| const modelGroups = {} // Group up all files by their base name (for if loose files are given) | |
| files.forEach(file => { | |
| const baseName = file.name.split(".")[0] | |
| if (!modelGroups[baseName]) { | |
| modelGroups[baseName] = [] | |
| } | |
| modelGroups[baseName].push(file.path) | |
| }) | |
| const modelGroupsComplete = [] | |
| const modelGroupsNotComplete = [] | |
| Object.keys(modelGroups).forEach(key => { | |
| if (modelGroups[key][0].split(".").at(-1)!="zip") { | |
| const fileExtensions = modelGroups[key].map(filePath => filePath.split(".").at(-1)) | |
| if (fileExtensions.includes("json") && fileExtensions.includes("pt")) { | |
| modelGroupsComplete.push(key) | |
| } else { | |
| modelGroupsNotComplete.push(key) | |
| } | |
| } else { | |
| modelGroupsComplete.push(key) | |
| } | |
| }) | |
| if (modelGroupsNotComplete.length) { | |
| return window.errorModal(window.i18n.MODEL_INSTALL_DRAGDROP_INCOMPLETE.replace("_1", modelGroupsNotComplete.join(", "))) | |
| } | |
| const modelsInstalledSuccessfully = [] | |
| const modelsFailedInstallation = [] | |
| let lastGameInstalledOkFor = undefined | |
| const handleZip = (files, key) => { | |
| return new Promise(resolve => { | |
| let installedOk = false | |
| let game = undefined | |
| try { | |
| if (fs.existsSync(`${window.path}/downloads`)) { | |
| fs.readdirSync(`${window.path}/downloads`).forEach(fileName => { | |
| fs.unlinkSync(`${window.path}/downloads/${fileName}`) | |
| }) | |
| } else { | |
| fs.mkdirSync(`${window.path}/downloads`) | |
| } | |
| window.unzipFileTo(files[0], `${window.path}/downloads`).then(() => { | |
| const allFiles = fs.readdirSync(`${window.path}/downloads`) | |
| const jsonFiles = allFiles.filter(fname => fname.endsWith(".json")) | |
| jsonFiles.forEach(jsonFile => { | |
| const jsonData = JSON.parse(fs.readFileSync(`${window.path}/downloads/${jsonFile}`)) | |
| game = jsonData.games[0].gameId | |
| const voiceId = jsonData.games[0].voiceId | |
| const modelsFolder = window.userSettings[`modelspath_${game}`] | |
| const allFilesForThisModel = allFiles.filter(fname => fname.includes(voiceId)) | |
| allFilesForThisModel.forEach(fname => { | |
| fs.copyFileSync(`${window.path}/downloads/${fname}`, `${modelsFolder}/${fname}`) | |
| }) | |
| installedOk = true | |
| }) | |
| resolve([game, key, installedOk]) | |
| }) | |
| } catch (e) { | |
| resolve([game, key, false]) | |
| } | |
| }) | |
| } | |
| const handleLoose = (files, key) => { | |
| let game = undefined | |
| return new Promise(resolve => { | |
| try { | |
| const jsonFile = files.find(fname => fname.endsWith(".json")) | |
| const parentFolder = jsonFile.replaceAll("\\", "/").split("/").reverse().slice(1, 100000).reverse().join("/") | |
| // const jsonData = JSON.parse(fs.readFileSync(`${parentFolder}/${jsonFile}`)) | |
| const jsonData = JSON.parse(fs.readFileSync(`${jsonFile}`)) | |
| const game = jsonData.games[0].gameId | |
| const voiceId = jsonData.games[0].voiceId | |
| const modelsFolder = window.userSettings[`modelspath_${game}`] | |
| const allFilesForThisModel = fs.readdirSync(parentFolder).filter(fname => fname.includes(voiceId)) | |
| allFilesForThisModel.forEach(fname => { | |
| fs.copyFileSync(`${parentFolder}/${fname}`, `${modelsFolder}/${fname}`) | |
| // fs.copyFileSync(`${fname}`, `${modelsFolder}/${fname}`) | |
| }) | |
| // lastGameInstalledOkFor = game | |
| // modelsInstalledSuccessfully.push(key) | |
| resolve([game, key, true]) | |
| } catch (e) { | |
| resolve([game, key, false]) | |
| } | |
| }) | |
| } | |
| const installPromises = [] | |
| modelGroupsComplete.forEach(key => { | |
| try { | |
| const files = modelGroups[key] | |
| if (files[0].endsWith(".zip")) { | |
| installPromises.push(handleZip(files, key)) | |
| } else { | |
| installPromises.push(handleLoose(files, key)) | |
| } | |
| } catch (e) { | |
| console.log(e) | |
| window.appLogger.log(e) | |
| modelsFailedInstallation.push(key) | |
| } | |
| }) | |
| Promise.all(installPromises).then(responses => { | |
| responses.forEach(([game, key, installedOk]) => { | |
| if (installedOk) { | |
| lastGameInstalledOkFor = game | |
| modelsInstalledSuccessfully.push(key) | |
| } else { | |
| modelsFailedInstallation.push(key) | |
| } | |
| }) | |
| let outputMessage = "" | |
| if (modelsInstalledSuccessfully.length) { | |
| outputMessage += window.i18n.MODEL_INSTALL_DRAGDROP_SUCCESS.replace("_1", modelsInstalledSuccessfully.length) | |
| } | |
| if (modelsFailedInstallation.length) { | |
| outputMessage += window.i18n.MODEL_INSTALL_DRAGDROP_FAILED.replace("_1", modelsFailedInstallation.length).replace("_2", modelsFailedInstallation.join(", ")) | |
| } | |
| window.infoModal(outputMessage) | |
| if (lastGameInstalledOkFor) { | |
| window.changeGame(window.gameAssets[lastGameInstalledOkFor]) | |
| } | |
| window.displayAllModels(true) | |
| window.loadAllModels(true).then(() => { | |
| changeGame(window.currentGame) | |
| }) | |
| }) | |
| } | |
| } | |
| left.addEventListener("dragenter", event => window.dragDropModelInstallation("dragenter", event), false) | |
| left.addEventListener("dragleave", event => window.dragDropModelInstallation("dragleave", event), false) | |
| left.addEventListener("dragover", event => window.dragDropModelInstallation("dragover", event), false) | |
| left.addEventListener("drop", event => window.dragDropModelInstallation("drop", event), false) |