diff --git a/src/model/struct/model/module/forgemod.struct.ts b/src/model/struct/model/module/forgemod.struct.ts index adf7734..a5ac90b 100644 --- a/src/model/struct/model/module/forgemod.struct.ts +++ b/src/model/struct/model/module/forgemod.struct.ts @@ -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, diff --git a/src/model/struct/model/module/forgemod/forgemod113.struct.ts b/src/model/struct/model/module/forgemod/forgemod113.struct.ts index 4fc9742..dfa943d 100644 --- a/src/model/struct/model/module/forgemod/forgemod113.struct.ts +++ b/src/model/struct/model/module/forgemod/forgemod113.struct.ts @@ -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: '' }] }) diff --git a/src/model/struct/model/module/forgemod/forgemod17.struct.ts b/src/model/struct/model/module/forgemod/forgemod17.struct.ts index 2b5bce2..e8bd90a 100644 --- a/src/model/struct/model/module/forgemod/forgemod17.struct.ts +++ b/src/model/struct/model/module/forgemod/forgemod17.struct.ts @@ -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 } diff --git a/src/model/struct/model/module/library.struct.ts b/src/model/struct/model/module/library.struct.ts index 0cfe721..c02327c 100644 --- a/src/model/struct/model/module/library.struct.ts +++ b/src/model/struct/model/module/library.struct.ts @@ -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 { const inference = this.attemptCrudeInference(name) diff --git a/src/model/struct/model/module/module.struct.ts b/src/model/struct/model/module/module.struct.ts index 14fb3e2..ab9c286 100644 --- a/src/model/struct/model/module/module.struct.ts +++ b/src/model/struct/model/module/module.struct.ts @@ -6,6 +6,9 @@ import { BaseModelStructure } from '../basemodel.struct' export abstract class ModuleStructure extends BaseModelStructure { + 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 { 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 protected async abstract getModuleName(name: string, path: string): Promise protected async abstract getModuleUrl(name: string, path: string, stats: Stats): Promise