diff --git a/Untitled-2.js b/Untitled-2.js index 91b23ae..f1149dc 100644 --- a/Untitled-2.js +++ b/Untitled-2.js @@ -1,3 +1,15 @@ -import toml from 'smol-toml' -const t = `\nmodLoader = "javafml"\nloaderVersion = "[4,)"\n\nlicense = "Supplementaries Team License v.1.2"\nissueTrackerURL = "https://github.com/MehVahdJukaar/supplementaries/issues"\n\n[[mixins]]\n config = "supplementaries.mixins.json"\n[[mixins]]\n config = "supplementaries-common.mixins.json"\n\n[[mods]]\n modId = "supplementaries"\n version = "1.20-3.1.20"\n displayName = "Supplementaries"\n logoFile = "icon.png"\n authors = "MehVahdJukaar, Plantkillable"\n credits = "Put a book named 'credi…1.20.1,1.20.2)"\n ordering = "NONE"\n side = "CLIENT"\n\n[[dependencies.supplementaries]]\n modId = "moonlight"\n mandatory = true\n versionRange = "[1.20-2.13.65,]"\n ordering = "NONE"\n side = "BOTH"\n\n[[dependencies.supplementaries]]\n modId = "quark"\n mandatory = false\n versionRange = "[1.19-3.4-404,]"\n ordering = "AFTER"\n side = "BOTH"\n\n["lithium:options"]\n mixin.block.moving_block_shapes = false\n\n["canary:options"]\n mixin.block.moving_block_shapes = false\n\n` -console.log(toml.parse(t)) \ No newline at end of file +import got from 'got'; +const res = await got.post('https://api.modrinth.com/v2/version_files', { + headers: { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0', + }, + json: { + hashes: [ + "ea0f38408102e4d2efd53c2cc11b88b711996b48d8922f76ea6abf731219c5bd1efe39ddf9cce77c54d49a62ff10fb685c00d2e4c524ab99d20f6296677ab2c4", + "925a5c4899affa4098d997dfa4a4cb52c636d539e94bc489d1fa034218cb96819a70eb8b01647a39316a59fcfe223c1a8c05ed2e2ae5f4c1e75fa48f6af1c961" + ], + algorithm: 'sha512', + } +}).json() + +console.log(res) \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index 7f34837..81c7f9c 100644 --- a/src/main.ts +++ b/src/main.ts @@ -54,6 +54,7 @@ async function main(modpack_path: string) { yauzl.open(modpack_path, { lazyEntries: true }, (err, zipfile) => { zipfile.readEntry(); //首次读取 zipfile.on("entry", async (entry) => { + const name: string = entry.fileName; if (/\/$/.test(name)) { } else if (name.includes("overrides/")) { diff --git a/src/utils/DeEarth.ts b/src/utils/DeEarth.ts index f6cfc28..22184e5 100644 --- a/src/utils/DeEarth.ts +++ b/src/utils/DeEarth.ts @@ -7,6 +7,7 @@ import AdmZip from "adm-zip"; import got from "got"; import fs from "fs"; +import crypto from "crypto"; import toml from 'smol-toml' import path from 'path'; import pMap from "p-map"; @@ -34,107 +35,6 @@ export async function DeEarthMain(modspath: string, movepath: any) { } multibar.stop() } -/* -export async function DeEarth(modpath: string, movepath: string) { - try { - const zip = new AdmZip(modpath).getEntries(); - //for (let i = 0; i < zip.length; i++) { - //const e = zip[i] - try { //Modrinth - for (let i = 0; i < zip.length; i++) { - const e = zip[i] - if (isForge(e.entryName)) { //Forge,NeoForge - const modid = toml.parse(e.getData().toString('utf-8')).mods[0].modId - //const body = await got.get(`https://api.modrinth.com/v2/project/${modid}`, { headers: { "User-Agent": "DeEarth" } }).json() - const body = JSON.parse(await FastGot(`https://api.modrinth.com/v2/project/${modid}`)) - if (body.client_side == "required" && body.server_side !== "required") { - fs.renameSync(modpath, `${movepath}/${path.basename(modpath)}`) - } - } else if (e.entryName == "fabric.mod.json") { //Fabric - const modid = JSON.parse(e.getData().toString('utf-8')).id - //const body = await got.get(`https://api.modrinth.com/v2/project/${modid}`, { headers: { "User-Agent": "DeEarth" } }).json() - const body = JSON.parse(await FastGot(`https://api.modrinth.com/v2/project/${modid}`)) - if (body.client_side == "required" && body.server_side !== "required") { - fs.renameSync(modpath, `${movepath}/${path.basename(modpath)}`) - } - } - console.log("Modrinth") - } - } catch (error) { //mods.toml或fabric.mod.json判断 - for (let i = 0; i < zip.length; i++) { - try { - const e = zip[i] - if (isForge(e.entryName)) { //Forge,Neoforge - const modid = toml.parse(e.getData().toString('utf-8')).mods[0].modId - const body = JSON.parse(await FastGot(`https://dearth.0771010.xyz/api/modid?modid=${modid}`)) - if (body.isClient) { - fs.renameSync(modpath, `${movepath}/${path.basename(modpath)}`) - } - } else if (e.entryName == "fabric.mod.json") { //Fabric - const modid = JSON.parse(e.getData().toString('utf-8')).id - const body = JSON.parse(await FastGot(`https://dearth.0771010.xyz/api/modid?modid=${modid}`)) - if (body.isClient) { - fs.renameSync(modpath, `${movepath}/${path.basename(modpath)}`) - } - } - console.log("DeEarth") - } catch (errorr) { - for (let i = 0; i < zip.length; i++) { - const e = zip[i] - try { - if (isForge(e.entryName)) { //Forge,Neoforge - const tr = toml.parse(e.getData().toString('utf-8')) - const mcside = tr.dependencies[tr.mods[0].modId].find((mod: { modId: string; }) => mod.modId === "minecraft").side - if (mcside == "CLIENT") { //从Minecraft判断 - fs.renameSync(modpath, `${movepath}/${path.basename(modpath)}`) - } - const forgeside = tr.dependencies[tr.mods[0].modId].find((mod: { modId: string; }) => mod.modId === "forge").side - if (forgeside == "CLIENT") { //从Forge判断 - fs.renameSync(modpath, `${movepath}/${path.basename(modpath)}`) - } - const neoside = tr.dependencies[tr.mods[0].modId].find((mod: { modId: string; }) => mod.modId === "neoforge").side - if (neoside == "CLIENT") { //从NeoForge判断 - fs.renameSync(modpath, `${movepath}/${path.basename(modpath)}`) - } - } else if (e.entryName == "fabric.mod.json") { //Fabric - const fmj = JSON.parse(e.getData().toString('utf-8')).environment - if (fmj == "client") { - fs.renameSync(modpath, `${movepath}/${path.basename(modpath)}`) - } - } - } catch (erro) {//从Mixin判断 但是可能为不准确 - for (let i = 0; i < zip.length; i++) { - const e = zip[i] - try { - if (isMixinFile(e.entryName)) { - LOGGER.info(e.entryName) - const resx = JSON.parse(e.getData().toString('utf-8')) - if (e.entryName.includes("common.mixins.json")) { //第一步从common mixins文件判断,判断失败后再使用modid.mixins.json进行判断 - if (isMixin(resx)) { - fs.renameSync(modpath, `${movepath}/${path.basename(modpath)}`) - } - } else { - if (isMixin(resx)) { - fs.renameSync(modpath, `${movepath}/${path.basename(modpath)}`) - } - } - } - } catch (err: any) {//避免有傻逼JSON写注释(虽然GSON可以这样 但是这样一点也不人道) - if (err.errno !== -4058) { - LOGGER.error(`大天才JSON写注释了估计,模组路径:${modpath},过滤失败`) - } - } - } - } - } - } - } - } - } catch (error) { - LOGGER.error("DeEarth: " + error) - } -} -*/ export async function DeEarth(modpath: string, movepath: string) { let mrurl = "https://api.modrinth.com" @@ -142,6 +42,19 @@ export async function DeEarth(modpath: string, movepath: string) { mrurl = "https://mod.mcimirror.top/modrinth" } + let pid:string|undefined = undefined + try { + const data = fs.readFileSync(modpath) + const hash = crypto.createHash('sha1').update(data).digest('hex') + const pjson = await got.get(`${mrurl}/v2/version_file/${hash}?algorithm=sha1`,{ + headers:{ + "User-Agent": "DeEarth" + } + }).json<{project_id:string}>() + pid = pjson.project_id + //console.log("哈希命中成功,正在查询Modrinth") + }catch(e){} + const zipinfo = ZipInfo(modpath) let modid:string = "" if(zipinfo){ @@ -152,7 +65,12 @@ export async function DeEarth(modpath: string, movepath: string) { } try { //Modrinth - const body = JSON.parse(await FastGot(`${mrurl}/v2/project/${modid}`)) + let body:any + if (pid){ + body = JSON.parse(await FastGot(`${mrurl}/v2/project/${pid}`)) + }else{ + body = JSON.parse(await FastGot(`${mrurl}/v2/project/${modid}`)) + } if(body.client_side == "required" && body.server_side !== "required"){ fs.renameSync(modpath, `${movepath}/${path.basename(modpath)}`) }