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) |