Attempt to perform a metadata inference on file names to account for mod author neglect.

This commit is contained in:
Daniel Scalzi
2020-06-13 00:10:20 -04:00
parent a6b6ed9db3
commit ceb23f11a5
5 changed files with 68 additions and 51 deletions

View File

@@ -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,

View File

@@ -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: ''
}]
})

View File

@@ -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
}

View File

@@ -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)

View File

@@ -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>