diff --git a/src/index.ts b/src/index.ts index 92d3f47..33d860f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,6 +6,7 @@ import { URL } from 'url' import { inspect } from 'util' import yargs from 'yargs' import { DistributionStructure } from './model/struct/model/distribution.struct' +import { ServerStructure } from './model/struct/model/server.struct' import { ResolverRegistry } from './resolver/ResolverRegistry' dotenv.config() @@ -124,14 +125,14 @@ const generateServerCommand: yargs.CommandModule = { type: 'string' }) .option('forge', { - describe: 'Include Forge.', - type: 'boolean', - default: true + describe: 'Forge version.', + type: 'string', + default: null }) .option('liteloader', { - describe: 'Include liteloader.', - type: 'boolean', - default: false + describe: 'LiteLoader version.', + type: 'string', + default: null }) }, handler: (argv) => { @@ -139,8 +140,19 @@ const generateServerCommand: yargs.CommandModule = { console.debug(`Root set to ${argv.root}`) console.debug(`Generating server ${argv.id} for Minecraft ${argv.version}.`, - `\n\t├ Include forge: ${argv.forge}`, - `\n\t└ Include liteloader: ${argv.liteloader}`) + `\n\t├ Forge version: ${argv.forge}`, + `\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 + } + ) + } } diff --git a/src/model/nebula/servermeta.ts b/src/model/nebula/servermeta.ts new file mode 100644 index 0000000..e7442db --- /dev/null +++ b/src/model/nebula/servermeta.ts @@ -0,0 +1,5 @@ +export interface ServerMeta { + + forgeVersion: string + +} diff --git a/src/model/struct/model/server.struct.ts b/src/model/struct/model/server.struct.ts index 4bd8b12..73b4687 100644 --- a/src/model/struct/model/server.struct.ts +++ b/src/model/struct/model/server.struct.ts @@ -1,6 +1,8 @@ -import { lstat, readdir } from 'fs-extra' -import { join, resolve as resolvePath } from 'path' +import { lstat, mkdirs, pathExists, readdir, readFile, writeFile } from 'fs-extra' +import { dirname, join, resolve as resolvePath } from 'path' import { resolve as resolveUrl } from 'url' +import { ResolverRegistry } from '../../../resolver/ResolverRegistry' +import { ServerMeta } from '../../nebula/servermeta' import { Server } from '../../spec/server' import { BaseModelStructure } from './basemodel.struct' import { MiscFileStructure } from './module/file.struct' @@ -25,6 +27,44 @@ export class ServerStructure extends BaseModelStructure { 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 { const accumulator: Server[] = [] @@ -57,6 +97,25 @@ export class ServerStructure extends BaseModelStructure { iconUrl = '' } + // 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 forgeModModules = await forgeModStruct.getSpecModel() @@ -67,6 +126,7 @@ export class ServerStructure extends BaseModelStructure { const fileModules = await fileStruct.getSpecModel() const modules = [ + forgeItselfModule, ...forgeModModules, ...liteModModules, ...fileModules