pages235/src/downloadAndOpenFile.ts
2023-10-16 20:22:02 +03:00

76 lines
2.7 KiB
TypeScript

import prettyBytes from 'pretty-bytes'
import { openWorldZip } from './browserfs'
import { getResourcePackName, installTexturePack, resourcePackState, updateTexturePackInstalledState } from './texturePack'
import { setLoadingScreenStatus } from './utils'
const getFixedFilesize = (bytes: number) => {
return prettyBytes(bytes, { minimumFractionDigits: 2, maximumFractionDigits: 2 })
}
export default async () => {
const qs = new URLSearchParams(window.location.search)
let mapUrl = qs.get('map')
const texturepack = qs.get('texturepack')
// fixme
if (texturepack) mapUrl = texturepack
if (!mapUrl) return false
if (texturepack) {
await updateTexturePackInstalledState()
if (resourcePackState.resourcePackInstalled) {
if (!confirm(`You are going to install a new texturepack which would REPLACE a current one: ${await getResourcePackName()} Continue?`)) return
}
} else {
const menu = document.getElementById('play-screen')
menu.style = 'display: none;'
}
const name = mapUrl.slice(mapUrl.lastIndexOf('/') + 1).slice(-25)
const downloadThing = texturepack ? 'texturepack' : 'world'
setLoadingScreenStatus(`Downloading ${downloadThing} ${name}...`)
const response = await fetch(mapUrl)
const contentType = response.headers.get('Content-Type')
if (!contentType || !contentType.startsWith('application/zip')) {
alert('Invalid map file')
}
const contentLength = +response.headers.get('Content-Length')
setLoadingScreenStatus(`Downloading ${downloadThing} ${name}: have to download ${getFixedFilesize(contentLength)}...`)
let downloadedBytes = 0
const buffer = await new Response(
new ReadableStream({
async start (controller) {
const reader = response.body.getReader()
// eslint-disable-next-line no-constant-condition
while (true) {
const { done, value } = await reader.read()
if (done) {
controller.close()
break
}
downloadedBytes += value.byteLength
// Calculate download progress as a percentage
const progress = (downloadedBytes / contentLength) * 100
// Update your progress bar or display the progress value as needed
if (contentLength) {
setLoadingScreenStatus(`Download ${downloadThing} progress: ${Math.floor(progress)}% (${getFixedFilesize(downloadedBytes)} / ${getFixedFilesize(contentLength)})`, false, true)
}
// Pass the received data to the controller
controller.enqueue(value)
}
},
})
).arrayBuffer()
if (texturepack) {
const name = mapUrl.slice(mapUrl.lastIndexOf('/') + 1).slice(-30)
await installTexturePack(buffer, name)
} else {
await openWorldZip(buffer)
}
}