omegga 1.8.0 → 1.9.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 +21 -0
- package/README.md +3 -1
- package/dist/omegga/commands.js +53 -7
- package/dist/omegga/commands.js.map +1 -1
- package/dist/omegga/matchers/index.js +3 -1
- package/dist/omegga/matchers/index.js.map +1 -1
- package/dist/omegga/matchers/wire.js +27 -0
- package/dist/omegga/matchers/wire.js.map +1 -0
- package/dist/omegga/plugin/plugin_jsonrpc_stdio.js +38 -0
- package/dist/omegga/plugin/plugin_jsonrpc_stdio.js.map +1 -1
- package/dist/omegga/plugin/plugin_node_safe/proxyOmegga.js +26 -1
- package/dist/omegga/plugin/plugin_node_safe/proxyOmegga.js.map +1 -1
- package/dist/omegga/server.js +247 -42
- package/dist/omegga/server.js.map +1 -1
- package/dist/plugin.js.map +1 -1
- package/dist/util/brdb.js +38 -585
- package/dist/util/brdb.js.map +1 -1
- package/dist/util/index.js +50 -3
- package/dist/util/index.js.map +1 -1
- package/dist/util/uuid.js +2 -4
- package/dist/util/uuid.js.map +1 -1
- package/dist/webserver/backend/router/role.js +1 -1
- package/dist/webserver/backend/router/role.js.map +1 -1
- package/package.json +3 -3
- package/templates/safe-ts/omegga.d.ts +2572 -42
- package/.claude/settings.local.json +0 -53
|
@@ -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(\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"],"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(\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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"}
|
|
@@ -14,6 +14,7 @@ const bootstrap = (omegga) => ({
|
|
|
14
14
|
verbose: omegga.verbose,
|
|
15
15
|
savePath: omegga.savePath,
|
|
16
16
|
worldPath: omegga.worldPath,
|
|
17
|
+
prefabPath: omegga.prefabPath,
|
|
17
18
|
path: omegga.path,
|
|
18
19
|
configPath: omegga.configPath,
|
|
19
20
|
presetPath: omegga.presetPath,
|
|
@@ -44,6 +45,12 @@ const STEAL_PROTOTYPES = {
|
|
|
44
45
|
getSaves: true,
|
|
45
46
|
getWorldPath: true,
|
|
46
47
|
getWorlds: true,
|
|
48
|
+
getPrefabs: true,
|
|
49
|
+
loadPrefab: true,
|
|
50
|
+
loadPrefabOnPlayer: true,
|
|
51
|
+
savePrefab: true,
|
|
52
|
+
savePrefabAsync: true,
|
|
53
|
+
givePrefabToPlayer: true,
|
|
47
54
|
getWorldRevisions: true,
|
|
48
55
|
loadWorld: true,
|
|
49
56
|
loadWorldRevision: true,
|
|
@@ -219,7 +226,7 @@ class ProxyOmegga extends EventEmitter {
|
|
|
219
226
|
clearRegion(region, options) {
|
|
220
227
|
throw badBorrow("clearRegion");
|
|
221
228
|
}
|
|
222
|
-
clearAllBricks(
|
|
229
|
+
clearAllBricks(options) {
|
|
223
230
|
throw badBorrow("clearAllBricks");
|
|
224
231
|
}
|
|
225
232
|
saveBricks(saveName, region) {
|
|
@@ -240,6 +247,24 @@ class ProxyOmegga extends EventEmitter {
|
|
|
240
247
|
getWorlds() {
|
|
241
248
|
throw badBorrow("getWorlds");
|
|
242
249
|
}
|
|
250
|
+
getPrefabs() {
|
|
251
|
+
throw badBorrow("getPrefabs");
|
|
252
|
+
}
|
|
253
|
+
loadPrefab(path, options) {
|
|
254
|
+
throw badBorrow("loadPrefab");
|
|
255
|
+
}
|
|
256
|
+
loadPrefabOnPlayer(path, player2, options) {
|
|
257
|
+
throw badBorrow("loadPrefabOnPlayer");
|
|
258
|
+
}
|
|
259
|
+
savePrefab(path, options) {
|
|
260
|
+
throw badBorrow("savePrefab");
|
|
261
|
+
}
|
|
262
|
+
savePrefabAsync(path, options) {
|
|
263
|
+
throw badBorrow("savePrefabAsync");
|
|
264
|
+
}
|
|
265
|
+
givePrefabToPlayer(path, player2, options) {
|
|
266
|
+
throw badBorrow("givePrefabToPlayer");
|
|
267
|
+
}
|
|
243
268
|
getSavePath(saveName) {
|
|
244
269
|
throw badBorrow("getSavePath");
|
|
245
270
|
}
|
|
@@ -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 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 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 configPath: string;\n savePath: string;\n worldPath: 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 },\n ): void {\n throw badBorrow('clearRegion');\n }\n clearAllBricks(quiet?: boolean): 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 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":";;;;;;;AA8BO,MAAM,YAAY,CAAC,YAA+C;AAAA,EACvE,sBAAsB,CAAC,OAAO,QAAQ,IAAI,CAAA,MAAK,EAAE,IAAA,CAAK,CAAC;AAAA,EACvD,WAAW;AAAA,IACT;AAAA,MACE,MAAM,OAAO,OAAO,EAAE,GAAG,OAAO,MAAM;AAAA,MACtC,SAAS,OAAO;AAAA,MAChB,SAAS,OAAO;AAAA,MAChB,UAAU,OAAO;AAAA,MACjB,WAAW,OAAO;AAAA,MAClB,MAAM,OAAO;AAAA,MACb,YAAY,OAAO;AAAA,MACnB,YAAY,OAAO;AAAA,MACnB,UAAU,OAAO;AAAA,MACjB,SAAS,OAAO;AAAA,MAChB,UAAU,OAAO;AAAA,MACjB,QAAQ,OAAO;AAAA,MACf,YAAY,OAAO;AAAA,IAAA;AAAA,EACrB;AAEJ;AAGA,MAAM,mBAA6D;AAAA,EACjE,WAAW;AAAA,EACX,SAAS;AAAA,EACT,aAAa;AAAA,EACb,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,WAAW;AAAA,EACX,aAAa;AAAA,EACb,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,oBAAoB;AAAA,EACpB,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,cAAc;AAAA,EACd,WAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,WAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,cAAc;AAAA,EACd,cAAc;AAAA,EACd,sBAAsB;AAAA,EACtB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,WAAW;AAAA,EACX,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,uBAAuB;AACzB;AAEA,MAAM,YAAY,CAAC,SACjB,IAAI,MAAM,WAAW,IAAI,0BAA0B;AAK9C,MAAM,oBAAoB,aAAmC;AAAA,EAuClE,YAAY,MAA8B;AACxC,UAAA;AAvCF,SAAA,eAAe,EAAE,MAAM,GAAG,aAAa,EAAA;AACvC,SAAA,kBAAkB;AAuChB,SAAK,gBAAgB,QAAQ;AAE7B,SAAK,UAAU;AAEf,SAAK,UAAU;AAEf,SAAK,UAAU,CAAA;AAGf,SAAK,cAAc,IAAIA,YAAAA,QAAY,IAAyB;AAC5D,SAAK,GAAG,QAAQ,KAAK,YAAY,QAAQ;AACzC,SAAK,aAAa,KAAK,YAAY;AACnC,SAAK,aAAa,KAAK,YAAY;AACnC,SAAK,gBAAgB,KAAK,YAAY;AACtC,SAAK,gBAAgB,KAAK,YAAY;AAGtCC,4BAAgB,MAAM,KAAK,WAAW;AAGtC,SAAK,KAAK,aAAa,CAAA,SAAQ;AAC7B,iBAAW,OAAO,MAAM;AACrB,aAAa,GAAG,IAAI,KAAK,GAAG;AAAA,MAC/B;AAAA,IACF,CAAC;AAGD,SAAK,GAAG,QAAQ,CAAA,SAAS,KAAK,OAAO,IAAK;AAC1C,SAAK,GAAG,WAAW,CAAA,YAAY,KAAK,UAAU,OAAQ;AAGtD,SAAK;AAAA,MACH;AAAA,MACA,CAAC,YACE,KAAK,UAAU,QAAQ,IAAI,CAAA,MAAK,IAAIC,OAAAA,QAAO,MAAoB,GAAG,CAAC,CAAC;AAAA,IAAA;AAGzE,SAAK,GAAG,SAAS,CAAC,EAAE,UAAU;AAC5B,WAAK,UAAU;AACf,WAAK,WAAW;AAChB,WAAK,aAAa;AAAA,IACpB,CAAC;AACD,SAAK,GAAG,QAAQ,MAAM;AACpB,WAAK,UAAU;AACf,WAAK,WAAW;AAAA,IAClB,CAAC;AACD,SAAK,GAAG,aAAa,CAAC,EAAE,UAAU;AAChC,WAAK,aAAa;AAAA,IACpB,CAAC;AAAA,EACH;AAAA;AAAA,EAjFA;AAAA;AAAA,EAGA,IAAI,UAA2B;AAC7B,QAAI,KAAK,UAAU,YAAY,KAAK;AAClC,WAAK,WAAW;AAAA,QACd,SAAS,KAAK;AAAA,QACd,UAAUC,SAAAA,uBAAuB,KAAK,OAAO;AAAA,MAAA;AAEjD,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAwEA,WACE,SACA,UAGM;AACN,UAAM,UAAU,YAAY;AAAA,EAC9B;AAAA,EACA,WACE,SACA,SAQmC;AACnC,UAAM,UAAU,YAAY;AAAA,EAC9B;AAAA,EACA,cACE,KACA,SACA,SAMmC;AACnC,UAAM,UAAU,eAAe;AAAA,EACjC;AAAA,EACA,cAIE,KACA,aACA,eAC8C;AAC9C,UAAM,UAAU,eAAe;AAAA,EACjC;AAAA,EACA,kBAA0C;AACxC,UAAM,UAAU,iBAAiB;AAAA,EACnC;AAAA,EACA,gBAAwC;AACtC,UAAM,UAAU,eAAe;AAAA,EACjC;AAAA,EACA,wBAAmD;AACjD,UAAM,UAAU,uBAAuB;AAAA,EACzC;AAAA,EACA,eAAwC;AACtC,UAAM,UAAU,cAAc;AAAA,EAChC;AAAA,EACA,cAAyC;AACvC,UAAM,UAAU,aAAa;AAAA,EAC/B;AAAA,EACA,aAMI;AACF,UAAM,UAAU,YAAY;AAAA,EAC9B;AAAA,EACA,UAAU,QAA8B;AACtC,UAAM,UAAU,WAAW;AAAA,EAC7B;AAAA,EACA,iBAAiB,MAA4B;AAC3C,UAAM,UAAU,kBAAkB;AAAA,EACpC;AAAA,EACA,YAAoB;AAClB,UAAM,UAAU,WAAW;AAAA,EAC7B;AAAA,EACA,aAAa,UAA0B;AACrC,UAAM,UAAU,WAAW;AAAA,EAC7B;AAAA,EACA,QAAQ,WAAkC,UAA0B;AAClE,UAAM,UAAU,SAAS;AAAA,EAC3B;AAAA,EACA,YAAY,QAA+B,SAAuB;AAChE,UAAM,UAAU,aAAa;AAAA,EAC/B;AAAA,EACA,aAAa,OAAe,MAAoB;AAC9C,UAAM,UAAU,cAAc;AAAA,EAChC;AAAA,EACA,eAAe,OAAqB;AAClC,UAAM,UAAU,gBAAgB;AAAA,EAClC;AAAA,EACA,cAAc,OAAqB;AACjC,UAAM,UAAU,eAAe;AAAA,EACjC;AAAA,EACA,kBAAkB,OAAqB;AACrC,UAAM,UAAU,mBAAmB;AAAA,EACrC;AAAA,EACA,aAAa,YAAoB,OAAsB;AACrD,UAAM,UAAU,cAAc;AAAA,EAChC;AAAA,EACA,qBAA+B;AAC7B,UAAM,UAAU,oBAAoB;AAAA,EACtC;AAAA,EACA,mBAAyB;AACvB,UAAM,UAAU,kBAAkB;AAAA,EACpC;AAAA,EACA,gBAAgB,YAAmC;AACjD,UAAM,UAAU,iBAAiB;AAAA,EACnC;AAAA,EACA,qBAAiD;AAC/C,UAAM,UAAU,oBAAoB;AAAA,EACtC;AAAA,EACA,gBAAgB,YAA0B;AACxC,UAAM,UAAU,iBAAiB;AAAA,EACnC;AAAA,EACA,oBAAoB,YAA0B;AAC5C,UAAM,UAAU,qBAAqB;AAAA,EACvC;AAAA,EACA,oBAAoB,QAAiC;AACnD,UAAM,UAAU,qBAAqB;AAAA,EACvC;AAAA,EACA,wBAAkC;AAChC,UAAM,UAAU,uBAAuB;AAAA,EACzC;AAAA,EACA,YAAY,QAAiC,OAAuB;AAClE,UAAM,UAAU,aAAa;AAAA,EAC/B;AAAA,EACA,YACE,QAIA,SAGM;AACN,UAAM,UAAU,aAAa;AAAA,EAC/B;AAAA,EACA,eAAe,OAAuB;AACpC,UAAM,UAAU,gBAAgB;AAAA,EAClC;AAAA,EACA,WAAW,UAAkB,QAAmB;AAC9C,UAAM,UAAU,YAAY;AAAA,EAC9B;AAAA,EACA,gBAAgB,UAAkB,QAA4B;AAC5D,UAAM,UAAU,iBAAiB;AAAA,EACnC;AAAA,EACA,WACE,UACA,SACM;AACN,UAAM,UAAU,YAAY;AAAA,EAC9B;AAAA,EACA,mBACE,UACAC,SACA,SACM;AACN,UAAM,UAAU,oBAAoB;AAAA,EACtC;AAAA,EACA,WAAqB;AACnB,UAAM,UAAU,UAAU;AAAA,EAC5B;AAAA,EACA,YAAsB;AACpB,UAAM,UAAU,WAAW;AAAA,EAC7B;AAAA,EACA,YAAY,UAA0B;AACpC,UAAM,UAAU,aAAa;AAAA,EAC/B;AAAA,EACA,aAAa,WAA2B;AACtC,UAAM,UAAU,cAAc;AAAA,EAChC;AAAA,EACA,kBACE,WACwD;AACxD,UAAM,UAAU,mBAAmB;AAAA,EACrC;AAAA,EACA,UAAU,WAAqC;AAC7C,UAAM,UAAU,WAAW;AAAA,EAC7B;AAAA,EACA,kBAAkB,WAAmB,UAAoC;AACvE,UAAM,UAAU,mBAAmB;AAAA,EACrC;AAAA,EACA,YAAY,WAAqC;AAC/C,UAAM,UAAU,aAAa;AAAA,EAC/B;AAAA,EACA,YAA8B;AAC5B,UAAM,UAAU,WAAW;AAAA,EAC7B;AAAA,EACA,iBAAiB,WAAqC;AACpD,UAAM,UAAU,kBAAkB;AAAA,EACpC;AAAA,EACA,cAAc,UAAkB,UAA2B;AACzD,UAAM,UAAU,eAAe;AAAA,EACjC;AAAA,EACA,aAAa,UAAkB,UAAoC;AACjE,UAAM,UAAU,cAAc;AAAA,EAChC;AAAA,EACA,aACE,UACA,SACe;AACf,UAAM,UAAU,cAAc;AAAA,EAChC;AAAA,EACA,qBACE,UACAA,SACA,SACe;AACf,UAAM,UAAU,sBAAsB;AAAA,EACxC;AAAA,EACA,YAAY,QAGgB;AAC1B,UAAM,UAAU,aAAa;AAAA,EAC/B;AAAA,EACA,UAAU,KAA+B;AACvC,UAAM,UAAU,WAAW;AAAA,EAC7B;AAAA,EACA,eAA4B;AAC1B,UAAM,UAAU,cAAc;AAAA,EAChC;AAAA,EACA,qBAAwC;AACtC,UAAM,UAAU,oBAAoB;AAAA,EACtC;AAAA,EACA,aAAwB;AACtB,UAAM,UAAU,YAAY;AAAA,EAC9B;AAAA,EACA,eAAkC;AAChC,UAAM,UAAU,cAAc;AAAA,EAChC;AACF;AAEO,SAAS,uBACd,aACA,QACA;AAEA,aAAW,MAAM,kBAAkB;AACjC,gBAAY,UAAU,EAAE,IAAI,OAAO,UAAU,EAAE;AAAA,EACjD;AACF;;;;"}
|
|
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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"}
|