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 {
|
export abstract class BaseForgeModStructure extends ModuleStructure implements VersionSegmented {
|
||||||
|
|
||||||
|
protected readonly EXAMPLE_MOD_ID = 'examplemod'
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
absoluteRoot: string,
|
absoluteRoot: string,
|
||||||
relativeRoot: string,
|
relativeRoot: string,
|
||||||
|
|||||||
@@ -103,16 +103,31 @@ export class ForgeModStructure113 extends BaseForgeModStructure {
|
|||||||
// ignored
|
// ignored
|
||||||
}
|
}
|
||||||
|
|
||||||
let createDefault = false
|
|
||||||
|
|
||||||
if (raw) {
|
if (raw) {
|
||||||
// Assuming the main mod will be the first entry in this file.
|
|
||||||
try {
|
try {
|
||||||
const parsed = toml.parse(raw.toString()) as ModsToml
|
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
|
const crudeInference = this.attemptCrudeInference(name)
|
||||||
if (parsed.mods[0].version === '${file.jarVersion}') {
|
|
||||||
let version = '0.0.0'
|
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 {
|
try {
|
||||||
const manifest = zip.entryDataSync('META-INF/MANIFEST.MF')
|
const manifest = zip.entryDataSync('META-INF/MANIFEST.MF')
|
||||||
const keys = manifest.toString().split('\n')
|
const keys = manifest.toString().split('\n')
|
||||||
@@ -127,28 +142,18 @@ export class ForgeModStructure113 extends BaseForgeModStructure {
|
|||||||
} catch {
|
} catch {
|
||||||
ForgeModStructure113.logger.debug(`ForgeMod ${name} contains a version wildcard yet no MANIFEST.MF.. Defaulting to ${version}`)
|
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] = ({
|
this.forgeModMetadata[name] = ({
|
||||||
modLoader: 'javafml',
|
modLoader: 'javafml',
|
||||||
loaderVersion: '',
|
loaderVersion: '',
|
||||||
mods: [{
|
mods: [{
|
||||||
modId: name.substring(0, name.lastIndexOf('.')).toLowerCase(),
|
modId: crudeInference.name.toLowerCase(),
|
||||||
version: '0.0.0',
|
version: crudeInference.version,
|
||||||
displayName: name,
|
displayName: crudeInference.name,
|
||||||
description: ''
|
description: ''
|
||||||
}]
|
}]
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -100,36 +100,45 @@ export class ForgeModStructure17 extends BaseForgeModStructure {
|
|||||||
// ignored
|
// ignored
|
||||||
}
|
}
|
||||||
|
|
||||||
let createDefault = false
|
|
||||||
|
|
||||||
if (raw) {
|
if (raw) {
|
||||||
// Assuming the main mod will be the first entry in this file.
|
// Assuming the main mod will be the first entry in this file.
|
||||||
try {
|
try {
|
||||||
const resolved = JSON.parse(raw.toString()) as (McModInfoList | McModInfo[])
|
const resolved = JSON.parse(raw.toString()) as (McModInfoList | McModInfo[])
|
||||||
|
|
||||||
if (Object.prototype.hasOwnProperty.call(resolved, 'modListVersion')) {
|
if (Object.prototype.hasOwnProperty.call(resolved, 'modListVersion')) {
|
||||||
this.forgeModMetadata[name] = (resolved as McModInfoList).modList[0]
|
this.forgeModMetadata[name] = (resolved as McModInfoList).modList[0]
|
||||||
} else {
|
} else {
|
||||||
this.forgeModMetadata[name] = (resolved as McModInfo[])[0]
|
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) {
|
} catch (err) {
|
||||||
ForgeModStructure17.logger.error(`ForgeMod ${name} contains an invalid mcmod.info file.`)
|
ForgeModStructure17.logger.error(`ForgeMod ${name} contains an invalid mcmod.info file.`)
|
||||||
createDefault = true
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ForgeModStructure17.logger.error(`ForgeMod ${name} does not contain mcmod.info file.`)
|
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] = ({
|
this.forgeModMetadata[name] = ({
|
||||||
modid: name.substring(0, name.lastIndexOf('.')).toLowerCase(),
|
modid: crudeInference.name.toLowerCase(),
|
||||||
name,
|
name: crudeInference.name,
|
||||||
version: '0.0.0'
|
version: crudeInference.version
|
||||||
}) as unknown as McModInfo
|
}) as unknown as McModInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,8 +6,6 @@ import { resolve } from 'url'
|
|||||||
|
|
||||||
export class LibraryStructure extends ModuleStructure {
|
export class LibraryStructure extends ModuleStructure {
|
||||||
|
|
||||||
private readonly crudeRegex = /(.+)-([\d.]+).[jJ][aA][rR]/
|
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
absoluteRoot: string,
|
absoluteRoot: string,
|
||||||
relativeRoot: 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
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
protected async getModuleId(name: string, path: string): Promise<string> {
|
protected async getModuleId(name: string, path: string): Promise<string> {
|
||||||
const inference = this.attemptCrudeInference(name)
|
const inference = this.attemptCrudeInference(name)
|
||||||
|
|||||||
@@ -6,6 +6,9 @@ import { BaseModelStructure } from '../basemodel.struct'
|
|||||||
|
|
||||||
export abstract class ModuleStructure extends BaseModelStructure<Module> {
|
export abstract class ModuleStructure extends BaseModelStructure<Module> {
|
||||||
|
|
||||||
|
private readonly crudeRegex = /(.+?)-(.+).[jJ][aA][rR]/
|
||||||
|
protected readonly DEFAULT_VERSION = '0.0.0'
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
absoluteRoot: string,
|
absoluteRoot: string,
|
||||||
relativeRoot: 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}`
|
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 getModuleId(name: string, path: string): Promise<string>
|
||||||
protected async abstract getModuleName(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>
|
protected async abstract getModuleUrl(name: string, path: string, stats: Stats): Promise<string>
|
||||||
|
|||||||
Reference in New Issue
Block a user