feat:最终成品

This commit is contained in:
Tianpao
2025-07-03 12:29:09 +08:00
parent fa83d5095f
commit ba8c21cd6c
9 changed files with 61 additions and 41 deletions

BIN
Dex.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

@@ -9,8 +9,8 @@
"scripts": {
"tsbuild": "tsc",
"rollup": "rollup -c rollup.config.js",
"nexe": "nexe -i ./ndist/main.js --ico Dex.ico --build -t x86-22.13.0 --output ./ndist/main.exe",
"upx": ".\\.dist_modules\\upx.exe .\\ndist\\main.exe",
"nexe": "nexe -i ./ndist/bundle.js --ico Dex.ico --build -t x86-22.13.0 --output ./ndist/DeEarthX.exe",
"upx": ".\\dist_modules\\upx.exe .\\ndist\\DeEarthX.exe",
"build": "npm run tsbuild&&npm run rollup&&npm run nexe&&npm run upx",
"test": "tsc&&node dist/main.js"
},

View File

@@ -16,9 +16,9 @@ interface Answers {
}
let unzip_path:string = ""
if(isDevelopment){
unzip_path = join("./","instance")
unzip_path = join("./","instance/")
}else{
unzip_path = join(getCurrnetDir(),"instance")
unzip_path = join(getCurrnetDir().replace("ndist",""),"instance")
}
let zipnamew: string = ""
const argv = process.argv.slice(2)[0];
@@ -60,6 +60,7 @@ async function main(modpack_path: string) {
zipfile.openReadStream(entry,(err,stream)=>{ //读取overrides文件夹下的所有文件和文件夹
const dir = dirname(zipfilex)
fse.ensureDirSync(dir);
console.log(zipfilex)
stream.pipe(fse.createWriteStream(zipfilex))
})
//console.log(entry.fileName)
@@ -67,7 +68,7 @@ async function main(modpack_path: string) {
} else {
const name: string = entry.fileName;
dud_files.push(name);
if (name && name.endsWith(".json")) {
if (name.endsWith(".json")) {
pack_info = JSON.parse(
(await readzipentry(zipfile, entry)).toString()
);
@@ -81,8 +82,8 @@ async function main(modpack_path: string) {
const plat = platform(what_platform(dud_files))
const info = await plat.getinfo(pack_info);
await plat.downloadfile(pack_info,dirx)
await install(info.loader,info.minecraft,info.loader_version,dirx)
await DeEarthMain(join(dirx,"mods"),join(unzip_path,"rubbish"))
await install(info.loader,info.minecraft,info.loader_version,dirx)
LOGGER.info("DeEarthX已将服务端制作完成");
zipfile.close();
});

View File

@@ -27,7 +27,6 @@ export default async function install(
.get(`version/${minecraftversion}/json`)
.json()) as mcinfoX; //获取Minecraft版本JSON
const forgepath = path;
console.log(loaderversion)
const forgedata = (
await gotx.get(
`forge/download?mcversion=${minecraftversion}&version=${loaderversion}&category=installer&format=jar`

View File

@@ -1,8 +1,15 @@
import got from "got";
import { join } from "node:path";
import { fastdownload, usemirror } from "../utils/utils.js";
import { modpack_info, XPlatform } from "./index.js";
const cf_url = (()=>{if(usemirror){return "https://mod.mcimirror.top/curseforge"}else{return "https://api.curseforge.com"}})()
const cf_url = (() => {
if (usemirror) {
return "https://mod.mcimirror.top/curseforge";
} else {
return "https://api.curseforge.com";
}
})();
export interface CurseForgeManifest {
minecraft: {
version: string;
@@ -18,38 +25,48 @@ export class CurseForge implements XPlatform {
if (result && local_manifest)
result.minecraft = local_manifest.minecraft.version;
const id = local_manifest.minecraft.modLoaders[0].id;
const loader_all = id.match(
/(.*)-/
) as RegExpMatchArray;
const loader_all = id.match(/(.*)-/) as RegExpMatchArray;
result.loader = loader_all[1];
result.loader_version = id.replace(loader_all[0],"");
result.loader_version = id.replace(loader_all[0], "");
return result;
}
async downloadfile(manifest: object,path:string): Promise<void> {
async downloadfile(manifest: object, path: string): Promise<void> {
const local_manifest = manifest as CurseForgeManifest;
const FileID = JSON.stringify({
fileIds: local_manifest.files.map((file: { fileID: number; }) => file.fileID),
fileIds: local_manifest.files.map(
(file: { fileID: number }) => file.fileID
),
});
let tmp: [string, string] | string[][] = [];
await got.post(cf_url+"/v1/mods/files",{
await got
.post(cf_url + "/v1/mods/files", {
body: FileID,
headers: {
"Content-Type": "application/json",
"x-api-key":"$2a$10$ydk0TLDG/Gc6uPMdz7mad.iisj2TaMDytVcIW4gcVP231VKngLBKy"
}
}).json().then((res:any)=>{
res.data.forEach((e: { fileName: string; downloadUrl: null|string; }) => {
if (e.fileName.endsWith(".zip")||e.downloadUrl == null) {
"x-api-key":
"$2a$10$ydk0TLDG/Gc6uPMdz7mad.iisj2TaMDytVcIW4gcVP231VKngLBKy",
},
})
.json()
.then((res: any) => {
res.data.forEach(
(e: { fileName: string; downloadUrl: null | string }) => {
if (e.fileName.endsWith(".zip") || e.downloadUrl == null) {
return;
}
if (usemirror){
tmp.push(["https://mod.mcimirror.top"+new URL(e.downloadUrl).pathname,path+"/mods/" + e.fileName])
}else{
tmp.push([e.downloadUrl,path+"/mods/" + e.fileName])
const unpath = join(path + "/mods/", e.fileName);
if (usemirror) {
tmp.push([
"https://mod.mcimirror.top" + new URL(e.downloadUrl).pathname,
unpath,
]);
} else {
tmp.push([e.downloadUrl, unpath]);
}
}
);
});
})
await fastdownload(tmp as unknown as [string, string]) //下载文件
await fastdownload(tmp as unknown as [string, string]); //下载文件
}
}

View File

@@ -21,8 +21,10 @@ export function platform(plat: string | undefined): XPlatform {
break;
case "modrinth":
platform = new Modrinth();
break;
case "mcbbs":
platform = new MCBBS();
break;
}
return platform;
}

View File

@@ -9,11 +9,10 @@ export class MCBBS implements XPlatform {
const local_manifest = manifest as MCBBSManifest;
if (result && local_manifest)
result.minecraft = local_manifest.minecraft.version;
const loader_all = local_manifest.minecraft.modLoaders[0].id.match(
/(.*)-/
) as RegExpMatchArray;
const id = local_manifest.minecraft.modLoaders[0].id;
const loader_all = id.match(/(.*)-/) as RegExpMatchArray;
result.loader = loader_all[1];
result.loader_version = loader_all[0];
result.loader_version = id.replace(loader_all[0], "");
return result;
}

View File

@@ -1,6 +1,7 @@
import fs from "node:fs";
import { mr_fastdownload, usemirror } from "../utils/utils.js";
import { modpack_info, XPlatform } from "./index.js";
import { join } from "node:path";
interface ModrinthManifest {
files: Array<{ path: string; downloads: string[]; fileSize: number; }>;
@@ -36,10 +37,11 @@ export class Modrinth implements XPlatform {
if (e.path.endsWith(".zip")) {
return;
}
const unpath = join(path,e.path)
if (usemirror){
tmp.push(["https://mod.mcimirror.top"+new URL(e.downloads[0]).pathname,path+e.path,String(e.fileSize)])
tmp.push(["https://mod.mcimirror.top"+new URL(e.downloads[0]).pathname,unpath,String(e.fileSize)])
}else{
tmp.push([e.downloads[0],path + e.path,String(e.fileSize)])
tmp.push([e.downloads[0],unpath,String(e.fileSize)])
}
});
await mr_fastdownload(tmp as unknown as [string, string, string])

View File

@@ -29,7 +29,7 @@ export async function fastdownload(data:[string,string]){
})
const totalBar = multibar.create(data.length, 0, {filename: '总文件数'})
return await pMap(data,async(e)=>{
const size:number = await (async()=>{const head = (await got.head(e[0])).headers['content-length'];if(head){return Number(head)}else{return 0}})()
const size:number = await (async()=>{const head = (await got.head(e[0].replace("https://mod.mcimirror.top","https://edge.forgecdn.net"))).headers['content-length'];if(head){return Number(head)}else{return 0}})()
const bar = multibar.create(size, 0, {filename: e[1]})
try{
await pRetry(async()=>{
@@ -124,7 +124,7 @@ export async function xfastdownload(
}
export const usemirror = (()=>{
env.config()
env.config({debug:false})
const mirror = process.env.MIRROR
if(mirror){
return false