diff --git a/src/model/nebula/servermeta.ts b/src/model/nebula/servermeta.ts index e7442db..51df187 100644 --- a/src/model/nebula/servermeta.ts +++ b/src/model/nebula/servermeta.ts @@ -1,5 +1,63 @@ +import { Server } from 'helios-distribution-types' + +export interface ServerMetaOptions { + forgeVersion?: string + liteloaderVersion?: string +} + +export function getDefaultServerMeta(id: string, version: string, options?: ServerMetaOptions): ServerMeta { + + const servMeta: ServerMeta = { + meta: { + version: '1.0.0', + name: `${id} (Minecraft ${version})`, + description: `${id} Running Minecraft ${version}`, + address: 'localhost:25565', + discord: { + shortId: '', + largeImageText: '', + largeImageKey: '' + }, + mainServer: false, + autoconnect: false + } + } + + if(options?.forgeVersion) { + servMeta.meta.description = `${servMeta.meta.description} (Forge v${options.forgeVersion})` + servMeta.forge = { + version: options.forgeVersion + } + } + + if(options?.liteloaderVersion) { + servMeta.meta.description = `${servMeta.meta.description} (Liteloader v${options.liteloaderVersion})` + servMeta.liteloader = { + version: options.liteloaderVersion + } + } + + return servMeta +} + export interface ServerMeta { - forgeVersion: string + meta: { + version: Server['version'] + name: Server['name'] + description: Server['description'] + address: Server['address'] + discord?: Server['discord'] + mainServer: Server['mainServer'] + autoconnect: Server['autoconnect'] + } + + forge?: { + version: string + } + + liteloader?: { + version: string + } } diff --git a/src/model/struct/model/server.struct.ts b/src/model/struct/model/server.struct.ts index 589c51f..d48d467 100644 --- a/src/model/struct/model/server.struct.ts +++ b/src/model/struct/model/server.struct.ts @@ -1,9 +1,9 @@ import { lstat, mkdirs, pathExists, readdir, readFile, writeFile } from 'fs-extra' -import { Server } from 'helios-distribution-types' +import { Server, Module } from 'helios-distribution-types' import { dirname, join, resolve as resolvePath } from 'path' import { resolve as resolveUrl } from 'url' import { VersionSegmentedRegistry } from '../../../util/VersionSegmentedRegistry' -import { ServerMeta } from '../../nebula/servermeta' +import { ServerMeta, getDefaultServerMeta, ServerMetaOptions } from '../../nebula/servermeta' import { BaseModelStructure } from './basemodel.struct' import { MiscFileStructure } from './module/file.struct' import { LiteModStructure } from './module/litemod.struct' @@ -50,6 +50,8 @@ export class ServerStructure extends BaseModelStructure { await mkdirs(absoluteServerRoot) + const serverMetaOpts: ServerMetaOptions = {} + if (options.forgeVersion != null) { const fms = VersionSegmentedRegistry.getForgeModStruct( minecraftVersion, @@ -59,17 +61,18 @@ export class ServerStructure extends BaseModelStructure { this.baseUrl ) await fms.init() - const serverMeta: ServerMeta = { - forgeVersion: options.forgeVersion - } - await writeFile(resolvePath(absoluteServerRoot, 'servermeta.json'), JSON.stringify(serverMeta, null, 2)) + serverMetaOpts.forgeVersion = options.forgeVersion } if (options.liteloaderVersion != null) { const lms = new LiteModStructure(absoluteServerRoot, relativeServerRoot, this.baseUrl) await lms.init() + serverMetaOpts.liteloaderVersion = options.liteloaderVersion } + const serverMeta: ServerMeta = getDefaultServerMeta(id, minecraftVersion.toString(), serverMetaOpts) + await writeFile(resolvePath(absoluteServerRoot, 'servermeta.json'), JSON.stringify(serverMeta, null, 2)) + const libS = new LibraryStructure(absoluteServerRoot, relativeServerRoot, this.baseUrl) await libS.init() @@ -94,7 +97,7 @@ export class ServerStructure extends BaseModelStructure { continue } - let iconUrl + let iconUrl: string = null! // Resolve server icon const subFiles = await readdir(absoluteServerRoot) @@ -107,65 +110,65 @@ export class ServerStructure extends BaseModelStructure { if (!iconUrl) { ServerStructure.logger.warn(`No icon file found for server ${file}.`) - iconUrl = '' } // Read server meta const serverMeta: ServerMeta = JSON.parse(await readFile(resolvePath(absoluteServerRoot, 'servermeta.json'), 'utf-8')) const minecraftVersion = new MinecraftVersion(match[2]) - const forgeResolver = VersionSegmentedRegistry.getForgeResolver( - minecraftVersion, - serverMeta.forgeVersion, - dirname(this.containerDirectory), - '', - this.baseUrl - ) + const modules: Module[] = [] - // Resolve forge - const forgeItselfModule = await forgeResolver.getModule() + if(serverMeta.forge) { + const forgeResolver = VersionSegmentedRegistry.getForgeResolver( + minecraftVersion, + serverMeta.forge.version, + dirname(this.containerDirectory), + '', + this.baseUrl + ) - const forgeModStruct = VersionSegmentedRegistry.getForgeModStruct( - minecraftVersion, - serverMeta.forgeVersion, - absoluteServerRoot, - relativeServerRoot, - this.baseUrl - ) - const forgeModModules = await forgeModStruct.getSpecModel() + // Resolve forge + const forgeItselfModule = await forgeResolver.getModule() + modules.push(forgeItselfModule) - const liteModStruct = new LiteModStructure(absoluteServerRoot, relativeServerRoot, this.baseUrl) - const liteModModules = await liteModStruct.getSpecModel() + const forgeModStruct = VersionSegmentedRegistry.getForgeModStruct( + minecraftVersion, + serverMeta.forge.version, + absoluteServerRoot, + relativeServerRoot, + this.baseUrl + ) + + const forgeModModules = await forgeModStruct.getSpecModel() + modules.push(...forgeModModules) + } + + + if(serverMeta.liteloader) { + const liteModStruct = new LiteModStructure(absoluteServerRoot, relativeServerRoot, this.baseUrl) + const liteModModules = await liteModStruct.getSpecModel() + modules.push(...liteModModules) + } + + const libraryStruct = new LibraryStructure(absoluteServerRoot, relativeServerRoot, this.baseUrl) + const libraryModules = await libraryStruct.getSpecModel() + modules.push(...libraryModules) const fileStruct = new MiscFileStructure(absoluteServerRoot, relativeServerRoot, this.baseUrl) const fileModules = await fileStruct.getSpecModel() - - const libraryStruct = new LibraryStructure(absoluteServerRoot, relativeServerRoot, this.baseUrl) - const libraryModules = await libraryStruct.getSpecModel() - - const modules = [ - forgeItselfModule, - ...libraryModules, - ...forgeModModules, - ...liteModModules, - ...fileModules - ] + modules.push(...fileModules) accumulator.push({ id: match[1], - name: '', - description: '', + name: serverMeta.meta.name, + description: serverMeta.meta.description, icon: iconUrl, - version: '1.0.0', - address: '', + version: serverMeta.meta.version, + address: serverMeta.meta.address, minecraftVersion: match[2], - discord: { - shortId: '', - largeImageText: '', - largeImageKey: '' - }, - mainServer: false, - autoconnect: false, + ...(serverMeta.meta.discord ? {discord: serverMeta.meta.discord} : {}), + mainServer: serverMeta.meta.mainServer, + autoconnect: serverMeta.meta.autoconnect, modules })