Forge and its submodules are now included in the generated distribution.

This commit is contained in:
Daniel Scalzi
2020-01-12 07:15:21 -05:00
parent 9e420db907
commit a236e8408e
3 changed files with 87 additions and 10 deletions

View File

@@ -6,6 +6,7 @@ import { URL } from 'url'
import { inspect } from 'util' import { inspect } from 'util'
import yargs from 'yargs' import yargs from 'yargs'
import { DistributionStructure } from './model/struct/model/distribution.struct' import { DistributionStructure } from './model/struct/model/distribution.struct'
import { ServerStructure } from './model/struct/model/server.struct'
import { ResolverRegistry } from './resolver/ResolverRegistry' import { ResolverRegistry } from './resolver/ResolverRegistry'
dotenv.config() dotenv.config()
@@ -124,14 +125,14 @@ const generateServerCommand: yargs.CommandModule = {
type: 'string' type: 'string'
}) })
.option('forge', { .option('forge', {
describe: 'Include Forge.', describe: 'Forge version.',
type: 'boolean', type: 'string',
default: true default: null
}) })
.option('liteloader', { .option('liteloader', {
describe: 'Include liteloader.', describe: 'LiteLoader version.',
type: 'boolean', type: 'string',
default: false default: null
}) })
}, },
handler: (argv) => { handler: (argv) => {
@@ -139,8 +140,19 @@ const generateServerCommand: yargs.CommandModule = {
console.debug(`Root set to ${argv.root}`) console.debug(`Root set to ${argv.root}`)
console.debug(`Generating server ${argv.id} for Minecraft ${argv.version}.`, console.debug(`Generating server ${argv.id} for Minecraft ${argv.version}.`,
`\n\t├ Include forge: ${argv.forge}`, `\n\t├ Forge version: ${argv.forge}`,
`\n\t└ Include liteloader: ${argv.liteloader}`) `\n\t└ LiteLoader version: ${argv.liteloader}`)
const serverStruct = new ServerStructure(argv.root as string, getBaseURL())
serverStruct.createServer(
argv.id as string,
argv.version as string,
{
forgeVersion: argv.forge as string,
liteloaderVersion: argv.liteloader as string
}
)
} }
} }

View File

@@ -0,0 +1,5 @@
export interface ServerMeta {
forgeVersion: string
}

View File

@@ -1,6 +1,8 @@
import { lstat, readdir } from 'fs-extra' import { lstat, mkdirs, pathExists, readdir, readFile, writeFile } from 'fs-extra'
import { join, resolve as resolvePath } from 'path' import { dirname, join, resolve as resolvePath } from 'path'
import { resolve as resolveUrl } from 'url' import { resolve as resolveUrl } from 'url'
import { ResolverRegistry } from '../../../resolver/ResolverRegistry'
import { ServerMeta } from '../../nebula/servermeta'
import { Server } from '../../spec/server' import { Server } from '../../spec/server'
import { BaseModelStructure } from './basemodel.struct' import { BaseModelStructure } from './basemodel.struct'
import { MiscFileStructure } from './module/file.struct' import { MiscFileStructure } from './module/file.struct'
@@ -25,6 +27,44 @@ export class ServerStructure extends BaseModelStructure<Server> {
return this.resolvedModels return this.resolvedModels
} }
public async createServer(
id: string,
minecraftVersion: string,
options: {
forgeVersion?: string
liteloaderVersion?: string
}
) {
const effectiveId = `${id}-${minecraftVersion}`
const absoluteServerRoot = resolvePath(this.containerDirectory, effectiveId)
const relativeServerRoot = join(this.relativeRoot, effectiveId)
if (await pathExists(absoluteServerRoot)) {
console.error('Server already exists! Aborting.')
return
}
await mkdirs(absoluteServerRoot)
if (options.forgeVersion != null) {
const fms = new ForgeModStructure(absoluteServerRoot, relativeServerRoot, this.baseUrl)
await fms.init()
const serverMeta: ServerMeta = {
forgeVersion: options.forgeVersion
}
await writeFile(resolvePath(absoluteServerRoot, 'servermeta.json'), JSON.stringify(serverMeta, null, 2))
}
if (options.liteloaderVersion != null) {
const lms = new LiteModStructure(absoluteServerRoot, relativeServerRoot, this.baseUrl)
await lms.init()
}
const mfs = new MiscFileStructure(absoluteServerRoot, relativeServerRoot, this.baseUrl)
await mfs.init()
}
private async _doSeverRetrieval(): Promise<Server[]> { private async _doSeverRetrieval(): Promise<Server[]> {
const accumulator: Server[] = [] const accumulator: Server[] = []
@@ -57,6 +97,25 @@ export class ServerStructure extends BaseModelStructure<Server> {
iconUrl = '<FILL IN MANUALLY>' iconUrl = '<FILL IN MANUALLY>'
} }
// Read server meta
const serverMeta: ServerMeta = JSON.parse(await readFile(resolvePath(absoluteServerRoot, 'servermeta.json'), 'utf-8'))
const forgeResolver = ResolverRegistry.getForgeResolver(
match[2],
serverMeta.forgeVersion,
dirname(this.absoluteRoot),
'',
this.baseUrl
)
if (forgeResolver == null) {
console.error(`No forge resolver found for Minecraft ${match[2]}, aborting.`)
throw new Error(`No forge resolver found for Minecraft ${match[2]}!`)
}
// Resolve forge
const forgeItselfModule = await forgeResolver.getModule()
const forgeModStruct = new ForgeModStructure(absoluteServerRoot, relativeServerRoot, this.baseUrl) const forgeModStruct = new ForgeModStructure(absoluteServerRoot, relativeServerRoot, this.baseUrl)
const forgeModModules = await forgeModStruct.getSpecModel() const forgeModModules = await forgeModStruct.getSpecModel()
@@ -67,6 +126,7 @@ export class ServerStructure extends BaseModelStructure<Server> {
const fileModules = await fileStruct.getSpecModel() const fileModules = await fileStruct.getSpecModel()
const modules = [ const modules = [
forgeItselfModule,
...forgeModModules, ...forgeModModules,
...liteModModules, ...liteModModules,
...fileModules ...fileModules