feat:大部分功能完成

This commit is contained in:
Tianpao
2025-09-28 00:21:01 +08:00
parent b359fc881e
commit 5f16ee2bfa
22 changed files with 471 additions and 121 deletions

View File

@@ -1,72 +1,120 @@
import fs from "node:fs"
import pa from "node:path"
import { fastdownload, version_compare } from "../utils/utils.js";
import { yauzl_promise } from "../utils/yauzl.promise.js";
import { pipeline } from "node:stream/promises";
import got from "got";
import fsExtra from "fs-extra/esm";
interface ILInfo{
libraries:{
downloads:{
artifact:{
path:string
interface ILInfo {
libraries: {
downloads: {
artifact: {
path: string
}
}
}[]
}
export class Minecraft{
export class Minecraft {
loader: string;
minecraft: string;
loaderVersion: string;
constructor(loader:string,minecraft:string,lv:string){
path: string;
constructor(loader: string, minecraft: string, lv: string,path:string) {
this.path = path
this.loader = loader;
this.minecraft = minecraft;
this.loaderVersion = lv;
}
async setup(){
switch (this.loader){
case "forge":
await this.forge_setup();
break;
}
async setup() {
switch (this.loader) {
case "forge":
await this.forge_setup();
break;
case "neoforge":
await this.forge_setup();
break;
case "fabric":
await this.fabric_setup();
break;
case "fabric-loader":
await this.fabric_setup();
break;
}
await this.eula() //生成Eula.txt
}
async forge_setup(){
if(version_compare(this.minecraft,"1.18") === 1){
// 1.18.x + MC依赖解压
const mcpath = `./forge/libraries/net/minecraft/server/${this.minecraft}/server-${this.minecraft}.jar`
await fastdownload([`https://bmclapi2.bangbang93.com/version/${this.minecraft}/server`,mcpath])
const zip = await yauzl_promise(await fs.promises.readFile(mcpath))
for await(const entry of zip){
if(entry.fileName.startsWith("META-INF/libraries/")&&!entry.fileName.endsWith("/")){
console.log(entry.fileName)
const stream = await entry.openReadStream;
const write = fs.createWriteStream(`./forge/libraries/${entry.fileName.replace("META-INF/libraries/","")}`);
await pipeline(stream, write);
}
}
// 1.18.x + 依赖解压
}else{
//1.18.x - MC依赖下载
const lowv = `./forge/minecraft_server.${this.minecraft}.jar`
const dmc = fastdownload([`https://bmclapi2.bangbang93.com/version/${this.minecraft}/server`,lowv])
const download:Promise<void> = new Promise(async (resolve)=>{
console.log("并行")
const json = await got.get(`https://bmclapi2.bangbang93.com/version/${this.minecraft}/json`,{
headers:{
"User-Agent": "DeEarthX"
async forge_setup() {
if (version_compare(this.minecraft, "1.18") === 1) {
// 1.18.x + MC依赖解压
const mcpath = `${this.path}/libraries/net/minecraft/server/${this.minecraft}/server-${this.minecraft}.jar`
await fastdownload([`https://bmclapi2.bangbang93.com/version/${this.minecraft}/server`, mcpath])
const zip = await yauzl_promise(await fs.promises.readFile(mcpath))
for await (const entry of zip) {
if (entry.fileName.startsWith("META-INF/libraries/") && !entry.fileName.endsWith("/")) {
console.log(entry.fileName)
const stream = await entry.openReadStream;
const write = fs.createWriteStream(`${this.path}/libraries/${entry.fileName.replace("META-INF/libraries/", "")}`);
await pipeline(stream, write);
}
}
// 1.18.x + 依赖解压
} else {
//1.18.x - MC依赖下载
const lowv = `${this.path}/minecraft_server.${this.minecraft}.jar`
const dmc = fastdownload([`https://bmclapi2.bangbang93.com/version/${this.minecraft}/server`, lowv])
const download: Promise<void> = new Promise(async (resolve) => {
console.log("并行")
const json = await got.get(`https://bmclapi2.bangbang93.com/version/${this.minecraft}/json`, {
headers: {
"User-Agent": "DeEarthX"
}
})
.json<ILInfo>()
json.libraries.forEach(async e => {
const path = e.downloads.artifact.path
await fastdownload([`https://bmclapi2.bangbang93.com/maven/${path}`, `${this.path}/libraries/${path}`])
})
resolve()
})
.json<ILInfo>()
json.libraries.forEach(async e=>{
const path = e.downloads.artifact.path
await fastdownload([`https://bmclapi2.bangbang93.com/maven/${path}`,`./forge/libraries/${path}`])
})
resolve()
})
await Promise.all([dmc,download])
//1.18.x - 依赖下载
await Promise.all([dmc, download])
//1.18.x - 依赖下载
}
}
async fabric_setup() {
const mcpath = `${this.path}/server.jar`
await fastdownload([`https://bmclapi2.bangbang93.com/version/${this.minecraft}/server`, mcpath])
// 依赖解压
const zip = await yauzl_promise(await fs.promises.readFile(mcpath))
for await (const entry of zip) {
// if (entry.fileName.startsWith("META-INF/libraries/") && entry.fileName.endsWith("/") &&entry.fileName !== "META-INF/libraries/") {
// fs.promises.mkdir(`${this.path}/libraries/${entry.fileName.replace("META-INF/libraries/", "")}`,{
// recursive:true
// })
// }
if (entry.fileName.startsWith("META-INF/libraries/") && !entry.fileName.endsWith("/")) {
// const stream = await entry.openReadStream;
// fs.promises.mkdir(pa.dirname(`${this.path}/libraries/${entry.fileName.replace("META-INF/libraries/", "")}`),{
// recursive:true
// })
// const write = fs.createWriteStream(`${this.path}/libraries/${entry.fileName.replace("META-INF/libraries/", "")}`);
// await pipeline(stream, write);
const out = entry.ReadEntrySync
await fsExtra.outputFile(`${this.path}/libraries/${entry.fileName.replace("META-INF/libraries/", "")}`,out)
}
}
// 依赖解压
}
async eula(){
const context = `
#By changing the setting below to TRUE you are indicating your agreement to our EULA (https://aka.ms/MinecraftEULA).
#Spawn by DeEarthX(QQgroup:559349662) Tianpao:(https://space.bilibili.com/1728953419)
eula=true
`
await fs.promises.writeFile(`${this.path}/eula.txt`,context)
}
}