76 lines
2.7 KiB
TypeScript
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)
|
|
}
|
|
}
|