Attempt to perform a metadata inference on file names to account for mod author neglect.
This commit is contained in:
@@ -8,6 +8,8 @@ import { MinecraftVersion } from '../../../../util/MinecraftVersion'
|
||||
|
||||
export abstract class BaseForgeModStructure extends ModuleStructure implements VersionSegmented {
|
||||
|
||||
protected readonly EXAMPLE_MOD_ID = 'examplemod'
|
||||
|
||||
constructor(
|
||||
absoluteRoot: string,
|
||||
relativeRoot: string,
|
||||
|
||||
@@ -103,16 +103,31 @@ export class ForgeModStructure113 extends BaseForgeModStructure {
|
||||
// ignored
|
||||
}
|
||||
|
||||
let createDefault = false
|
||||
|
||||
if (raw) {
|
||||
// Assuming the main mod will be the first entry in this file.
|
||||
try {
|
||||
const parsed = toml.parse(raw.toString()) as ModsToml
|
||||
this.forgeModMetadata[name] = parsed
|
||||
} catch (err) {
|
||||
ForgeModStructure113.logger.error(`ForgeMod ${name} contains an invalid mods.toml file.`)
|
||||
}
|
||||
} else {
|
||||
ForgeModStructure113.logger.error(`ForgeMod ${name} does not contain mods.toml file.`)
|
||||
}
|
||||
|
||||
// tslint:disable-next-line: no-invalid-template-strings
|
||||
if (parsed.mods[0].version === '${file.jarVersion}') {
|
||||
let version = '0.0.0'
|
||||
const crudeInference = this.attemptCrudeInference(name)
|
||||
|
||||
if(this.forgeModMetadata[name] != null) {
|
||||
|
||||
const x = this.forgeModMetadata[name]!
|
||||
for(const entry of x.mods) {
|
||||
|
||||
if(entry.modId === this.EXAMPLE_MOD_ID) {
|
||||
entry.modId = crudeInference.name.toLowerCase()
|
||||
entry.displayName = crudeInference.name
|
||||
}
|
||||
|
||||
if (entry.version === '${file.jarVersion}') {
|
||||
let version = crudeInference.version
|
||||
try {
|
||||
const manifest = zip.entryDataSync('META-INF/MANIFEST.MF')
|
||||
const keys = manifest.toString().split('\n')
|
||||
@@ -127,28 +142,18 @@ export class ForgeModStructure113 extends BaseForgeModStructure {
|
||||
} catch {
|
||||
ForgeModStructure113.logger.debug(`ForgeMod ${name} contains a version wildcard yet no MANIFEST.MF.. Defaulting to ${version}`)
|
||||
}
|
||||
parsed.mods[0].version = version
|
||||
entry.version = version
|
||||
}
|
||||
|
||||
this.forgeModMetadata[name] = parsed
|
||||
|
||||
} catch (err) {
|
||||
ForgeModStructure113.logger.error(`ForgeMod ${name} contains an invalid mods.toml file.`)
|
||||
createDefault = true
|
||||
}
|
||||
} else {
|
||||
ForgeModStructure113.logger.error(`ForgeMod ${name} does not contain mods.toml file.`)
|
||||
createDefault = true
|
||||
}
|
||||
|
||||
if (createDefault) {
|
||||
} else {
|
||||
this.forgeModMetadata[name] = ({
|
||||
modLoader: 'javafml',
|
||||
loaderVersion: '',
|
||||
mods: [{
|
||||
modId: name.substring(0, name.lastIndexOf('.')).toLowerCase(),
|
||||
version: '0.0.0',
|
||||
displayName: name,
|
||||
modId: crudeInference.name.toLowerCase(),
|
||||
version: crudeInference.version,
|
||||
displayName: crudeInference.name,
|
||||
description: ''
|
||||
}]
|
||||
})
|
||||
|
||||
@@ -100,36 +100,45 @@ export class ForgeModStructure17 extends BaseForgeModStructure {
|
||||
// ignored
|
||||
}
|
||||
|
||||
let createDefault = false
|
||||
|
||||
if (raw) {
|
||||
// Assuming the main mod will be the first entry in this file.
|
||||
try {
|
||||
const resolved = JSON.parse(raw.toString()) as (McModInfoList | McModInfo[])
|
||||
|
||||
if (Object.prototype.hasOwnProperty.call(resolved, 'modListVersion')) {
|
||||
this.forgeModMetadata[name] = (resolved as McModInfoList).modList[0]
|
||||
} else {
|
||||
this.forgeModMetadata[name] = (resolved as McModInfo[])[0]
|
||||
}
|
||||
// No way to resolve this AFAIK
|
||||
if(this.forgeModMetadata[name]!.version.indexOf('@') > -1 || this.forgeModMetadata[name]!.version.indexOf('$') > -1) {
|
||||
// Ex. @VERSION@, ${version}
|
||||
this.forgeModMetadata[name]!.version = '0.0.0'
|
||||
}
|
||||
|
||||
} catch (err) {
|
||||
ForgeModStructure17.logger.error(`ForgeMod ${name} contains an invalid mcmod.info file.`)
|
||||
createDefault = true
|
||||
}
|
||||
} else {
|
||||
ForgeModStructure17.logger.error(`ForgeMod ${name} does not contain mcmod.info file.`)
|
||||
createDefault = true
|
||||
}
|
||||
|
||||
if (createDefault) {
|
||||
// Validate
|
||||
const crudeInference = this.attemptCrudeInference(name)
|
||||
if(this.forgeModMetadata[name] != null) {
|
||||
|
||||
const x = this.forgeModMetadata[name]!
|
||||
if(x.modid === this.EXAMPLE_MOD_ID) {
|
||||
x.modid = crudeInference.name.toLowerCase()
|
||||
x.name = crudeInference.name
|
||||
}
|
||||
|
||||
// Ex. @VERSION@, ${version}
|
||||
const isVersionWildcard = this.forgeModMetadata[name]!.version.indexOf('@') > -1 || this.forgeModMetadata[name]!.version.indexOf('$') > -1
|
||||
if(isVersionWildcard) {
|
||||
x.version = crudeInference.version
|
||||
}
|
||||
|
||||
} else {
|
||||
this.forgeModMetadata[name] = ({
|
||||
modid: name.substring(0, name.lastIndexOf('.')).toLowerCase(),
|
||||
name,
|
||||
version: '0.0.0'
|
||||
modid: crudeInference.name.toLowerCase(),
|
||||
name: crudeInference.name,
|
||||
version: crudeInference.version
|
||||
}) as unknown as McModInfo
|
||||
}
|
||||
|
||||
|
||||
@@ -6,8 +6,6 @@ import { resolve } from 'url'
|
||||
|
||||
export class LibraryStructure extends ModuleStructure {
|
||||
|
||||
private readonly crudeRegex = /(.+)-([\d.]+).[jJ][aA][rR]/
|
||||
|
||||
constructor(
|
||||
absoluteRoot: string,
|
||||
relativeRoot: string,
|
||||
@@ -18,21 +16,6 @@ export class LibraryStructure extends ModuleStructure {
|
||||
})
|
||||
}
|
||||
|
||||
private attemptCrudeInference(name: string): { name: string, version: string } {
|
||||
const result = this.crudeRegex.exec(name)
|
||||
if(result != null) {
|
||||
return {
|
||||
name: result[1],
|
||||
version: result[2]
|
||||
}
|
||||
} else {
|
||||
return {
|
||||
name: name.substring(0, name.toLowerCase().indexOf(TypeMetadata[this.type].defaultExtension!)),
|
||||
version: '0.0.0'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
protected async getModuleId(name: string, path: string): Promise<string> {
|
||||
const inference = this.attemptCrudeInference(name)
|
||||
|
||||
@@ -6,6 +6,9 @@ import { BaseModelStructure } from '../basemodel.struct'
|
||||
|
||||
export abstract class ModuleStructure extends BaseModelStructure<Module> {
|
||||
|
||||
private readonly crudeRegex = /(.+?)-(.+).[jJ][aA][rR]/
|
||||
protected readonly DEFAULT_VERSION = '0.0.0'
|
||||
|
||||
constructor(
|
||||
absoluteRoot: string,
|
||||
relativeRoot: string,
|
||||
@@ -29,6 +32,21 @@ export abstract class ModuleStructure extends BaseModelStructure<Module> {
|
||||
return `generated.${this.type.toLowerCase()}:${name}:${version}@${TypeMetadata[this.type].defaultExtension}`
|
||||
}
|
||||
|
||||
protected attemptCrudeInference(name: string): { name: string, version: string } {
|
||||
const result = this.crudeRegex.exec(name)
|
||||
if(result != null) {
|
||||
return {
|
||||
name: result[1],
|
||||
version: result[2]
|
||||
}
|
||||
} else {
|
||||
return {
|
||||
name: name.substring(0, name.lastIndexOf('.')),
|
||||
version: this.DEFAULT_VERSION
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected async abstract getModuleId(name: string, path: string): Promise<string>
|
||||
protected async abstract getModuleName(name: string, path: string): Promise<string>
|
||||
protected async abstract getModuleUrl(name: string, path: string, stats: Stats): Promise<string>
|
||||
|
||||
Reference in New Issue
Block a user