diff --git a/noname/game/promises.js b/noname/game/promises.js index 57c9e7e97..6659b8187 100644 --- a/noname/game/promises.js +++ b/noname/game/promises.js @@ -65,6 +65,10 @@ export class GamePromises { game.download(url, folder, resolve, reject, dev, onprogress); }); } + /** + * @param {string} filename + * @returns {Promise} + */ readFile(filename) { return new Promise((resolve, reject) => { // @ts-ignore diff --git a/noname/library/update.js b/noname/library/update.js index 511abdc08..ebc22697f 100644 --- a/noname/library/update.js +++ b/noname/library/update.js @@ -386,7 +386,9 @@ export async function request(url, onProgress, options = {}) { try { // @ts-ignore filename = response.headers.get("Content-Disposition").split(";")[1].split("=")[1]; - } catch { /* empty */ } + } catch { + /* empty */ + } let receivedBytes = 0; let chunks = []; @@ -527,20 +529,20 @@ export function createProgress(title, max, fileName, value) { * or rejects with an error if the operation fails. * @throws {Error} Will throw an error if the fetch operation fails or if no valid tags are found. */ -export async function getLatestVersionFromGitHub(owner = 'libccy', repo = 'noname') { - if (!localStorage.getItem('noname_authorization')) await gainAuthorization(); +export async function getLatestVersionFromGitHub(owner = "libccy", repo = "noname") { + if (!localStorage.getItem("noname_authorization")) await gainAuthorization(); const tags = await getRepoTags({ username: owner, - repository: repo + repository: repo, }); for (const tag of tags) { const tagName = tag.name; - if (tagName !== 'v1998') return tagName; + if (tagName !== "v1998") return tagName; } - throw new Error('No valid tags found in the repository'); + throw new Error("No valid tags found in the repository"); } /** @@ -559,14 +561,18 @@ export async function getLatestVersionFromGitHub(owner = 'libccy', repo = 'nonam * }[][]>} A promise that resolves with trees from the specified directories. * @throws {Error} Will throw an error if unable to fetch the repository tree from GitHub. */ -export async function getTreesFromGithub(directories, version, owner = 'libccy', repo = 'noname') { - if (!localStorage.getItem('noname_authorization')) await gainAuthorization(); +export async function getTreesFromGithub(directories, version, owner = "libccy", repo = "noname") { + if (!localStorage.getItem("noname_authorization")) await gainAuthorization(); - const treesResponse = await fetch(`https://api.github.com/repos/${owner}/${repo}/git/trees/${version}?recursive=1`, { - headers: defaultHeaders - }); + const treesResponse = await fetch( + `https://api.github.com/repos/${owner}/${repo}/git/trees/${version}?recursive=1`, + { + headers: defaultHeaders, + } + ); - if (!treesResponse.ok) throw new Error(`Failed to fetch the GitHub repository tree: HTTP status ${treesResponse.status}`); + if (!treesResponse.ok) + throw new Error(`Failed to fetch the GitHub repository tree: HTTP status ${treesResponse.status}`); /** * @type {{ * sha: string; @@ -584,5 +590,7 @@ export async function getTreesFromGithub(directories, version, owner = 'libccy', */ const trees = await treesResponse.json(); const tree = trees.tree; - return directories.map(directory => tree.filter(({ type, path }) => type === 'blob' && path.startsWith(directory))); + return directories.map((directory) => + tree.filter(({ type, path }) => type === "blob" && path.startsWith(directory)) + ); } diff --git a/noname/ui/create/menu/pages/otherMenu.js b/noname/ui/create/menu/pages/otherMenu.js index c601b417f..07e96dbd2 100644 --- a/noname/ui/create/menu/pages/otherMenu.js +++ b/noname/ui/create/menu/pages/otherMenu.js @@ -21,7 +21,7 @@ import { createProgress, gainAuthorization, getLatestVersionFromGitHub, - getTreesFromGithub + getTreesFromGithub, } from "../../../../library/update.js"; export const otherMenu = function (/** @type { boolean | undefined } */ connectMenu) { @@ -333,7 +333,7 @@ export const otherMenu = function (/** @type { boolean | undefined } */ connectM .then(() => { cp.exec( `start /b ${__dirname}\\noname-server.exe -platform=electron`, - () => { } + () => {} ); function loadURL() { let myAbortController = @@ -412,9 +412,9 @@ export const otherMenu = function (/** @type { boolean | undefined } */ connectM } const assetDirectories = []; - if (lib.config.asset_font) assetDirectories.push('font'); - if (lib.config.asset_audio) assetDirectories.push('audio'); - if (lib.config.asset_image) assetDirectories.push('image'); + if (lib.config.asset_font) assetDirectories.push("font"); + if (lib.config.asset_audio) assetDirectories.push("audio"); + if (lib.config.asset_image) assetDirectories.push("image"); const version = await getLatestVersionFromGitHub(); const files = await getTreesFromGithub(assetDirectories, version); @@ -459,57 +459,73 @@ export const otherMenu = function (/** @type { boolean | undefined } */ connectM * @type {progress} */ let unZipProgress; - request('api.unitedrhythmized.club/noname', (receivedBytes, total, filename) => { - if (typeof filename == 'string') { - progress.setFileName(filename); - } - let received = 0, max = 0; - if (total) { - max = +(total / (1024 * 1024)).toFixed(1) - } else { - max = 1000; - } - received = +(receivedBytes / (1024 * 1024)).toFixed(1); - if (received > max) max = received; - progress.setProgressMax(max); - progress.setProgressValue(received); - }, { - method: 'POST', - body: JSON.stringify({ - action: 'downloadAssets', - version, - fileList: result.concat('game/asset.js') - }) - }).then(async blob => { - progress.remove(); - const zip = await get.promises.zip(); - zip.load(await blob.arrayBuffer()); - const entries = Object.entries(zip.files); - let root; - const hiddenFileFlags = ['.', '_']; - unZipProgress = createProgress('正在解压' + progress.getFileName(), entries.length); - let i = 0; - for (const [key, value] of entries) { - unZipProgress.setProgressValue(i++); - const fileName = typeof root == 'string' && key.startsWith(root) ? key.replace(root, '') : key; - if (hiddenFileFlags.includes(fileName[0])) continue; - if (value.dir) { - await game.promises.createDir(fileName); - continue; + request( + "api.unitedrhythmized.club/noname", + (receivedBytes, total, filename) => { + if (typeof filename == "string") { + progress.setFileName(filename); } - unZipProgress.setFileName(fileName); - const [path, name] = [fileName.split('/').slice(0, -1).join('/'), fileName.split('/').slice(-1).join('/')]; - game.print(`${fileName}(${i}/${entries.length})`); - await game.promises.writeFile(value.asArrayBuffer(), path, name); + let received = 0, + max = 0; + if (total) { + max = +(total / (1024 * 1024)).toFixed(1); + } else { + max = 1000; + } + received = +(receivedBytes / (1024 * 1024)).toFixed(1); + if (received > max) max = received; + progress.setProgressMax(max); + progress.setProgressValue(received); + }, + { + method: "POST", + body: JSON.stringify({ + action: "downloadAssets", + version, + fileList: result.concat("game/asset.js"), + }), } - unZipProgress.remove(); - await finish(); - }).catch(e => { - if (progress.parentNode) progress.remove(); - if (unZipProgress && unZipProgress.parentNode) unZipProgress.remove(); - refresh(); - throw e; - }); + ) + .then(async (blob) => { + progress.remove(); + const zip = await get.promises.zip(); + zip.load(await blob.arrayBuffer()); + const entries = Object.entries(zip.files); + let root; + const hiddenFileFlags = [".", "_"]; + unZipProgress = createProgress( + "正在解压" + progress.getFileName(), + entries.length + ); + let i = 0; + for (const [key, value] of entries) { + unZipProgress.setProgressValue(i++); + const fileName = + typeof root == "string" && key.startsWith(root) + ? key.replace(root, "") + : key; + if (hiddenFileFlags.includes(fileName[0])) continue; + if (value.dir) { + await game.promises.createDir(fileName); + continue; + } + unZipProgress.setFileName(fileName); + const [path, name] = [ + fileName.split("/").slice(0, -1).join("/"), + fileName.split("/").slice(-1).join("/"), + ]; + game.print(`${fileName}(${i}/${entries.length})`); + await game.promises.writeFile(value.asArrayBuffer(), path, name); + } + unZipProgress.remove(); + await finish(); + }) + .catch((e) => { + if (progress.parentNode) progress.remove(); + if (unZipProgress && unZipProgress.parentNode) unZipProgress.remove(); + refresh(); + throw e; + }); } else { await finish(); } @@ -1646,4 +1662,3 @@ export const otherMenu = function (/** @type { boolean | undefined } */ connectM if (!active.link) active._initLink(); rightPane.appendChild(active.link); }; -