feat:修复TOML 重构DeEarth(未)
This commit is contained in:
@@ -7,15 +7,15 @@
|
||||
import AdmZip from "adm-zip";
|
||||
import got from "got";
|
||||
import fs from "fs";
|
||||
import toml from 'toml';
|
||||
import toml from 'smol-toml'
|
||||
import path from 'path';
|
||||
import pMap from "p-map";
|
||||
import { LOGGER } from "./logger.js";
|
||||
import { MultiBar } from "cli-progress";
|
||||
|
||||
export async function DeEarthMain(modspath: string, movepath: any) {
|
||||
if(!fs.existsSync(movepath)){
|
||||
fs.mkdirSync(movepath)
|
||||
if (!fs.existsSync(movepath)) {
|
||||
fs.mkdirSync(movepath)
|
||||
}
|
||||
LOGGER.info(`DeEarth V1.0.0`)
|
||||
LOGGER.info(`如有无法筛选的mods,请前往 https://dearth.0771010.xyz/ 提交未成功筛选的模组的modid`)
|
||||
@@ -33,103 +33,185 @@ fs.mkdirSync(movepath)
|
||||
}
|
||||
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)}`)
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (error) { //mods.toml或fabric.mod.json判断
|
||||
try{//DeEarthPublic
|
||||
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
|
||||
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) {
|
||||
//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 = JSON.parse(await FastGot(`https://dearth.0771010.xyz/api/modid?modid=${modid}`))
|
||||
if (body.isClient) {
|
||||
//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(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++) {
|
||||
} catch (error) { //mods.toml或fabric.mod.json判断
|
||||
for (let i = 0; i < zip.length; i++) {
|
||||
try {
|
||||
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)) {
|
||||
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)}`)
|
||||
}
|
||||
} else {
|
||||
if (isMixin(resx)) {
|
||||
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 (err:any) {//避免有傻逼JSON写注释(虽然GSON可以这样 但是这样一点也不人道)
|
||||
if (err.errno !== -4058) {
|
||||
LOGGER.error(`大天才JSON写注释了估计,模组路径:${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) {
|
||||
const zipinfo = ZipInfo(modpath)
|
||||
let modid:string = ""
|
||||
if(zipinfo.modinfo.type === "forge"){
|
||||
modid = zipinfo.modinfo.data.mods[0].modId
|
||||
}else if(zipinfo.modinfo.type === "fabric"){
|
||||
modid = zipinfo.modinfo.data.id
|
||||
}
|
||||
|
||||
try { //Modrinth
|
||||
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)}`)
|
||||
}
|
||||
} catch (error) { //DeEarthPublic
|
||||
try {
|
||||
if (JSON.parse(await FastGot(`https://dearth.0771010.xyz/api/modid?modid=${modid}`)).isClient) {
|
||||
fs.renameSync(modpath, `${movepath}/${path.basename(modpath)}`)
|
||||
}
|
||||
} catch (error) { //mods.toml或fabric.mod.json判断
|
||||
try{
|
||||
if(zipinfo.modinfo.type === "forge"){
|
||||
const mcside = zipinfo.modinfo.data.dependencies[modid].find((mod: { modId: string; }) => mod.modId === "minecraft").side //Minecraft
|
||||
if (mcside == "CLIENT") {
|
||||
fs.renameSync(modpath, `${movepath}/${path.basename(modpath)}`)
|
||||
}
|
||||
const forgeside = zipinfo.modinfo.data.dependencies[modid].find((mod: { modId: string; }) => mod.modId === "forge").side //Forge
|
||||
if (forgeside == "CLIENT") {
|
||||
fs.renameSync(modpath, `${movepath}/${path.basename(modpath)}`)
|
||||
}
|
||||
const neoside = zipinfo.modinfo.data.dependencies[modid].find((mod: { modId: string; }) => mod.modId === "neoforge").side //NeoForge
|
||||
if (neoside == "CLIENT") {
|
||||
fs.renameSync(modpath, `${movepath}/${path.basename(modpath)}`)
|
||||
}
|
||||
}else if(zipinfo.modinfo.type === "fabric"){ //Fabric
|
||||
const fmj = zipinfo.modinfo.data.environment
|
||||
if (fmj == "client") {
|
||||
fs.renameSync(modpath, `${movepath}/${path.basename(modpath)}`)
|
||||
}
|
||||
}
|
||||
}catch(error){
|
||||
try{
|
||||
for (let i = 0; i < zipinfo.mixins.length; i++) {
|
||||
const e = zipinfo.mixins[i]
|
||||
const info = JSON.parse(e.info)
|
||||
if (isMixin(info)) {
|
||||
fs.renameSync(modpath, `${movepath}/${path.basename(modpath)}`)
|
||||
}
|
||||
}
|
||||
}catch(error){
|
||||
LOGGER.error(`大天才JSON写注释了估计,模组路径:${modpath},过滤失败`)
|
||||
}
|
||||
}
|
||||
}
|
||||
}catch(error){
|
||||
LOGGER.error("DeEarth: "+error)
|
||||
}
|
||||
}
|
||||
|
||||
function ZipInfo(modpath: string) {
|
||||
interface ZipInfo {
|
||||
mixins: { filename: string, info: string }[]
|
||||
modinfo: {type:string,data:any};
|
||||
}
|
||||
let zipinfo: ZipInfo = { mixins: [], modinfo: {type: "",data: {}} }
|
||||
const zip = new AdmZip(modpath).getEntries();
|
||||
for (let i = 0; i < zip.length; i++) {
|
||||
const e = zip[i]
|
||||
if (isMixinFile(e.entryName)) {
|
||||
zipinfo.mixins.push({ filename: e.entryName, info: e.getData().toString('utf-8') })
|
||||
} else if (isForge(e.entryName)) {
|
||||
zipinfo.modinfo.type = "forge"
|
||||
zipinfo.modinfo.data = toml.parse(e.getData().toString('utf-8'))
|
||||
} else if (e.entryName.endsWith("fabric.mod.json")) {
|
||||
zipinfo.modinfo.type = "fabric"
|
||||
zipinfo.modinfo.data = JSON.parse(e.getData().toString('utf-8'))
|
||||
}
|
||||
}
|
||||
return zipinfo;
|
||||
}
|
||||
|
||||
async function FastGot(url: string) {
|
||||
@@ -156,7 +238,7 @@ async function FastGot(url: string) {
|
||||
})
|
||||
if (fastgot[0] !== undefined) {
|
||||
return fastgot[0]
|
||||
}else{
|
||||
} else {
|
||||
return "null"
|
||||
}
|
||||
}
|
||||
@@ -164,18 +246,18 @@ async function FastGot(url: string) {
|
||||
const multibar = new MultiBar({
|
||||
format: ' {bar} | {filename} | {value}/{total}',
|
||||
noTTYOutput: true,
|
||||
notTTYSchedule: 10*1000,
|
||||
notTTYSchedule: 10 * 1000,
|
||||
})
|
||||
|
||||
function isMixin(resx: { mixins: {} | null; client: {}; }){
|
||||
function isMixin(resx: { mixins: {} | null; client: {}; }) {
|
||||
return resx.mixins == null || Object.keys(resx.mixins).length == 0 && Object.keys(resx.client).length !== 0
|
||||
}
|
||||
|
||||
function isForge(name:string):boolean{
|
||||
return name.includes("mods.toml")||name.includes("META-INF")
|
||||
function isForge(name: string): boolean {
|
||||
return name.endsWith("mods.toml") || name.endsWith("neoforge.mod.toml")
|
||||
}
|
||||
|
||||
function isMixinFile(name:string):boolean{
|
||||
function isMixinFile(name: string): boolean {
|
||||
return !name.includes("/") && name.endsWith(".json") && !name.endsWith("refmap.json") && !name.endsWith("mod.json")
|
||||
}
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ export const LOGGER = {
|
||||
warn(text: string) {
|
||||
warn(text);
|
||||
},
|
||||
error(text: string | object) {
|
||||
error(text: string | object | unknown) {
|
||||
error(text);
|
||||
},
|
||||
};
|
||||
@@ -27,7 +27,7 @@ function warn(text: string) {
|
||||
)}`
|
||||
);
|
||||
}
|
||||
function error(error: object | string) {
|
||||
function error(error: object | string | unknown) {
|
||||
if (typeof error === "object") {
|
||||
console.log(
|
||||
`[${chalk.blue(
|
||||
|
||||
Reference in New Issue
Block a user