omegga 1.9.2 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/README.md +2 -0
- package/dist/brickadia/server.js +23 -1
- package/dist/brickadia/server.js.map +1 -1
- package/dist/main.js +7 -3
- package/dist/main.js.map +1 -1
- package/dist/omegga/matchers/version.js +32 -0
- package/dist/omegga/matchers/version.js.map +1 -1
- package/dist/omegga/plugin/plugin_jsonrpc_stdio.js +4 -0
- package/dist/omegga/plugin/plugin_jsonrpc_stdio.js.map +1 -1
- package/dist/omegga/plugin/plugin_node_safe/proxyOmegga.js +4 -0
- package/dist/omegga/plugin/plugin_node_safe/proxyOmegga.js.map +1 -1
- package/dist/omegga/server.js +68 -39
- package/dist/omegga/server.js.map +1 -1
- package/dist/omegga/wrapper.js +4 -0
- package/dist/omegga/wrapper.js.map +1 -1
- package/dist/plugin.js.map +1 -1
- package/dist/webserver/backend/index.js +2 -1
- package/dist/webserver/backend/index.js.map +1 -1
- package/package.json +1 -1
- package/templates/safe-ts/omegga.d.ts +6 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin_jsonrpc_stdio.js","sources":["../../../src/omegga/plugin/plugin_jsonrpc_stdio.ts"],"sourcesContent":["import Logger from '@/logger';\nimport { EnvironmentPreset } from '@brickadia/presets';\nimport Omegga from '@omegga/server';\nimport { WriteSaveObject } from 'brs-js';\nimport {\n JSONRPCClient,\n JSONRPCServer,\n JSONRPCServerAndClient,\n} from 'json-rpc-2.0';\nimport { ChildProcessWithoutNullStreams, spawn } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport readline from 'readline';\nimport { Plugin } from './interface';\nimport { bootstrap } from './plugin_node_safe/proxyOmegga';\n\n// TODO: check if version is compatible (v1 -> v2) from file\n// TODO: write jsonrpc wrappers in a few languages, implement a few simple plugins\n// TODO: languages: [ python, go ]\n\nconst MAIN_FILE = 'omegga_plugin';\nconst DOC_FILE = 'doc.json';\nconst PLUGIN_FILE = 'plugin.json';\n\nexport default class RpcPlugin extends Plugin {\n #child: ChildProcessWithoutNullStreams;\n #rpc: JSONRPCServerAndClient;\n #errInterface: readline.Interface;\n #outInterface: readline.Interface;\n\n messageCounter: number;\n\n // all RPC plugins require a main (binary) file and a doc file\n static canLoad(pluginPath: string) {\n return (\n fs.existsSync(path.join(pluginPath, MAIN_FILE)) &&\n fs.existsSync(path.join(pluginPath, DOC_FILE))\n );\n }\n\n // websocket rpc plugin type\n static getFormat() {\n return 'jsonrpc_stdio';\n }\n\n // documentation is based on doc.json file\n getDocumentation() {\n return this.documentation;\n }\n constructor(pluginPath: string, omegga: Omegga) {\n super(pluginPath, omegga);\n\n this.messageCounter = 0;\n\n // TODO: validate documentation\n this.documentation = Plugin.readJSON(path.join(pluginPath, DOC_FILE));\n this.pluginConfig = Plugin.readJSON(path.join(pluginPath, PLUGIN_FILE));\n this.pluginFile = path.join(pluginPath, MAIN_FILE);\n\n this.eventPassthrough = this.eventPassthrough.bind(this);\n this.commands = [];\n\n this.initRPC();\n }\n\n isLoaded() {\n return !!this.#child && !this.#child.exitCode;\n }\n\n // determing if a command is registered\n isCommand(cmd: string) {\n return this.commands.includes(cmd);\n }\n\n // spawn the plugin as a child process\n async load() {\n const name = this.getName();\n const verbose = (...msg: any[]) => Logger.verbose(name.underline, ...msg);\n verbose('Load method invoked');\n let frozen = true,\n timed = false;\n this.commands = [];\n\n // can't load the plugin if the child is still running\n if (this.#child) {\n verbose('Plugin already has child process');\n return false;\n }\n\n let config;\n try {\n verbose('Getting plugin config');\n config = await this.storage.getConfig();\n } catch (e) {\n return false;\n }\n\n try {\n if (this.pluginConfig?.emitConfig) {\n verbose('Emitting plugin config');\n await fs.promises.writeFile(\n path.join(this.path, this.pluginConfig.emitConfig),\n JSON.stringify(config),\n );\n }\n verbose('Spawning child process');\n this.#child = spawn(this.pluginFile);\n this.#child.stdin.setDefaultEncoding('utf8');\n this.#outInterface = readline.createInterface({\n input: this.#child.stdout,\n terminal: false,\n });\n this.#errInterface = readline.createInterface({\n input: this.#child.stderr,\n terminal: false,\n });\n this.attachListeners();\n } catch (err) {\n Logger.errorp(\n 'error loading stdio rpc plugin',\n name.brightRed.underline,\n err,\n );\n await this.kill();\n this.emitStatus();\n return false;\n }\n\n return Promise.race([\n (async () => {\n try {\n // get some initial information to create an omegga proxy\n const initialData = bootstrap(this.omegga);\n\n verbose('Sending initial data');\n // send all of the mock events to the proxy omegga\n for (const ev in initialData) {\n // send some initial information\n this.notify(ev, initialData[ev]);\n }\n\n verbose('Initializing event passthrough');\n // pass events through\n this.omegga.on('*', this.eventPassthrough);\n\n try {\n // tell the plugin to start\n verbose('Waiting for plugin to start...');\n const result = await this.emit('init', config);\n\n verbose('Initialized with result:', result);\n // plugins can return a result object\n if (typeof result === 'object' && result) {\n // if registeredCommands is in the results, register the provided strings as commands\n const cmds = result.registeredCommands;\n if (\n cmds &&\n cmds instanceof Array &&\n cmds.every(i => typeof i === 'string')\n )\n this.commands = cmds;\n }\n } catch (e) {\n if (!e.message) return;\n Logger.errorp(name.brightRed.underline, 'error starting: ', e);\n }\n\n // plugin is not frozen, resolve that it has loaded\n frozen = false;\n if (timed) return;\n this.emitStatus();\n return true;\n } catch (e) {\n if (timed) return;\n Logger.errorp(\n 'error loading stdio rpc plugin',\n name.brightRed.underline,\n e,\n );\n await this.kill();\n frozen = false;\n this.emitStatus();\n return false;\n }\n })(),\n new Promise<boolean>(resolve => {\n // let user know if the child quit while launching\n this.#child.once('exit', () => {\n if (!frozen || timed) return;\n verbose('Plugin exited during init');\n frozen = false;\n this.emitStatus();\n resolve(false);\n });\n\n // check if the child is frozen (while true)\n setTimeout(() => {\n if (!frozen) return;\n Logger.errorp(\n 'I appear to be unresponsive when starting (maybe I forgot to respond to init)',\n name.brightRed.underline,\n );\n this.kill();\n timed = true;\n this.emitStatus();\n resolve(false);\n }, 5000);\n }),\n ]);\n }\n\n // kill the child process after requesting it to stop\n unload() {\n if (!this.#child || this.#child.exitCode) {\n this.detachListeners();\n this.emitStatus();\n return Promise.resolve(true);\n }\n let frozen = true,\n timed = false;\n const name = this.getName();\n\n return Promise.race([\n (async (): Promise<boolean> => {\n try {\n // let the plugin know it's time to stop, if this error it's probably because the method was not implemented\n try {\n await this.emit('stop');\n } catch (e) {\n // lazy developer - just implement stop please\n }\n\n await this.kill();\n\n frozen = false;\n if (timed) return;\n this.emitStatus();\n this.commands = [];\n return true;\n } catch (e) {\n if (timed) return;\n Logger.errorp(\n 'error unloading rpc plugin',\n name.brightRed.underline,\n e,\n );\n frozen = false;\n this.emitStatus();\n return false;\n }\n })(),\n // this is wrapped in a promise for the freeze check\n new Promise<boolean>(resolve => {\n // check if the child is frozen (while true)\n setTimeout(() => {\n if (!frozen) return;\n Logger.errorp(\n 'I appear to be unresponsive when stopping (maybe I forgot to respond to stop)',\n name.brightRed.underline,\n );\n this.kill();\n timed = true;\n this.emitStatus();\n resolve(true);\n }, 5000);\n }),\n ]);\n }\n\n // attaches event listeners\n attachListeners() {\n const name = this.getName();\n\n this.#outInterface.on('line', line => {\n try {\n const rpcData = JSON.parse(line);\n try {\n this.#rpc.receiveAndSend(rpcData);\n } catch (e) {\n Logger.error(\n this.getName().brightRed.underline,\n '!>'.red,\n 'error parsing rpc data',\n e,\n line,\n );\n }\n } catch {\n // fallback to logging\n Logger.log(name.underline, '>>'.green, line);\n }\n });\n\n // stderr - print out the errors\n this.#errInterface.on('line', err => {\n Logger.error(name.brightRed.underline, '!>'.red, err);\n });\n\n this.#child.on('error', () => this.kill());\n this.#child.on('close', () => this.kill());\n this.#child.on('exit', code => {\n Logger.errorp(\n '!>'.red,\n 'rpc plugin',\n name.brightRed.underline,\n 'exited with code',\n code,\n );\n this.kill();\n });\n }\n\n // removes previously attached event listeners\n detachListeners() {\n this.#outInterface.removeAllListeners('line');\n this.#errInterface.removeAllListeners('line');\n if (this.#child) {\n this.#child.removeAllListeners('exit');\n this.#child.removeAllListeners('close');\n this.#child.removeAllListeners('error');\n }\n }\n\n // write a string to the child process\n writeln(line: string) {\n try {\n if (this.#child && !this.#child.exitCode)\n this.#child.stdin.write(line + '\\n');\n } catch (e) {\n // the child probably died... oops!\n }\n }\n\n // forcibly kills the plugin\n async kill() {\n this.#rpc.rejectAllPendingRequests('Plugin Terminated');\n this.detachListeners();\n this.omegga.off('*', this.eventPassthrough);\n if (!this.#child) return;\n\n // create a promise for the exit of the process\n const promise = new Promise(resolve => this.#child.once('exit', resolve));\n\n // kill the process\n this.#child.kill('SIGINT');\n\n // ...kill it again just to make sure it's dead\n spawn('kill', ['-9', this.#child.pid + '']);\n\n // wait for the process to exit\n await promise;\n this.#child = undefined;\n this.emitStatus();\n }\n\n eventPassthrough(type: string, ...args: any[]) {\n if (!this.#child) return;\n this.notify(type, args);\n }\n\n // setup the JSONRPC communication\n initRPC() {\n const server = new JSONRPCServer();\n const client = new JSONRPCClient(req => {\n try {\n this.writeln(JSON.stringify(req));\n return Promise.resolve();\n } catch (error) {\n return Promise.reject(error);\n }\n });\n const rpc = (this.#rpc = new JSONRPCServerAndClient(server, client));\n\n // plugin log generator function\n const ezLog =\n (\n logFn: 'log' | 'error' | 'info' | 'debug' | 'warn' | 'trace',\n name: string,\n symbol: string,\n ) =>\n (line: any) =>\n console[logFn](name.underline, symbol, line);\n\n const name = this.getName();\n\n // server can output logs special formatting for stdout\n rpc.addMethod('log', ezLog('log', name, '>>'.green));\n rpc.addMethod('error', ezLog('error', name.brightRed, '!>'.red));\n rpc.addMethod('info', ezLog('info', name, '#>'.blue));\n rpc.addMethod('debug', ezLog('debug', name, '?>'.blue));\n rpc.addMethod('warn', ezLog('warn', name.brightYellow, ':>'.yellow));\n rpc.addMethod('trace', ezLog('trace', name, 'T>'.grey));\n\n // plugin store interactions\n rpc.addMethod('store.get', key =>\n this.storage.get(key as unknown as string),\n );\n rpc.addMethod('store.set', ([key, value]: [key: string, value: any]) =>\n this.storage.set(key, value),\n );\n rpc.addMethod('store.delete', key =>\n this.storage.delete(key as unknown as string),\n );\n rpc.addMethod('store.wipe', () => this.storage.wipe());\n rpc.addMethod('store.count', () => this.storage.count());\n rpc.addMethod('store.keys', () => this.storage.keys());\n\n // server can run console commands\n rpc.addMethod('exec', line =>\n this.omegga.writeln(line as unknown as string),\n );\n rpc.addMethod('writeln', line =>\n this.omegga.writeln(line as unknown as string),\n );\n rpc.addMethod('broadcast', line =>\n this.omegga.broadcast(line as unknown as string),\n );\n rpc.addMethod(\n 'whisper',\n ({ target, line }: { target: string; line: string }) =>\n this.omegga.whisper(target, line),\n );\n rpc.addMethod(\n 'middlePrint',\n ({ target, line }: { target: string; line: string }) =>\n this.omegga.middlePrint(target, line),\n );\n rpc.addMethod('getPlayers', () => this.omegga.getPlayers());\n rpc.addMethod('getPlayerPosition', name =>\n this.omegga.getPlayer(name as unknown as string)?.getPosition(),\n ); // included for compatibility\n rpc.addMethod('getAllPlayerPositions', () =>\n this.omegga.getAllPlayerPositions(),\n );\n rpc.addMethod('getEnvironmentPresets', () =>\n this.omegga.getEnvironmentPresets(),\n );\n rpc.addMethod('resetEnvironment', () => this.omegga.resetEnvironment());\n rpc.addMethod('saveEnvironment', name =>\n this.omegga.saveEnvironment(name as unknown as string),\n );\n rpc.addMethod('loadEnvironment', name =>\n this.omegga.loadEnvironment(name as unknown as string),\n );\n rpc.addMethod('loadEnvironmentData', data =>\n this.omegga.loadEnvironmentData(data as EnvironmentPreset),\n );\n rpc.addMethod('getServerStatus', () => this.omegga.getServerStatus());\n rpc.addMethod('getMinigames', () => this.omegga.getMinigames());\n rpc.addMethod('getMinigamePresets', () => this.omegga.getMinigamePresets());\n rpc.addMethod(\n 'saveMinigame',\n ({ index, name }: { index: number; name: string }) =>\n this.omegga.saveMinigame(index, name),\n );\n rpc.addMethod(\n 'loadMinigame',\n ({ name, owner }: { name: string; owner: string }) =>\n this.omegga.loadMinigame(name, owner),\n );\n rpc.addMethod('nextRoundMinigame', index =>\n this.omegga.nextRoundMinigame(index as unknown as number),\n );\n rpc.addMethod('resetMinigame', index =>\n this.omegga.resetMinigame(index as unknown as number),\n );\n rpc.addMethod('deleteMinigame', index =>\n this.omegga.deleteMinigame(index as unknown as number),\n );\n rpc.addMethod('listMinigames', () => this.omegga.listMinigames());\n rpc.addMethod('getHostId', () => this.omegga.getHostId());\n rpc.addMethod('getRoleSetup', () => this.omegga.getRoleSetup());\n rpc.addMethod('getBanList', () => this.omegga.getBanList());\n rpc.addMethod('getSaves', () => this.omegga.getSaves());\n rpc.addMethod('getSavePath', name =>\n this.omegga.getSavePath(name as unknown as string),\n );\n rpc.addMethod('getPrefabs', () => this.omegga.getPrefabs());\n rpc.addMethod(\n 'loadPrefab',\n ({\n path,\n ...options\n }: {\n path: string;\n offX?: number;\n offY?: number;\n offZ?: number;\n atOriginalPosition?: boolean;\n orientation?: number;\n rootEntityPersistentIndex?: number;\n mirrorAxes?: number;\n overrideUserId?: string;\n }) => this.omegga.loadPrefab(path, options),\n );\n rpc.addMethod(\n 'savePrefab',\n ({\n path,\n ...options\n }: {\n path: string;\n region?: {\n center: [number, number, number];\n extent: [number, number, number];\n };\n entities?: boolean;\n rootEntityPersistentIndex?: number;\n userId?: string;\n }) => this.omegga.savePrefab(path, options),\n );\n rpc.addMethod(\n 'savePrefabAsync',\n ({\n path,\n ...options\n }: {\n path: string;\n region?: {\n center: [number, number, number];\n extent: [number, number, number];\n };\n entities?: boolean;\n rootEntityPersistentIndex?: number;\n userId?: string;\n }) => this.omegga.savePrefabAsync(path, options),\n );\n rpc.addMethod(\n 'givePrefabToPlayer',\n ({\n path,\n player,\n preserveOwnership = false,\n }: {\n path: string;\n player: string;\n preserveOwnership?: boolean;\n }) => this.omegga.givePrefabToPlayer(path, player, { preserveOwnership }),\n );\n rpc.addMethod(\n 'loadPrefabOnPlayer',\n ({\n path,\n player,\n preserveOwnership = false,\n }: {\n path: string;\n player: string;\n preserveOwnership?: boolean;\n }) => this.omegga.loadPrefabOnPlayer(path, player, { preserveOwnership }),\n );\n rpc.addMethod(\n 'clearBricks',\n ({ target, quiet = false }: { target: string; quiet?: boolean }) =>\n this.omegga.clearBricks(target, quiet),\n );\n rpc.addMethod('clearAllBricks', quiet =>\n this.omegga.clearAllBricks(quiet as unknown as boolean),\n );\n rpc.addMethod('saveBricks', name =>\n this.omegga.saveBricks(name as unknown as string),\n );\n rpc.addMethod(\n 'loadBricks',\n ({\n name,\n offX = 0,\n offY = 0,\n offZ = 0,\n quiet = false,\n }: {\n name: string;\n offX?: number;\n offY?: number;\n offZ?: number;\n quiet?: boolean;\n }) => this.omegga.loadBricks(name, { offX, offY, offZ, quiet }),\n );\n rpc.addMethod(\n 'loadBricksOnPlayer',\n ({\n name,\n player,\n offX = 0,\n offY = 0,\n offZ = 0,\n }: {\n name: string;\n player: string;\n offX?: number;\n offY?: number;\n offZ?: number;\n quiet?: boolean;\n }) => this.omegga.loadBricksOnPlayer(name, player, { offX, offY, offZ }),\n );\n rpc.addMethod('readSaveData', name =>\n this.omegga.readSaveData(name as unknown as string),\n );\n rpc.addMethod('getSaveData', () => this.omegga.getSaveData());\n rpc.addMethod(\n 'loadSaveData',\n ({\n data,\n offX = 0,\n offY = 0,\n offZ = 0,\n quiet = false,\n }: {\n data: WriteSaveObject;\n offX?: number;\n offY?: number;\n offZ?: number;\n quiet?: boolean;\n }) => this.omegga.loadSaveData(data, { offX, offY, offZ, quiet }),\n );\n rpc.addMethod(\n 'loadSaveDataOnPlayer',\n ({\n data,\n player,\n offX = 0,\n offY = 0,\n offZ = 0,\n }: {\n data: WriteSaveObject;\n player: string;\n offX?: number;\n offY?: number;\n offZ?: number;\n quiet?: boolean;\n }) =>\n this.omegga.loadSaveDataOnPlayer(data, player, { offX, offY, offZ }),\n );\n rpc.addMethod('changeMap', map =>\n this.omegga.changeMap(map as unknown as string),\n );\n rpc.addMethod('unload', () => this.unload());\n rpc.addMethod('reload', async () => {\n await this.unload();\n await this.load();\n });\n\n // player related operations\n const addPlayerMethod = (name: string) =>\n rpc.addMethod(`player.${name}`, player =>\n (this.omegga.getPlayer(player as unknown as string) as any)?.[name](),\n );\n rpc.addMethod('player.get', target => {\n let player = this.omegga.getPlayer(target as unknown as string);\n return player && { ...player, host: player.isHost() };\n });\n addPlayerMethod('getRoles');\n addPlayerMethod('getPermissions');\n addPlayerMethod('getNameColor');\n addPlayerMethod('getPosition');\n addPlayerMethod('getPawn');\n addPlayerMethod('getGhostBrick');\n addPlayerMethod('getPaint');\n addPlayerMethod('isCrouched');\n addPlayerMethod('isDead');\n addPlayerMethod('getTemplateBounds');\n addPlayerMethod('getTemplateBoundsData');\n addPlayerMethod('kill');\n addPlayerMethod('getScore');\n addPlayerMethod('getLeaderboard');\n rpc.addMethod(\n 'player.loadDataAtGhostBrick',\n ({\n target,\n data,\n rotate = true,\n offX = 0,\n offY = 0,\n offZ = 0,\n quiet = false,\n }: {\n target: string;\n data: WriteSaveObject;\n rotate?: boolean;\n offX?: number;\n offY?: number;\n offZ?: number;\n quiet?: boolean;\n }) =>\n this.omegga\n .getPlayer(target)\n ?.loadDataAtGhostBrick(data, { rotate, offX, offY, offZ, quiet }),\n );\n rpc.addMethod(\n 'player.loadSaveData',\n ({\n target,\n data,\n offX = 0,\n offY = 0,\n offZ = 0,\n }: {\n target: string;\n data: WriteSaveObject;\n offX?: number;\n offY?: number;\n offZ?: number;\n }) =>\n this.omegga.getPlayer(target)?.loadSaveData(data, { offX, offY, offZ }),\n );\n rpc.addMethod(\n 'player.clearBricks',\n ({ target, quiet = false }: { target: string; quiet?: boolean }) =>\n this.omegga.getPlayer(target)?.clearBricks(quiet),\n );\n rpc.addMethod(\n 'player.loadBricks',\n ({ target, saveName }: { target: string; saveName: string }) =>\n this.omegga.getPlayer(target)?.loadBricks(saveName),\n );\n rpc.addMethod(\n 'player.damage',\n ({ target, amount }: { target: string; amount: number }) =>\n this.omegga.getPlayer(target)?.damage(amount),\n );\n rpc.addMethod(\n 'player.heal',\n ({ target, amount }: { target: string; amount: number }) =>\n this.omegga.getPlayer(target)?.heal(amount),\n );\n rpc.addMethod(\n 'player.giveItem',\n ({ target, item }: { target: string; item: string }) =>\n this.omegga.getPlayer(target)?.giveItem(item as any),\n );\n rpc.addMethod(\n 'player.takeItem',\n ({ target, item }: { target: string; item: string }) =>\n this.omegga.getPlayer(target)?.takeItem(item as any),\n );\n rpc.addMethod(\n 'player.setTeam',\n ({ target, teamIndex }: { target: string; teamIndex: number }) =>\n this.omegga.getPlayer(target)?.setTeam(teamIndex),\n );\n rpc.addMethod(\n 'player.setMinigame',\n ({ target, index }: { target: string; index: number }) =>\n this.omegga.getPlayer(target)?.setMinigame(index),\n );\n rpc.addMethod(\n 'player.setScore',\n ({\n target,\n minigameIndex,\n score,\n }: {\n target: string;\n minigameIndex: number;\n score: number;\n }) => this.omegga.getPlayer(target)?.setScore(minigameIndex, score),\n );\n rpc.addMethod(\n 'player.setLeaderboard',\n ({\n target,\n key,\n value,\n }: {\n target: string;\n key: string;\n value: number;\n }) => this.omegga.getPlayer(target)?.setLeaderboard(key, value),\n );\n\n // plugin related operations\n rpc.addMethod('plugin.get', async name => {\n const plugin = this.omegga.pluginLoader.plugins.find(\n p => p.getName() === (name as unknown as string),\n );\n\n if (plugin) {\n return {\n name,\n documentation: plugin.getDocumentation(),\n loaded: plugin.isLoaded(),\n };\n } else {\n return null;\n }\n });\n\n rpc.addMethod(\n 'plugin.emit',\n async ([name, event, ...args]: [string, string, ...any[]]) => {\n const plugin = this.omegga.pluginLoader.plugins.find(\n p => p.getName() === name,\n );\n\n if (plugin) {\n return plugin.emitPlugin(event, this.getName(), args);\n } else {\n return null;\n }\n },\n );\n }\n\n // emit a custom plugin event\n async emitPlugin(event: string, from: string, args: any[]) {\n return await this.emit('plugin:emit', [event, from, ...args]);\n }\n\n // emit a message to the plugin via the jsonrpc client and expect a response\n emit(type: string, arg?: any) {\n return this.#rpc.request(type, arg);\n }\n\n // emit a message to the plugin via the jsonrpc client, don't expect a response\n notify(type: string, arg?: any) {\n try {\n this.#rpc.notify(type, arg);\n } catch (e) {\n // this only happens if the RPC library is hitting some issues - probably redundant\n }\n }\n}\n"],"names":["Plugin","Logger","spawn","bootstrap","JSONRPCServer","JSONRPCClient","JSONRPCServerAndClient","name","path"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin_jsonrpc_stdio.js","sources":["../../../src/omegga/plugin/plugin_jsonrpc_stdio.ts"],"sourcesContent":["import Logger from '@/logger';\nimport { EnvironmentPreset } from '@brickadia/presets';\nimport Omegga from '@omegga/server';\nimport { WriteSaveObject } from 'brs-js';\nimport {\n JSONRPCClient,\n JSONRPCServer,\n JSONRPCServerAndClient,\n} from 'json-rpc-2.0';\nimport { ChildProcessWithoutNullStreams, spawn } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport readline from 'readline';\nimport { Plugin } from './interface';\nimport { bootstrap } from './plugin_node_safe/proxyOmegga';\n\n// TODO: check if version is compatible (v1 -> v2) from file\n// TODO: write jsonrpc wrappers in a few languages, implement a few simple plugins\n// TODO: languages: [ python, go ]\n\nconst MAIN_FILE = 'omegga_plugin';\nconst DOC_FILE = 'doc.json';\nconst PLUGIN_FILE = 'plugin.json';\n\nexport default class RpcPlugin extends Plugin {\n #child: ChildProcessWithoutNullStreams;\n #rpc: JSONRPCServerAndClient;\n #errInterface: readline.Interface;\n #outInterface: readline.Interface;\n\n messageCounter: number;\n\n // all RPC plugins require a main (binary) file and a doc file\n static canLoad(pluginPath: string) {\n return (\n fs.existsSync(path.join(pluginPath, MAIN_FILE)) &&\n fs.existsSync(path.join(pluginPath, DOC_FILE))\n );\n }\n\n // websocket rpc plugin type\n static getFormat() {\n return 'jsonrpc_stdio';\n }\n\n // documentation is based on doc.json file\n getDocumentation() {\n return this.documentation;\n }\n constructor(pluginPath: string, omegga: Omegga) {\n super(pluginPath, omegga);\n\n this.messageCounter = 0;\n\n // TODO: validate documentation\n this.documentation = Plugin.readJSON(path.join(pluginPath, DOC_FILE));\n this.pluginConfig = Plugin.readJSON(path.join(pluginPath, PLUGIN_FILE));\n this.pluginFile = path.join(pluginPath, MAIN_FILE);\n\n this.eventPassthrough = this.eventPassthrough.bind(this);\n this.commands = [];\n\n this.initRPC();\n }\n\n isLoaded() {\n return !!this.#child && !this.#child.exitCode;\n }\n\n // determing if a command is registered\n isCommand(cmd: string) {\n return this.commands.includes(cmd);\n }\n\n // spawn the plugin as a child process\n async load() {\n const name = this.getName();\n const verbose = (...msg: any[]) => Logger.verbose(name.underline, ...msg);\n verbose('Load method invoked');\n let frozen = true,\n timed = false;\n this.commands = [];\n\n // can't load the plugin if the child is still running\n if (this.#child) {\n verbose('Plugin already has child process');\n return false;\n }\n\n let config;\n try {\n verbose('Getting plugin config');\n config = await this.storage.getConfig();\n } catch (e) {\n return false;\n }\n\n try {\n if (this.pluginConfig?.emitConfig) {\n verbose('Emitting plugin config');\n await fs.promises.writeFile(\n path.join(this.path, this.pluginConfig.emitConfig),\n JSON.stringify(config),\n );\n }\n verbose('Spawning child process');\n this.#child = spawn(this.pluginFile);\n this.#child.stdin.setDefaultEncoding('utf8');\n this.#outInterface = readline.createInterface({\n input: this.#child.stdout,\n terminal: false,\n });\n this.#errInterface = readline.createInterface({\n input: this.#child.stderr,\n terminal: false,\n });\n this.attachListeners();\n } catch (err) {\n Logger.errorp(\n 'error loading stdio rpc plugin',\n name.brightRed.underline,\n err,\n );\n await this.kill();\n this.emitStatus();\n return false;\n }\n\n return Promise.race([\n (async () => {\n try {\n // get some initial information to create an omegga proxy\n const initialData = bootstrap(this.omegga);\n\n verbose('Sending initial data');\n // send all of the mock events to the proxy omegga\n for (const ev in initialData) {\n // send some initial information\n this.notify(ev, initialData[ev]);\n }\n\n verbose('Initializing event passthrough');\n // pass events through\n this.omegga.on('*', this.eventPassthrough);\n\n try {\n // tell the plugin to start\n verbose('Waiting for plugin to start...');\n const result = await this.emit('init', config);\n\n verbose('Initialized with result:', result);\n // plugins can return a result object\n if (typeof result === 'object' && result) {\n // if registeredCommands is in the results, register the provided strings as commands\n const cmds = result.registeredCommands;\n if (\n cmds &&\n cmds instanceof Array &&\n cmds.every(i => typeof i === 'string')\n )\n this.commands = cmds;\n }\n } catch (e) {\n if (!e.message) return;\n Logger.errorp(name.brightRed.underline, 'error starting: ', e);\n }\n\n // plugin is not frozen, resolve that it has loaded\n frozen = false;\n if (timed) return;\n this.emitStatus();\n return true;\n } catch (e) {\n if (timed) return;\n Logger.errorp(\n 'error loading stdio rpc plugin',\n name.brightRed.underline,\n e,\n );\n await this.kill();\n frozen = false;\n this.emitStatus();\n return false;\n }\n })(),\n new Promise<boolean>(resolve => {\n // let user know if the child quit while launching\n this.#child.once('exit', () => {\n if (!frozen || timed) return;\n verbose('Plugin exited during init');\n frozen = false;\n this.emitStatus();\n resolve(false);\n });\n\n // check if the child is frozen (while true)\n setTimeout(() => {\n if (!frozen) return;\n Logger.errorp(\n 'I appear to be unresponsive when starting (maybe I forgot to respond to init)',\n name.brightRed.underline,\n );\n this.kill();\n timed = true;\n this.emitStatus();\n resolve(false);\n }, 5000);\n }),\n ]);\n }\n\n // kill the child process after requesting it to stop\n unload() {\n if (!this.#child || this.#child.exitCode) {\n this.detachListeners();\n this.emitStatus();\n return Promise.resolve(true);\n }\n let frozen = true,\n timed = false;\n const name = this.getName();\n\n return Promise.race([\n (async (): Promise<boolean> => {\n try {\n // let the plugin know it's time to stop, if this error it's probably because the method was not implemented\n try {\n await this.emit('stop');\n } catch (e) {\n // lazy developer - just implement stop please\n }\n\n await this.kill();\n\n frozen = false;\n if (timed) return;\n this.emitStatus();\n this.commands = [];\n return true;\n } catch (e) {\n if (timed) return;\n Logger.errorp(\n 'error unloading rpc plugin',\n name.brightRed.underline,\n e,\n );\n frozen = false;\n this.emitStatus();\n return false;\n }\n })(),\n // this is wrapped in a promise for the freeze check\n new Promise<boolean>(resolve => {\n // check if the child is frozen (while true)\n setTimeout(() => {\n if (!frozen) return;\n Logger.errorp(\n 'I appear to be unresponsive when stopping (maybe I forgot to respond to stop)',\n name.brightRed.underline,\n );\n this.kill();\n timed = true;\n this.emitStatus();\n resolve(true);\n }, 5000);\n }),\n ]);\n }\n\n // attaches event listeners\n attachListeners() {\n const name = this.getName();\n\n this.#outInterface.on('line', line => {\n try {\n const rpcData = JSON.parse(line);\n try {\n this.#rpc.receiveAndSend(rpcData);\n } catch (e) {\n Logger.error(\n this.getName().brightRed.underline,\n '!>'.red,\n 'error parsing rpc data',\n e,\n line,\n );\n }\n } catch {\n // fallback to logging\n Logger.log(name.underline, '>>'.green, line);\n }\n });\n\n // stderr - print out the errors\n this.#errInterface.on('line', err => {\n Logger.error(name.brightRed.underline, '!>'.red, err);\n });\n\n this.#child.on('error', () => this.kill());\n this.#child.on('close', () => this.kill());\n this.#child.on('exit', code => {\n Logger.errorp(\n '!>'.red,\n 'rpc plugin',\n name.brightRed.underline,\n 'exited with code',\n code,\n );\n this.kill();\n });\n }\n\n // removes previously attached event listeners\n detachListeners() {\n this.#outInterface.removeAllListeners('line');\n this.#errInterface.removeAllListeners('line');\n if (this.#child) {\n this.#child.removeAllListeners('exit');\n this.#child.removeAllListeners('close');\n this.#child.removeAllListeners('error');\n }\n }\n\n // write a string to the child process\n writeln(line: string) {\n try {\n if (this.#child && !this.#child.exitCode)\n this.#child.stdin.write(line + '\\n');\n } catch (e) {\n // the child probably died... oops!\n }\n }\n\n // forcibly kills the plugin\n async kill() {\n this.#rpc.rejectAllPendingRequests('Plugin Terminated');\n this.detachListeners();\n this.omegga.off('*', this.eventPassthrough);\n if (!this.#child) return;\n\n // create a promise for the exit of the process\n const promise = new Promise(resolve => this.#child.once('exit', resolve));\n\n // kill the process\n this.#child.kill('SIGINT');\n\n // ...kill it again just to make sure it's dead\n spawn('kill', ['-9', this.#child.pid + '']);\n\n // wait for the process to exit\n await promise;\n this.#child = undefined;\n this.emitStatus();\n }\n\n eventPassthrough(type: string, ...args: any[]) {\n if (!this.#child) return;\n this.notify(type, args);\n }\n\n // setup the JSONRPC communication\n initRPC() {\n const server = new JSONRPCServer();\n const client = new JSONRPCClient(req => {\n try {\n this.writeln(JSON.stringify(req));\n return Promise.resolve();\n } catch (error) {\n return Promise.reject(error);\n }\n });\n const rpc = (this.#rpc = new JSONRPCServerAndClient(server, client));\n\n // plugin log generator function\n const ezLog =\n (\n logFn: 'log' | 'error' | 'info' | 'debug' | 'warn' | 'trace',\n name: string,\n symbol: string,\n ) =>\n (line: any) =>\n console[logFn](name.underline, symbol, line);\n\n const name = this.getName();\n\n // server can output logs special formatting for stdout\n rpc.addMethod('log', ezLog('log', name, '>>'.green));\n rpc.addMethod('error', ezLog('error', name.brightRed, '!>'.red));\n rpc.addMethod('info', ezLog('info', name, '#>'.blue));\n rpc.addMethod('debug', ezLog('debug', name, '?>'.blue));\n rpc.addMethod('warn', ezLog('warn', name.brightYellow, ':>'.yellow));\n rpc.addMethod('trace', ezLog('trace', name, 'T>'.grey));\n\n // plugin store interactions\n rpc.addMethod('store.get', key =>\n this.storage.get(key as unknown as string),\n );\n rpc.addMethod('store.set', ([key, value]: [key: string, value: any]) =>\n this.storage.set(key, value),\n );\n rpc.addMethod('store.delete', key =>\n this.storage.delete(key as unknown as string),\n );\n rpc.addMethod('store.wipe', () => this.storage.wipe());\n rpc.addMethod('store.count', () => this.storage.count());\n rpc.addMethod('store.keys', () => this.storage.keys());\n\n // server can run console commands\n rpc.addMethod('exec', line =>\n this.omegga.writeln(line as unknown as string),\n );\n rpc.addMethod('writeln', line =>\n this.omegga.writeln(line as unknown as string),\n );\n rpc.addMethod('broadcast', line =>\n this.omegga.broadcast(line as unknown as string),\n );\n rpc.addMethod(\n 'whisper',\n ({ target, line }: { target: string; line: string }) =>\n this.omegga.whisper(target, line),\n );\n rpc.addMethod(\n 'middlePrint',\n ({ target, line }: { target: string; line: string }) =>\n this.omegga.middlePrint(target, line),\n );\n rpc.addMethod('getPlayers', () => this.omegga.getPlayers());\n rpc.addMethod('getPlayerPosition', name =>\n this.omegga.getPlayer(name as unknown as string)?.getPosition(),\n ); // included for compatibility\n rpc.addMethod('getAllPlayerPositions', () =>\n this.omegga.getAllPlayerPositions(),\n );\n rpc.addMethod('getEnvironmentPresets', () =>\n this.omegga.getEnvironmentPresets(),\n );\n rpc.addMethod('resetEnvironment', () => this.omegga.resetEnvironment());\n rpc.addMethod('saveEnvironment', name =>\n this.omegga.saveEnvironment(name as unknown as string),\n );\n rpc.addMethod('loadEnvironment', name =>\n this.omegga.loadEnvironment(name as unknown as string),\n );\n rpc.addMethod('loadEnvironmentData', data =>\n this.omegga.loadEnvironmentData(data as EnvironmentPreset),\n );\n rpc.addMethod('getServerStatus', () => this.omegga.getServerStatus());\n rpc.addMethod('getMinigames', () => this.omegga.getMinigames());\n rpc.addMethod('getMinigamePresets', () => this.omegga.getMinigamePresets());\n rpc.addMethod(\n 'saveMinigame',\n ({ index, name }: { index: number; name: string }) =>\n this.omegga.saveMinigame(index, name),\n );\n rpc.addMethod(\n 'loadMinigame',\n ({ name, owner }: { name: string; owner: string }) =>\n this.omegga.loadMinigame(name, owner),\n );\n rpc.addMethod('nextRoundMinigame', index =>\n this.omegga.nextRoundMinigame(index as unknown as number),\n );\n rpc.addMethod('resetMinigame', index =>\n this.omegga.resetMinigame(index as unknown as number),\n );\n rpc.addMethod('deleteMinigame', index =>\n this.omegga.deleteMinigame(index as unknown as number),\n );\n rpc.addMethod('listMinigames', () => this.omegga.listMinigames());\n rpc.addMethod('getHostId', () => this.omegga.getHostId());\n rpc.addMethod('getRoleSetup', () => this.omegga.getRoleSetup());\n rpc.addMethod('getBanList', () => this.omegga.getBanList());\n rpc.addMethod('getSaves', () => this.omegga.getSaves());\n rpc.addMethod('getSavePath', name =>\n this.omegga.getSavePath(name as unknown as string),\n );\n rpc.addMethod('getPrefabs', () => this.omegga.getPrefabs());\n rpc.addMethod('getPrefabPath', name =>\n this.omegga.getPrefabPath(name as unknown as string),\n );\n rpc.addMethod(\n 'loadPrefab',\n ({\n path,\n ...options\n }: {\n path: string;\n offX?: number;\n offY?: number;\n offZ?: number;\n atOriginalPosition?: boolean;\n orientation?: number;\n rootEntityPersistentIndex?: number;\n mirrorAxes?: number;\n overrideUserId?: string;\n }) => this.omegga.loadPrefab(path, options),\n );\n rpc.addMethod(\n 'savePrefab',\n ({\n path,\n ...options\n }: {\n path: string;\n region?: {\n center: [number, number, number];\n extent: [number, number, number];\n };\n entities?: boolean;\n rootEntityPersistentIndex?: number;\n userId?: string;\n }) => this.omegga.savePrefab(path, options),\n );\n rpc.addMethod(\n 'savePrefabAsync',\n ({\n path,\n ...options\n }: {\n path: string;\n region?: {\n center: [number, number, number];\n extent: [number, number, number];\n };\n entities?: boolean;\n rootEntityPersistentIndex?: number;\n userId?: string;\n }) => this.omegga.savePrefabAsync(path, options),\n );\n rpc.addMethod(\n 'givePrefabToPlayer',\n ({\n path,\n player,\n preserveOwnership = false,\n }: {\n path: string;\n player: string;\n preserveOwnership?: boolean;\n }) => this.omegga.givePrefabToPlayer(path, player, { preserveOwnership }),\n );\n rpc.addMethod(\n 'loadPrefabOnPlayer',\n ({\n path,\n player,\n preserveOwnership = false,\n }: {\n path: string;\n player: string;\n preserveOwnership?: boolean;\n }) => this.omegga.loadPrefabOnPlayer(path, player, { preserveOwnership }),\n );\n rpc.addMethod(\n 'clearBricks',\n ({ target, quiet = false }: { target: string; quiet?: boolean }) =>\n this.omegga.clearBricks(target, quiet),\n );\n rpc.addMethod('clearAllBricks', quiet =>\n this.omegga.clearAllBricks(quiet as unknown as boolean),\n );\n rpc.addMethod('saveBricks', name =>\n this.omegga.saveBricks(name as unknown as string),\n );\n rpc.addMethod(\n 'loadBricks',\n ({\n name,\n offX = 0,\n offY = 0,\n offZ = 0,\n quiet = false,\n }: {\n name: string;\n offX?: number;\n offY?: number;\n offZ?: number;\n quiet?: boolean;\n }) => this.omegga.loadBricks(name, { offX, offY, offZ, quiet }),\n );\n rpc.addMethod(\n 'loadBricksOnPlayer',\n ({\n name,\n player,\n offX = 0,\n offY = 0,\n offZ = 0,\n }: {\n name: string;\n player: string;\n offX?: number;\n offY?: number;\n offZ?: number;\n quiet?: boolean;\n }) => this.omegga.loadBricksOnPlayer(name, player, { offX, offY, offZ }),\n );\n rpc.addMethod('readSaveData', name =>\n this.omegga.readSaveData(name as unknown as string),\n );\n rpc.addMethod('getSaveData', () => this.omegga.getSaveData());\n rpc.addMethod(\n 'loadSaveData',\n ({\n data,\n offX = 0,\n offY = 0,\n offZ = 0,\n quiet = false,\n }: {\n data: WriteSaveObject;\n offX?: number;\n offY?: number;\n offZ?: number;\n quiet?: boolean;\n }) => this.omegga.loadSaveData(data, { offX, offY, offZ, quiet }),\n );\n rpc.addMethod(\n 'loadSaveDataOnPlayer',\n ({\n data,\n player,\n offX = 0,\n offY = 0,\n offZ = 0,\n }: {\n data: WriteSaveObject;\n player: string;\n offX?: number;\n offY?: number;\n offZ?: number;\n quiet?: boolean;\n }) =>\n this.omegga.loadSaveDataOnPlayer(data, player, { offX, offY, offZ }),\n );\n rpc.addMethod('changeMap', map =>\n this.omegga.changeMap(map as unknown as string),\n );\n rpc.addMethod('unload', () => this.unload());\n rpc.addMethod('reload', async () => {\n await this.unload();\n await this.load();\n });\n\n // player related operations\n const addPlayerMethod = (name: string) =>\n rpc.addMethod(`player.${name}`, player =>\n (this.omegga.getPlayer(player as unknown as string) as any)?.[name](),\n );\n rpc.addMethod('player.get', target => {\n let player = this.omegga.getPlayer(target as unknown as string);\n return player && { ...player, host: player.isHost() };\n });\n addPlayerMethod('getRoles');\n addPlayerMethod('getPermissions');\n addPlayerMethod('getNameColor');\n addPlayerMethod('getPosition');\n addPlayerMethod('getPawn');\n addPlayerMethod('getGhostBrick');\n addPlayerMethod('getPaint');\n addPlayerMethod('isCrouched');\n addPlayerMethod('isDead');\n addPlayerMethod('getTemplateBounds');\n addPlayerMethod('getTemplateBoundsData');\n addPlayerMethod('kill');\n addPlayerMethod('getScore');\n addPlayerMethod('getLeaderboard');\n rpc.addMethod(\n 'player.loadDataAtGhostBrick',\n ({\n target,\n data,\n rotate = true,\n offX = 0,\n offY = 0,\n offZ = 0,\n quiet = false,\n }: {\n target: string;\n data: WriteSaveObject;\n rotate?: boolean;\n offX?: number;\n offY?: number;\n offZ?: number;\n quiet?: boolean;\n }) =>\n this.omegga\n .getPlayer(target)\n ?.loadDataAtGhostBrick(data, { rotate, offX, offY, offZ, quiet }),\n );\n rpc.addMethod(\n 'player.loadSaveData',\n ({\n target,\n data,\n offX = 0,\n offY = 0,\n offZ = 0,\n }: {\n target: string;\n data: WriteSaveObject;\n offX?: number;\n offY?: number;\n offZ?: number;\n }) =>\n this.omegga.getPlayer(target)?.loadSaveData(data, { offX, offY, offZ }),\n );\n rpc.addMethod(\n 'player.clearBricks',\n ({ target, quiet = false }: { target: string; quiet?: boolean }) =>\n this.omegga.getPlayer(target)?.clearBricks(quiet),\n );\n rpc.addMethod(\n 'player.loadBricks',\n ({ target, saveName }: { target: string; saveName: string }) =>\n this.omegga.getPlayer(target)?.loadBricks(saveName),\n );\n rpc.addMethod(\n 'player.damage',\n ({ target, amount }: { target: string; amount: number }) =>\n this.omegga.getPlayer(target)?.damage(amount),\n );\n rpc.addMethod(\n 'player.heal',\n ({ target, amount }: { target: string; amount: number }) =>\n this.omegga.getPlayer(target)?.heal(amount),\n );\n rpc.addMethod(\n 'player.giveItem',\n ({ target, item }: { target: string; item: string }) =>\n this.omegga.getPlayer(target)?.giveItem(item as any),\n );\n rpc.addMethod(\n 'player.takeItem',\n ({ target, item }: { target: string; item: string }) =>\n this.omegga.getPlayer(target)?.takeItem(item as any),\n );\n rpc.addMethod(\n 'player.setTeam',\n ({ target, teamIndex }: { target: string; teamIndex: number }) =>\n this.omegga.getPlayer(target)?.setTeam(teamIndex),\n );\n rpc.addMethod(\n 'player.setMinigame',\n ({ target, index }: { target: string; index: number }) =>\n this.omegga.getPlayer(target)?.setMinigame(index),\n );\n rpc.addMethod(\n 'player.setScore',\n ({\n target,\n minigameIndex,\n score,\n }: {\n target: string;\n minigameIndex: number;\n score: number;\n }) => this.omegga.getPlayer(target)?.setScore(minigameIndex, score),\n );\n rpc.addMethod(\n 'player.setLeaderboard',\n ({\n target,\n key,\n value,\n }: {\n target: string;\n key: string;\n value: number;\n }) => this.omegga.getPlayer(target)?.setLeaderboard(key, value),\n );\n\n // plugin related operations\n rpc.addMethod('plugin.get', async name => {\n const plugin = this.omegga.pluginLoader.plugins.find(\n p => p.getName() === (name as unknown as string),\n );\n\n if (plugin) {\n return {\n name,\n documentation: plugin.getDocumentation(),\n loaded: plugin.isLoaded(),\n };\n } else {\n return null;\n }\n });\n\n rpc.addMethod(\n 'plugin.emit',\n async ([name, event, ...args]: [string, string, ...any[]]) => {\n const plugin = this.omegga.pluginLoader.plugins.find(\n p => p.getName() === name,\n );\n\n if (plugin) {\n return plugin.emitPlugin(event, this.getName(), args);\n } else {\n return null;\n }\n },\n );\n }\n\n // emit a custom plugin event\n async emitPlugin(event: string, from: string, args: any[]) {\n return await this.emit('plugin:emit', [event, from, ...args]);\n }\n\n // emit a message to the plugin via the jsonrpc client and expect a response\n emit(type: string, arg?: any) {\n return this.#rpc.request(type, arg);\n }\n\n // emit a message to the plugin via the jsonrpc client, don't expect a response\n notify(type: string, arg?: any) {\n try {\n this.#rpc.notify(type, arg);\n } catch (e) {\n // this only happens if the RPC library is hitting some issues - probably redundant\n }\n }\n}\n"],"names":["Plugin","Logger","spawn","bootstrap","JSONRPCServer","JSONRPCClient","JSONRPCServerAndClient","name","path"],"mappings":"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"}
|
|
@@ -46,6 +46,7 @@ const STEAL_PROTOTYPES = {
|
|
|
46
46
|
getWorldPath: true,
|
|
47
47
|
getWorlds: true,
|
|
48
48
|
getPrefabs: true,
|
|
49
|
+
getPrefabPath: true,
|
|
49
50
|
loadPrefab: true,
|
|
50
51
|
loadPrefabOnPlayer: true,
|
|
51
52
|
savePrefab: true,
|
|
@@ -250,6 +251,9 @@ class ProxyOmegga extends EventEmitter {
|
|
|
250
251
|
getPrefabs() {
|
|
251
252
|
throw badBorrow("getPrefabs");
|
|
252
253
|
}
|
|
254
|
+
getPrefabPath(prefabName) {
|
|
255
|
+
throw badBorrow("getPrefabPath");
|
|
256
|
+
}
|
|
253
257
|
loadPrefab(path, options) {
|
|
254
258
|
throw badBorrow("loadPrefab");
|
|
255
259
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxyOmegga.js","sources":["../../../../src/omegga/plugin/plugin_node_safe/proxyOmegga.ts"],"sourcesContent":["import {\n OmeggaCore,\n OmeggaLike,\n OmeggaPlayer,\n PluginInterop,\n WatcherPattern,\n} from '@/plugin';\nimport { EnvironmentPreset } from '@brickadia/presets';\nimport {\n BRBanList,\n BRPlayerNameCache,\n BRRoleAssignments,\n BRRoleSetup,\n} from '@brickadia/types';\nimport commandInjector from '@omegga/commandInjector';\nimport { ConsoleCommands, resolveConsoleCommands } from '@omegga/commands';\nimport LogWrangler from '@omegga/logWrangler';\nimport Player from '@omegga/player';\nimport Omegga from '@omegga/server';\nimport {\n IGamemode,\n ILogMinigame,\n IMinigameList,\n IPlayerPositions,\n IServerStatus,\n} from '@omegga/types';\nimport { ReadSaveObject, WriteSaveObject } from 'brs-js';\nimport EventEmitter from 'events';\n\n// bootstrap the proxy with initial omegga data\nexport const bootstrap = (omegga: Omegga): Record<string, unknown[]> => ({\n 'plugin:players:raw': [omegga.players.map(p => p.raw())],\n bootstrap: [\n {\n host: Object.freeze({ ...omegga.host }),\n version: omegga.version,\n verbose: omegga.verbose,\n savePath: omegga.savePath,\n worldPath: omegga.worldPath,\n prefabPath: omegga.prefabPath,\n path: omegga.path,\n configPath: omegga.configPath,\n presetPath: omegga.presetPath,\n starting: omegga.starting,\n started: omegga.started,\n stopping: omegga.stopping,\n config: omegga.config,\n currentMap: omegga.currentMap,\n },\n ],\n});\n\n// prototypes that can be directly stolen from omegga\nconst STEAL_PROTOTYPES: Record<keyof Required<OmeggaCore>, true> = {\n broadcast: true,\n whisper: true,\n middlePrint: true,\n getPlayer: true,\n getPlayers: true,\n findPlayerByName: true,\n getHostId: true,\n clearBricks: true,\n clearRegion: true,\n clearAllBricks: true,\n loadBricks: true,\n loadBricksOnPlayer: true,\n saveBricks: true,\n saveBricksAsync: true,\n getSavePath: true,\n getSaves: true,\n getWorldPath: true,\n getWorlds: true,\n getPrefabs: true,\n loadPrefab: true,\n loadPrefabOnPlayer: true,\n savePrefab: true,\n savePrefabAsync: true,\n givePrefabToPlayer: true,\n getWorldRevisions: true,\n loadWorld: true,\n loadWorldRevision: true,\n saveWorldAs: true,\n saveWorld: true,\n createEmptyWorld: true,\n writeSaveData: true,\n readSaveData: true,\n loadSaveData: true,\n loadSaveDataOnPlayer: true,\n getSaveData: true,\n getRoleSetup: true,\n getRoleAssignments: true,\n getBanList: true,\n getNameCache: true,\n changeMap: true,\n saveMinigame: true,\n deleteMinigame: true,\n resetMinigame: true,\n nextRoundMinigame: true,\n loadMinigame: true,\n getMinigamePresets: true,\n resetEnvironment: true,\n saveEnvironment: true,\n readEnvironmentData: true,\n getEnvironmentData: true,\n loadEnvironment: true,\n loadEnvironmentData: true,\n getEnvironmentPresets: true,\n};\n\nconst badBorrow = (name: string) =>\n new Error(`Method \"${name}\" not properly borrowed.`);\n\n// this is a \"soft\" omegga\n// it is built to mimic the core omegga\n// it does not provide direct write access to\nexport class ProxyOmegga extends EventEmitter implements OmeggaLike {\n _tempCounter = { save: 0, environment: 0 };\n _tempSavePrefix = 'omegga_plugin_temp_';\n\n writeln: (line: string) => void;\n version: number;\n players: Player[];\n\n /** memoized version-resolved console commands ({@link Console}) */\n #console: { version: number; commands: ConsoleCommands };\n\n /** version-resolved Brickadia console command names, nested by namespace */\n get Console(): ConsoleCommands {\n if (this.#console?.version !== this.version)\n this.#console = {\n version: this.version,\n commands: resolveConsoleCommands(this.version),\n };\n return this.#console.commands;\n }\n\n host: { id: string; name: string };\n\n verbose: boolean;\n\n started: boolean;\n starting: boolean;\n stopping: boolean;\n currentMap: string;\n\n path: string;\n configPath: string;\n savePath: string;\n worldPath: string;\n prefabPath: string;\n presetPath: string;\n\n logWrangler: LogWrangler;\n\n getPlugin: (name: string) => Promise<PluginInterop>;\n\n constructor(exec: (line: string) => void) {\n super();\n this.setMaxListeners(Infinity);\n\n this.writeln = exec;\n\n this.version = -1;\n\n this.players = [];\n\n // log wrangler wrangles logs... it reads brickadia logs and clumps them together\n this.logWrangler = new LogWrangler(this as unknown as Omegga);\n this.on('line', this.logWrangler.callback);\n this.addMatcher = this.logWrangler.addMatcher;\n this.addWatcher = this.logWrangler.addWatcher;\n this.watchLogArray = this.logWrangler.watchLogArray;\n this.watchLogChunk = this.logWrangler.watchLogChunk;\n\n // inject commands\n commandInjector(this, this.logWrangler);\n\n // blanket apply fields\n this.once('bootstrap', data => {\n for (const key in data) {\n (this as any)[key] = data[key];\n }\n });\n\n // data synchronization\n this.on('host', host => (this.host = host));\n this.on('version', version => (this.version = version));\n\n // create players from raw constructor data\n this.on(\n 'plugin:players:raw',\n (players: [string, string, string, string, string][]) =>\n (this.players = players.map(p => new Player(this as OmeggaLike, ...p))),\n );\n\n this.on('start', ({ map }) => {\n this.started = true;\n this.starting = false;\n this.currentMap = map;\n });\n this.on('exit', () => {\n this.started = false;\n this.starting = false;\n });\n this.on('mapchange', ({ map }) => {\n this.currentMap = map;\n });\n }\n addMatcher<T>(\n pattern: RegExp | ((line: string, match: RegExpMatchArray) => T),\n callback:\n | ((match: RegExpMatchArray) => boolean)\n | ((match: RegExpMatchArray) => T),\n ): void {\n throw badBorrow('addMatcher');\n }\n addWatcher<T = RegExpMatchArray>(\n pattern: RegExp | WatcherPattern<T>,\n options?: {\n timeoutDelay?: number;\n bundle?: boolean;\n debounce?: boolean;\n afterMatchDelay?: number;\n last?: (match: T) => boolean;\n exec?: () => void;\n },\n ): Promise<RegExpMatchArray[] | T[]> {\n throw badBorrow('addWatcher');\n }\n watchLogChunk<T = string>(\n cmd: string,\n pattern: RegExp | WatcherPattern<T>,\n options?: {\n first?: 'index' | ((match: T) => boolean);\n last?: (match: T) => boolean;\n afterMatchDelay?: number;\n timeoutDelay?: number;\n },\n ): Promise<RegExpMatchArray[] | T[]> {\n throw badBorrow('watchLogChunk');\n }\n watchLogArray<\n Item extends Record<string, string> = Record<string, string>,\n Member extends Record<string, string> = Record<string, string>,\n >(\n cmd: string,\n itemPattern: RegExp,\n memberPattern: RegExp,\n ): Promise<{ item: Item; members: Member[] }[]> {\n throw badBorrow('watchLogArray');\n }\n getServerStatus(): Promise<IServerStatus> {\n throw badBorrow('getServerStatus');\n }\n listMinigames(): Promise<IMinigameList> {\n throw badBorrow('listMinigames');\n }\n getAllPlayerPositions(): Promise<IPlayerPositions> {\n throw badBorrow('getAllPlayerPositions');\n }\n getMinigames(): Promise<ILogMinigame[]> {\n throw badBorrow('getMinigames');\n }\n getGamemode(): Promise<IGamemode | null> {\n throw badBorrow('getGamemode');\n }\n getPlayers(): {\n id: string;\n name: string;\n displayName: string;\n controller: string;\n state: string;\n }[] {\n throw badBorrow('getPlayers');\n }\n getPlayer(target: string): OmeggaPlayer {\n throw badBorrow('getPlayer');\n }\n findPlayerByName(name: string): OmeggaPlayer {\n throw badBorrow('findPlayerByName');\n }\n getHostId(): string {\n throw badBorrow('getHostId');\n }\n broadcast(...messages: string[]): void {\n throw badBorrow('broadcast');\n }\n whisper(target: string | OmeggaPlayer, ...messages: string[]): void {\n throw badBorrow('whisper');\n }\n middlePrint(target: string | OmeggaPlayer, message: string): void {\n throw badBorrow('middlePrint');\n }\n saveMinigame(index: number, name: string): void {\n throw badBorrow('saveMinigame');\n }\n deleteMinigame(index: number): void {\n throw badBorrow('deleteMinigame');\n }\n resetMinigame(index: number): void {\n throw badBorrow('resetMinigame');\n }\n nextRoundMinigame(index: number): void {\n throw badBorrow('nextRoundMinigame');\n }\n loadMinigame(presetName: string, owner?: string): void {\n throw badBorrow('loadMinigame');\n }\n getMinigamePresets(): string[] {\n throw badBorrow('getMinigamePresets');\n }\n resetEnvironment(): void {\n throw badBorrow('resetEnvironment');\n }\n saveEnvironment(presetName: string): Promise<void> {\n throw badBorrow('saveEnvironment');\n }\n getEnvironmentData(): Promise<EnvironmentPreset> {\n throw badBorrow('getEnvironmentData');\n }\n loadEnvironment(presetName: string): void {\n throw badBorrow('loadEnvironment');\n }\n readEnvironmentData(presetName: string): void {\n throw badBorrow('readEnvironmentData');\n }\n loadEnvironmentData(preset: EnvironmentPreset): void {\n throw badBorrow('loadEnvironmentData');\n }\n getEnvironmentPresets(): string[] {\n throw badBorrow('getEnvironmentPresets');\n }\n clearBricks(target: string | { id: string }, quiet?: boolean): void {\n throw badBorrow('clearBricks');\n }\n clearRegion(\n region: {\n center: [number, number, number];\n extent: [number, number, number];\n },\n options?: {\n target?: string | OmeggaPlayer;\n bricks?: boolean;\n entities?: boolean;\n },\n ): void {\n throw badBorrow('clearRegion');\n }\n clearAllBricks(\n options?:\n | boolean\n | { quiet?: boolean; bricks?: boolean; entities?: boolean },\n ): void {\n throw badBorrow('clearAllBricks');\n }\n saveBricks(saveName: string, region?: {}): void {\n throw badBorrow('saveBricks');\n }\n saveBricksAsync(saveName: string, region?: {}): Promise<void> {\n throw badBorrow('saveBricksAsync');\n }\n loadBricks(\n saveName: string,\n options?: { offX?: number; offY?: number; offZ?: number; quiet?: boolean },\n ): void {\n throw badBorrow('loadBricks');\n }\n loadBricksOnPlayer(\n saveName: string,\n player: string | OmeggaPlayer,\n options?: { offX?: number; offY?: number; offZ?: number },\n ): void {\n throw badBorrow('loadBricksOnPlayer');\n }\n getSaves(): string[] {\n throw badBorrow('getSaves');\n }\n getWorlds(): string[] {\n throw badBorrow('getWorlds');\n }\n getPrefabs(): string[] {\n throw badBorrow('getPrefabs');\n }\n loadPrefab(\n path: string,\n options?: {\n offX?: number;\n offY?: number;\n offZ?: number;\n atOriginalPosition?: boolean;\n orientation?: number;\n rootEntityPersistentIndex?: number;\n mirrorAxes?: number;\n overrideUserId?: string;\n },\n ): void {\n throw badBorrow('loadPrefab');\n }\n loadPrefabOnPlayer(\n path: string,\n player: string | OmeggaPlayer,\n options?: { preserveOwnership?: boolean },\n ): void {\n throw badBorrow('loadPrefabOnPlayer');\n }\n savePrefab(\n path: string,\n options?: {\n region?: {\n center: [number, number, number];\n extent: [number, number, number];\n };\n entities?: boolean;\n rootEntityPersistentIndex?: number;\n userId?: string;\n },\n ): void {\n throw badBorrow('savePrefab');\n }\n savePrefabAsync(\n path: string,\n options?: {\n region?: {\n center: [number, number, number];\n extent: [number, number, number];\n };\n entities?: boolean;\n rootEntityPersistentIndex?: number;\n userId?: string;\n },\n ): Promise<string | null> {\n throw badBorrow('savePrefabAsync');\n }\n givePrefabToPlayer(\n path: string,\n player: string | OmeggaPlayer,\n options?: { preserveOwnership?: boolean },\n ): void {\n throw badBorrow('givePrefabToPlayer');\n }\n getSavePath(saveName: string): string {\n throw badBorrow('getSavePath');\n }\n getWorldPath(worldName: string): string {\n throw badBorrow('getWorldPath');\n }\n getWorldRevisions(\n worldName: string,\n ): Promise<{ index: number; date: Date; note: string }[]> {\n throw badBorrow('getWorldRevisions');\n }\n loadWorld(worldName: string): Promise<boolean> {\n throw badBorrow('loadWorld');\n }\n loadWorldRevision(worldName: string, revision: number): Promise<boolean> {\n throw badBorrow('loadWorldRevision');\n }\n saveWorldAs(worldName: string): Promise<boolean> {\n throw badBorrow('saveWorldAs');\n }\n saveWorld(): Promise<boolean> {\n throw badBorrow('saveWorld');\n }\n createEmptyWorld(worldName: string): Promise<boolean> {\n throw badBorrow('createEmptyWorld');\n }\n writeSaveData(saveName: string, saveData: WriteSaveObject) {\n throw badBorrow('writeSaveData');\n }\n readSaveData(saveName: string, nobricks?: boolean): ReadSaveObject {\n throw badBorrow('readSaveData');\n }\n loadSaveData(\n saveData: WriteSaveObject,\n options?: { offX?: number; offY?: number; offZ?: number; quiet?: boolean },\n ): Promise<void> {\n throw badBorrow('loadSaveData');\n }\n loadSaveDataOnPlayer(\n saveData: WriteSaveObject,\n player: string | OmeggaPlayer,\n options?: { offX?: number; offY?: number; offZ?: number },\n ): Promise<void> {\n throw badBorrow('loadSaveDataOnPlayer');\n }\n getSaveData(region?: {\n center: [number, number, number];\n extent: [number, number, number];\n }): Promise<ReadSaveObject> {\n throw badBorrow('getSaveData');\n }\n changeMap(map: string): Promise<boolean> {\n throw badBorrow('changeMap');\n }\n getRoleSetup(): BRRoleSetup {\n throw badBorrow('getRoleSetup');\n }\n getRoleAssignments(): BRRoleAssignments {\n throw badBorrow('getRoleAssignments');\n }\n getBanList(): BRBanList {\n throw badBorrow('getBanList');\n }\n getNameCache(): BRPlayerNameCache {\n throw badBorrow('getNameCache');\n }\n}\n\nexport function injectOmeggaPrototypes(\n proxyOmegga: typeof ProxyOmegga,\n omegga: typeof Omegga,\n) {\n // copy prototypes from core omegga to the proxy omegga\n for (const fn in STEAL_PROTOTYPES) {\n proxyOmegga.prototype[fn] = omegga.prototype[fn];\n }\n}\n"],"names":["LogWrangler","commandInjector","Player","resolveConsoleCommands","player"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"proxyOmegga.js","sources":["../../../../src/omegga/plugin/plugin_node_safe/proxyOmegga.ts"],"sourcesContent":["import {\n OmeggaCore,\n OmeggaLike,\n OmeggaPlayer,\n PluginInterop,\n WatcherPattern,\n} from '@/plugin';\nimport { EnvironmentPreset } from '@brickadia/presets';\nimport {\n BRBanList,\n BRPlayerNameCache,\n BRRoleAssignments,\n BRRoleSetup,\n} from '@brickadia/types';\nimport commandInjector from '@omegga/commandInjector';\nimport { ConsoleCommands, resolveConsoleCommands } from '@omegga/commands';\nimport LogWrangler from '@omegga/logWrangler';\nimport Player from '@omegga/player';\nimport Omegga from '@omegga/server';\nimport {\n IGamemode,\n ILogMinigame,\n IMinigameList,\n IPlayerPositions,\n IServerStatus,\n} from '@omegga/types';\nimport { ReadSaveObject, WriteSaveObject } from 'brs-js';\nimport EventEmitter from 'events';\n\n// bootstrap the proxy with initial omegga data\nexport const bootstrap = (omegga: Omegga): Record<string, unknown[]> => ({\n 'plugin:players:raw': [omegga.players.map(p => p.raw())],\n bootstrap: [\n {\n host: Object.freeze({ ...omegga.host }),\n version: omegga.version,\n verbose: omegga.verbose,\n savePath: omegga.savePath,\n worldPath: omegga.worldPath,\n prefabPath: omegga.prefabPath,\n path: omegga.path,\n configPath: omegga.configPath,\n presetPath: omegga.presetPath,\n starting: omegga.starting,\n started: omegga.started,\n stopping: omegga.stopping,\n config: omegga.config,\n currentMap: omegga.currentMap,\n },\n ],\n});\n\n// prototypes that can be directly stolen from omegga\nconst STEAL_PROTOTYPES: Record<keyof Required<OmeggaCore>, true> = {\n broadcast: true,\n whisper: true,\n middlePrint: true,\n getPlayer: true,\n getPlayers: true,\n findPlayerByName: true,\n getHostId: true,\n clearBricks: true,\n clearRegion: true,\n clearAllBricks: true,\n loadBricks: true,\n loadBricksOnPlayer: true,\n saveBricks: true,\n saveBricksAsync: true,\n getSavePath: true,\n getSaves: true,\n getWorldPath: true,\n getWorlds: true,\n getPrefabs: true,\n getPrefabPath: true,\n loadPrefab: true,\n loadPrefabOnPlayer: true,\n savePrefab: true,\n savePrefabAsync: true,\n givePrefabToPlayer: true,\n getWorldRevisions: true,\n loadWorld: true,\n loadWorldRevision: true,\n saveWorldAs: true,\n saveWorld: true,\n createEmptyWorld: true,\n writeSaveData: true,\n readSaveData: true,\n loadSaveData: true,\n loadSaveDataOnPlayer: true,\n getSaveData: true,\n getRoleSetup: true,\n getRoleAssignments: true,\n getBanList: true,\n getNameCache: true,\n changeMap: true,\n saveMinigame: true,\n deleteMinigame: true,\n resetMinigame: true,\n nextRoundMinigame: true,\n loadMinigame: true,\n getMinigamePresets: true,\n resetEnvironment: true,\n saveEnvironment: true,\n readEnvironmentData: true,\n getEnvironmentData: true,\n loadEnvironment: true,\n loadEnvironmentData: true,\n getEnvironmentPresets: true,\n};\n\nconst badBorrow = (name: string) =>\n new Error(`Method \"${name}\" not properly borrowed.`);\n\n// this is a \"soft\" omegga\n// it is built to mimic the core omegga\n// it does not provide direct write access to\nexport class ProxyOmegga extends EventEmitter implements OmeggaLike {\n _tempCounter = { save: 0, environment: 0 };\n _tempSavePrefix = 'omegga_plugin_temp_';\n\n writeln: (line: string) => void;\n version: number;\n players: Player[];\n\n /** memoized version-resolved console commands ({@link Console}) */\n #console: { version: number; commands: ConsoleCommands };\n\n /** version-resolved Brickadia console command names, nested by namespace */\n get Console(): ConsoleCommands {\n if (this.#console?.version !== this.version)\n this.#console = {\n version: this.version,\n commands: resolveConsoleCommands(this.version),\n };\n return this.#console.commands;\n }\n\n host: { id: string; name: string };\n\n verbose: boolean;\n\n started: boolean;\n starting: boolean;\n stopping: boolean;\n currentMap: string;\n\n path: string;\n configPath: string;\n savePath: string;\n worldPath: string;\n prefabPath: string;\n presetPath: string;\n\n logWrangler: LogWrangler;\n\n getPlugin: (name: string) => Promise<PluginInterop>;\n\n constructor(exec: (line: string) => void) {\n super();\n this.setMaxListeners(Infinity);\n\n this.writeln = exec;\n\n this.version = -1;\n\n this.players = [];\n\n // log wrangler wrangles logs... it reads brickadia logs and clumps them together\n this.logWrangler = new LogWrangler(this as unknown as Omegga);\n this.on('line', this.logWrangler.callback);\n this.addMatcher = this.logWrangler.addMatcher;\n this.addWatcher = this.logWrangler.addWatcher;\n this.watchLogArray = this.logWrangler.watchLogArray;\n this.watchLogChunk = this.logWrangler.watchLogChunk;\n\n // inject commands\n commandInjector(this, this.logWrangler);\n\n // blanket apply fields\n this.once('bootstrap', data => {\n for (const key in data) {\n (this as any)[key] = data[key];\n }\n });\n\n // data synchronization\n this.on('host', host => (this.host = host));\n this.on('version', version => (this.version = version));\n\n // create players from raw constructor data\n this.on(\n 'plugin:players:raw',\n (players: [string, string, string, string, string][]) =>\n (this.players = players.map(p => new Player(this as OmeggaLike, ...p))),\n );\n\n this.on('start', ({ map }) => {\n this.started = true;\n this.starting = false;\n this.currentMap = map;\n });\n this.on('exit', () => {\n this.started = false;\n this.starting = false;\n });\n this.on('mapchange', ({ map }) => {\n this.currentMap = map;\n });\n }\n addMatcher<T>(\n pattern: RegExp | ((line: string, match: RegExpMatchArray) => T),\n callback:\n | ((match: RegExpMatchArray) => boolean)\n | ((match: RegExpMatchArray) => T),\n ): void {\n throw badBorrow('addMatcher');\n }\n addWatcher<T = RegExpMatchArray>(\n pattern: RegExp | WatcherPattern<T>,\n options?: {\n timeoutDelay?: number;\n bundle?: boolean;\n debounce?: boolean;\n afterMatchDelay?: number;\n last?: (match: T) => boolean;\n exec?: () => void;\n },\n ): Promise<RegExpMatchArray[] | T[]> {\n throw badBorrow('addWatcher');\n }\n watchLogChunk<T = string>(\n cmd: string,\n pattern: RegExp | WatcherPattern<T>,\n options?: {\n first?: 'index' | ((match: T) => boolean);\n last?: (match: T) => boolean;\n afterMatchDelay?: number;\n timeoutDelay?: number;\n },\n ): Promise<RegExpMatchArray[] | T[]> {\n throw badBorrow('watchLogChunk');\n }\n watchLogArray<\n Item extends Record<string, string> = Record<string, string>,\n Member extends Record<string, string> = Record<string, string>,\n >(\n cmd: string,\n itemPattern: RegExp,\n memberPattern: RegExp,\n ): Promise<{ item: Item; members: Member[] }[]> {\n throw badBorrow('watchLogArray');\n }\n getServerStatus(): Promise<IServerStatus> {\n throw badBorrow('getServerStatus');\n }\n listMinigames(): Promise<IMinigameList> {\n throw badBorrow('listMinigames');\n }\n getAllPlayerPositions(): Promise<IPlayerPositions> {\n throw badBorrow('getAllPlayerPositions');\n }\n getMinigames(): Promise<ILogMinigame[]> {\n throw badBorrow('getMinigames');\n }\n getGamemode(): Promise<IGamemode | null> {\n throw badBorrow('getGamemode');\n }\n getPlayers(): {\n id: string;\n name: string;\n displayName: string;\n controller: string;\n state: string;\n }[] {\n throw badBorrow('getPlayers');\n }\n getPlayer(target: string): OmeggaPlayer {\n throw badBorrow('getPlayer');\n }\n findPlayerByName(name: string): OmeggaPlayer {\n throw badBorrow('findPlayerByName');\n }\n getHostId(): string {\n throw badBorrow('getHostId');\n }\n broadcast(...messages: string[]): void {\n throw badBorrow('broadcast');\n }\n whisper(target: string | OmeggaPlayer, ...messages: string[]): void {\n throw badBorrow('whisper');\n }\n middlePrint(target: string | OmeggaPlayer, message: string): void {\n throw badBorrow('middlePrint');\n }\n saveMinigame(index: number, name: string): void {\n throw badBorrow('saveMinigame');\n }\n deleteMinigame(index: number): void {\n throw badBorrow('deleteMinigame');\n }\n resetMinigame(index: number): void {\n throw badBorrow('resetMinigame');\n }\n nextRoundMinigame(index: number): void {\n throw badBorrow('nextRoundMinigame');\n }\n loadMinigame(presetName: string, owner?: string): void {\n throw badBorrow('loadMinigame');\n }\n getMinigamePresets(): string[] {\n throw badBorrow('getMinigamePresets');\n }\n resetEnvironment(): void {\n throw badBorrow('resetEnvironment');\n }\n saveEnvironment(presetName: string): Promise<void> {\n throw badBorrow('saveEnvironment');\n }\n getEnvironmentData(): Promise<EnvironmentPreset> {\n throw badBorrow('getEnvironmentData');\n }\n loadEnvironment(presetName: string): void {\n throw badBorrow('loadEnvironment');\n }\n readEnvironmentData(presetName: string): void {\n throw badBorrow('readEnvironmentData');\n }\n loadEnvironmentData(preset: EnvironmentPreset): void {\n throw badBorrow('loadEnvironmentData');\n }\n getEnvironmentPresets(): string[] {\n throw badBorrow('getEnvironmentPresets');\n }\n clearBricks(target: string | { id: string }, quiet?: boolean): void {\n throw badBorrow('clearBricks');\n }\n clearRegion(\n region: {\n center: [number, number, number];\n extent: [number, number, number];\n },\n options?: {\n target?: string | OmeggaPlayer;\n bricks?: boolean;\n entities?: boolean;\n },\n ): void {\n throw badBorrow('clearRegion');\n }\n clearAllBricks(\n options?:\n | boolean\n | { quiet?: boolean; bricks?: boolean; entities?: boolean },\n ): void {\n throw badBorrow('clearAllBricks');\n }\n saveBricks(saveName: string, region?: {}): void {\n throw badBorrow('saveBricks');\n }\n saveBricksAsync(saveName: string, region?: {}): Promise<void> {\n throw badBorrow('saveBricksAsync');\n }\n loadBricks(\n saveName: string,\n options?: { offX?: number; offY?: number; offZ?: number; quiet?: boolean },\n ): void {\n throw badBorrow('loadBricks');\n }\n loadBricksOnPlayer(\n saveName: string,\n player: string | OmeggaPlayer,\n options?: { offX?: number; offY?: number; offZ?: number },\n ): void {\n throw badBorrow('loadBricksOnPlayer');\n }\n getSaves(): string[] {\n throw badBorrow('getSaves');\n }\n getWorlds(): string[] {\n throw badBorrow('getWorlds');\n }\n getPrefabs(): string[] {\n throw badBorrow('getPrefabs');\n }\n getPrefabPath(prefabName: string): string {\n throw badBorrow('getPrefabPath');\n }\n loadPrefab(\n path: string,\n options?: {\n offX?: number;\n offY?: number;\n offZ?: number;\n atOriginalPosition?: boolean;\n orientation?: number;\n rootEntityPersistentIndex?: number;\n mirrorAxes?: number;\n overrideUserId?: string;\n },\n ): void {\n throw badBorrow('loadPrefab');\n }\n loadPrefabOnPlayer(\n path: string,\n player: string | OmeggaPlayer,\n options?: { preserveOwnership?: boolean },\n ): void {\n throw badBorrow('loadPrefabOnPlayer');\n }\n savePrefab(\n path: string,\n options?: {\n region?: {\n center: [number, number, number];\n extent: [number, number, number];\n };\n entities?: boolean;\n rootEntityPersistentIndex?: number;\n userId?: string;\n },\n ): void {\n throw badBorrow('savePrefab');\n }\n savePrefabAsync(\n path: string,\n options?: {\n region?: {\n center: [number, number, number];\n extent: [number, number, number];\n };\n entities?: boolean;\n rootEntityPersistentIndex?: number;\n userId?: string;\n },\n ): Promise<string | null> {\n throw badBorrow('savePrefabAsync');\n }\n givePrefabToPlayer(\n path: string,\n player: string | OmeggaPlayer,\n options?: { preserveOwnership?: boolean },\n ): void {\n throw badBorrow('givePrefabToPlayer');\n }\n getSavePath(saveName: string): string {\n throw badBorrow('getSavePath');\n }\n getWorldPath(worldName: string): string {\n throw badBorrow('getWorldPath');\n }\n getWorldRevisions(\n worldName: string,\n ): Promise<{ index: number; date: Date; note: string }[]> {\n throw badBorrow('getWorldRevisions');\n }\n loadWorld(worldName: string): Promise<boolean> {\n throw badBorrow('loadWorld');\n }\n loadWorldRevision(worldName: string, revision: number): Promise<boolean> {\n throw badBorrow('loadWorldRevision');\n }\n saveWorldAs(worldName: string): Promise<boolean> {\n throw badBorrow('saveWorldAs');\n }\n saveWorld(): Promise<boolean> {\n throw badBorrow('saveWorld');\n }\n createEmptyWorld(worldName: string): Promise<boolean> {\n throw badBorrow('createEmptyWorld');\n }\n writeSaveData(saveName: string, saveData: WriteSaveObject) {\n throw badBorrow('writeSaveData');\n }\n readSaveData(saveName: string, nobricks?: boolean): ReadSaveObject {\n throw badBorrow('readSaveData');\n }\n loadSaveData(\n saveData: WriteSaveObject,\n options?: { offX?: number; offY?: number; offZ?: number; quiet?: boolean },\n ): Promise<void> {\n throw badBorrow('loadSaveData');\n }\n loadSaveDataOnPlayer(\n saveData: WriteSaveObject,\n player: string | OmeggaPlayer,\n options?: { offX?: number; offY?: number; offZ?: number },\n ): Promise<void> {\n throw badBorrow('loadSaveDataOnPlayer');\n }\n getSaveData(region?: {\n center: [number, number, number];\n extent: [number, number, number];\n }): Promise<ReadSaveObject> {\n throw badBorrow('getSaveData');\n }\n changeMap(map: string): Promise<boolean> {\n throw badBorrow('changeMap');\n }\n getRoleSetup(): BRRoleSetup {\n throw badBorrow('getRoleSetup');\n }\n getRoleAssignments(): BRRoleAssignments {\n throw badBorrow('getRoleAssignments');\n }\n getBanList(): BRBanList {\n throw badBorrow('getBanList');\n }\n getNameCache(): BRPlayerNameCache {\n throw badBorrow('getNameCache');\n }\n}\n\nexport function injectOmeggaPrototypes(\n proxyOmegga: typeof ProxyOmegga,\n omegga: typeof Omegga,\n) {\n // copy prototypes from core omegga to the proxy omegga\n for (const fn in STEAL_PROTOTYPES) {\n proxyOmegga.prototype[fn] = omegga.prototype[fn];\n }\n}\n"],"names":["LogWrangler","commandInjector","Player","resolveConsoleCommands","player"],"mappings":"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"}
|
package/dist/omegga/server.js
CHANGED
|
@@ -15,6 +15,7 @@ const path = require("path");
|
|
|
15
15
|
const commandInjector = require("./commandInjector.js");
|
|
16
16
|
const commands = require("./commands.js");
|
|
17
17
|
const index$1 = require("./matchers/index.js");
|
|
18
|
+
const version$1 = require("./matchers/version.js");
|
|
18
19
|
const plugin = require("./plugin.js");
|
|
19
20
|
const wrapper = require("./wrapper.js");
|
|
20
21
|
const MISSING_CMD = '"Command not found. Type <color=\\"ffff00\\">/help</> for a list of commands or <color=\\"ffff00\\">/plugins</> for plugin information."';
|
|
@@ -269,6 +270,13 @@ class Omegga extends wrapper.default {
|
|
|
269
270
|
//
|
|
270
271
|
async start() {
|
|
271
272
|
this.starting = true;
|
|
273
|
+
if (this.version < 0) {
|
|
274
|
+
const binVersion = version$1.readBinaryVersion(this.getGameBinaryPath());
|
|
275
|
+
if (binVersion != null) {
|
|
276
|
+
this.version = binVersion;
|
|
277
|
+
logger.default.verbose("Brickadia Version (from binary)", binVersion);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
272
280
|
if (this.webserver) await this.webserver.start();
|
|
273
281
|
if (this.pluginLoader) {
|
|
274
282
|
logger.default.verbose("Scanning for plugins");
|
|
@@ -621,6 +629,13 @@ class Omegga extends wrapper.default {
|
|
|
621
629
|
);
|
|
622
630
|
return fs.existsSync(file2) ? file2 : void 0;
|
|
623
631
|
}
|
|
632
|
+
getPrefabPath(prefabName) {
|
|
633
|
+
const file2 = path.join(
|
|
634
|
+
this.prefabPath,
|
|
635
|
+
prefabName.endsWith(".brz") ? prefabName : prefabName + ".brz"
|
|
636
|
+
);
|
|
637
|
+
return fs.existsSync(file2) ? file2 : void 0;
|
|
638
|
+
}
|
|
624
639
|
getWorldPath(worldName) {
|
|
625
640
|
const file2 = path.join(
|
|
626
641
|
this.worldPath,
|
|
@@ -761,9 +776,61 @@ class Omegga extends wrapper.default {
|
|
|
761
776
|
throw "save file not in Saved/Builds directory";
|
|
762
777
|
fs.writeFileSync(file2, new Uint8Array(brs.write(saveData)));
|
|
763
778
|
}
|
|
779
|
+
/**
|
|
780
|
+
* Read a `.brz` prefab file (EA3) into a legacy save object. Brick geometry,
|
|
781
|
+
* ownership, assets, materials, and components are reconstructed; wires are
|
|
782
|
+
* not (the save-level `wires` array is left empty). Component names/data are
|
|
783
|
+
* EA3-native (e.g. `Component_Internal_Seat`), not the legacy `BCD_*` names.
|
|
784
|
+
*/
|
|
785
|
+
readPrefabData(file2, { nobricks = false } = {}) {
|
|
786
|
+
const MAIN_GRID = 1;
|
|
787
|
+
const reader = brs.WorldReader.from(new Uint8Array(fs.readFileSync(file2)));
|
|
788
|
+
const bricks = nobricks ? [] : [...reader.bricks(MAIN_GRID)].map((b) => ({
|
|
789
|
+
...b,
|
|
790
|
+
physical_index: 0,
|
|
791
|
+
components: {}
|
|
792
|
+
}));
|
|
793
|
+
if (!nobricks) {
|
|
794
|
+
let brickOffset = 0;
|
|
795
|
+
for (const chunk of reader.brickChunkIndex(MAIN_GRID)) {
|
|
796
|
+
if (chunk.numComponents > 0) {
|
|
797
|
+
const { components } = reader.componentChunk(MAIN_GRID, chunk.index);
|
|
798
|
+
for (const c of components) {
|
|
799
|
+
const brick = bricks[brickOffset + c.brickIndex];
|
|
800
|
+
if (brick) brick.components[c.typeName] = c.data ?? {};
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
brickOffset += chunk.numBricks;
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
return {
|
|
807
|
+
version: 10,
|
|
808
|
+
map: this.currentMap ?? "Unknown",
|
|
809
|
+
author: { id: this.host?.id ?? "", name: this.host?.name ?? "" },
|
|
810
|
+
host: { id: this.host?.id ?? "", name: this.host?.name ?? "" },
|
|
811
|
+
description: "",
|
|
812
|
+
brick_count: bricks.length,
|
|
813
|
+
mods: [],
|
|
814
|
+
brick_assets: reader.brickAssets(),
|
|
815
|
+
colors: [],
|
|
816
|
+
materials: reader.materials(),
|
|
817
|
+
physical_materials: [],
|
|
818
|
+
brick_owners: reader.brickOwners(),
|
|
819
|
+
game_version: this.version,
|
|
820
|
+
save_time: new Uint8Array(),
|
|
821
|
+
bricks,
|
|
822
|
+
components: {}
|
|
823
|
+
};
|
|
824
|
+
}
|
|
764
825
|
readSaveData(saveName, nobricks = false) {
|
|
765
826
|
if (typeof saveName !== "string")
|
|
766
827
|
throw "expected name argument for readSaveData";
|
|
828
|
+
if (brsRemoved(this.version)) {
|
|
829
|
+
const file22 = this.getPrefabPath(saveName);
|
|
830
|
+
if (!file22 || !file22.startsWith(this.prefabPath))
|
|
831
|
+
throw "prefab file not in Saved/Prefabs directory";
|
|
832
|
+
return this.readPrefabData(file22, { nobricks });
|
|
833
|
+
}
|
|
767
834
|
const file2 = this.getSavePath(saveName);
|
|
768
835
|
if (!file2 || !file2.startsWith(this.savePath))
|
|
769
836
|
throw "save file not in Saved/Builds directory";
|
|
@@ -854,45 +921,7 @@ class Omegga extends wrapper.default {
|
|
|
854
921
|
const file2 = await this.savePrefabAsync(ref, { region });
|
|
855
922
|
if (!file2) return void 0;
|
|
856
923
|
try {
|
|
857
|
-
|
|
858
|
-
const reader = brs.WorldReader.from(new Uint8Array(fs.readFileSync(file2)));
|
|
859
|
-
const bricks = [...reader.bricks(MAIN_GRID)].map((b) => ({
|
|
860
|
-
...b,
|
|
861
|
-
physical_index: 0,
|
|
862
|
-
components: {}
|
|
863
|
-
}));
|
|
864
|
-
let brickOffset = 0;
|
|
865
|
-
for (const chunk of reader.brickChunkIndex(MAIN_GRID)) {
|
|
866
|
-
if (chunk.numComponents > 0) {
|
|
867
|
-
const { components } = reader.componentChunk(
|
|
868
|
-
MAIN_GRID,
|
|
869
|
-
chunk.index
|
|
870
|
-
);
|
|
871
|
-
for (const c of components) {
|
|
872
|
-
const brick = bricks[brickOffset + c.brickIndex];
|
|
873
|
-
if (brick) brick.components[c.typeName] = c.data ?? {};
|
|
874
|
-
}
|
|
875
|
-
}
|
|
876
|
-
brickOffset += chunk.numBricks;
|
|
877
|
-
}
|
|
878
|
-
return {
|
|
879
|
-
version: 10,
|
|
880
|
-
map: this.currentMap ?? "Unknown",
|
|
881
|
-
author: { id: this.host?.id ?? "", name: this.host?.name ?? "" },
|
|
882
|
-
host: { id: this.host?.id ?? "", name: this.host?.name ?? "" },
|
|
883
|
-
description: "",
|
|
884
|
-
brick_count: bricks.length,
|
|
885
|
-
mods: [],
|
|
886
|
-
brick_assets: reader.brickAssets(),
|
|
887
|
-
colors: [],
|
|
888
|
-
materials: reader.materials(),
|
|
889
|
-
physical_materials: [],
|
|
890
|
-
brick_owners: reader.brickOwners(),
|
|
891
|
-
game_version: this.version,
|
|
892
|
-
save_time: new Uint8Array(),
|
|
893
|
-
bricks,
|
|
894
|
-
components: {}
|
|
895
|
-
};
|
|
924
|
+
return this.readPrefabData(file2);
|
|
896
925
|
} finally {
|
|
897
926
|
if (fs.existsSync(file2)) fs.unlinkSync(file2);
|
|
898
927
|
}
|