omegga 1.2.9 → 1.3.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.
Files changed (255) hide show
  1. package/README.md +20 -1
  2. package/dist/brickadia/config.js +26 -90
  3. package/dist/brickadia/config.js.map +1 -1
  4. package/dist/brickadia/server.js +294 -293
  5. package/dist/brickadia/server.js.map +1 -1
  6. package/dist/cli/auth.js +149 -177
  7. package/dist/cli/auth.js.map +1 -1
  8. package/dist/cli/config.js +64 -66
  9. package/dist/cli/config.js.map +1 -1
  10. package/dist/cli/index.js +14 -14
  11. package/dist/cli/index.js.map +1 -1
  12. package/dist/cli/installer.js +37 -43
  13. package/dist/cli/installer.js.map +1 -1
  14. package/dist/cli/plugin.js +651 -682
  15. package/dist/cli/plugin.js.map +1 -1
  16. package/dist/cli/terminal.js +811 -733
  17. package/dist/cli/terminal.js.map +1 -1
  18. package/dist/config/formats/format_js.js +6 -6
  19. package/dist/config/formats/format_js.js.map +1 -1
  20. package/dist/config/formats/format_yml.js +7 -10
  21. package/dist/config/formats/format_yml.js.map +1 -1
  22. package/dist/config/index.js +46 -68
  23. package/dist/config/index.js.map +1 -1
  24. package/dist/config/reader.js +16 -27
  25. package/dist/config/reader.js.map +1 -1
  26. package/dist/config/validator.js +23 -25
  27. package/dist/config/validator.js.map +1 -1
  28. package/dist/config/writer.js +11 -21
  29. package/dist/config/writer.js.map +1 -1
  30. package/dist/index.js +18 -64
  31. package/dist/index.js.map +1 -1
  32. package/dist/info/default_commands.json.js +39 -0
  33. package/dist/info/default_commands.json.js.map +1 -0
  34. package/dist/logger.js +61 -60
  35. package/dist/logger.js.map +1 -1
  36. package/dist/main.js +424 -471
  37. package/dist/main.js.map +1 -1
  38. package/dist/omegga/auth.js +101 -148
  39. package/dist/omegga/auth.js.map +1 -1
  40. package/dist/omegga/commandInjector.js +261 -251
  41. package/dist/omegga/commandInjector.js.map +1 -1
  42. package/dist/omegga/index.js +14 -52
  43. package/dist/omegga/index.js.map +1 -1
  44. package/dist/omegga/logWrangler.js +224 -275
  45. package/dist/omegga/logWrangler.js.map +1 -1
  46. package/dist/omegga/matchers/auth.js +36 -50
  47. package/dist/omegga/matchers/auth.js.map +1 -1
  48. package/dist/omegga/matchers/chat.js +49 -71
  49. package/dist/omegga/matchers/chat.js.map +1 -1
  50. package/dist/omegga/matchers/command.js +25 -36
  51. package/dist/omegga/matchers/command.js.map +1 -1
  52. package/dist/omegga/matchers/exit.js +15 -18
  53. package/dist/omegga/matchers/exit.js.map +1 -1
  54. package/dist/omegga/matchers/index.js +26 -40
  55. package/dist/omegga/matchers/index.js.map +1 -1
  56. package/dist/omegga/matchers/init.js +20 -23
  57. package/dist/omegga/matchers/init.js.map +1 -1
  58. package/dist/omegga/matchers/interact.js +58 -64
  59. package/dist/omegga/matchers/interact.js.map +1 -1
  60. package/dist/omegga/matchers/join.js +74 -95
  61. package/dist/omegga/matchers/join.js.map +1 -1
  62. package/dist/omegga/matchers/leave.js +43 -56
  63. package/dist/omegga/matchers/leave.js.map +1 -1
  64. package/dist/omegga/matchers/mapChange.js +26 -35
  65. package/dist/omegga/matchers/mapChange.js.map +1 -1
  66. package/dist/omegga/matchers/minigameJoin.js +24 -31
  67. package/dist/omegga/matchers/minigameJoin.js.map +1 -1
  68. package/dist/omegga/matchers/version.js +42 -49
  69. package/dist/omegga/matchers/version.js.map +1 -1
  70. package/dist/omegga/player.js +527 -527
  71. package/dist/omegga/player.js.map +1 -1
  72. package/dist/omegga/plugin/interface.js +91 -98
  73. package/dist/omegga/plugin/interface.js.map +1 -1
  74. package/dist/omegga/plugin/plugin_jsonrpc_stdio.js +524 -429
  75. package/dist/omegga/plugin/plugin_jsonrpc_stdio.js.map +1 -1
  76. package/dist/omegga/plugin/plugin_node_safe/proxyOmegga.js +282 -294
  77. package/dist/omegga/plugin/plugin_node_safe/proxyOmegga.js.map +1 -1
  78. package/dist/omegga/plugin/plugin_node_safe.js +365 -393
  79. package/dist/omegga/plugin/plugin_node_safe.js.map +1 -1
  80. package/dist/omegga/plugin/plugin_node_unsafe.js +119 -179
  81. package/dist/omegga/plugin/plugin_node_unsafe.js.map +1 -1
  82. package/dist/omegga/plugin.js +402 -347
  83. package/dist/omegga/plugin.js.map +1 -1
  84. package/dist/omegga/server.js +742 -774
  85. package/dist/omegga/server.js.map +1 -1
  86. package/dist/omegga/wrapper.js +64 -91
  87. package/dist/omegga/wrapper.js.map +1 -1
  88. package/dist/plugin.js +11 -31
  89. package/dist/plugin.js.map +1 -1
  90. package/dist/softconfig.js +121 -100
  91. package/dist/softconfig.js.map +1 -1
  92. package/dist/updater/steam.js +97 -112
  93. package/dist/updater/steam.js.map +1 -1
  94. package/dist/util/brdb.js +496 -528
  95. package/dist/util/brdb.js.map +1 -1
  96. package/dist/util/brick/checkBounds.js +11 -15
  97. package/dist/util/brick/checkBounds.js.map +1 -1
  98. package/dist/util/brick/constants.js +723 -174
  99. package/dist/util/brick/constants.js.map +1 -1
  100. package/dist/util/brick/displayName.js +204 -211
  101. package/dist/util/brick/displayName.js.map +1 -1
  102. package/dist/util/brick/getBounds.js +29 -41
  103. package/dist/util/brick/getBounds.js.map +1 -1
  104. package/dist/util/brick/getBrickSize.js +6 -7
  105. package/dist/util/brick/getBrickSize.js.map +1 -1
  106. package/dist/util/brick/getScaleAxis.js +24 -30
  107. package/dist/util/brick/getScaleAxis.js.map +1 -1
  108. package/dist/util/brick/index.js +8 -29
  109. package/dist/util/brick/index.js.map +1 -1
  110. package/dist/util/brick/rotate.js +29 -34
  111. package/dist/util/brick/rotate.js.map +1 -1
  112. package/dist/util/brick/setOwnership.js +13 -19
  113. package/dist/util/brick/setOwnership.js.map +1 -1
  114. package/dist/util/chat.js +53 -44
  115. package/dist/util/chat.js.map +1 -1
  116. package/dist/util/color.js +112 -124
  117. package/dist/util/color.js.map +1 -1
  118. package/dist/util/file.js +54 -98
  119. package/dist/util/file.js.map +1 -1
  120. package/dist/util/index.js +84 -106
  121. package/dist/util/index.js.map +1 -1
  122. package/dist/util/map.js +18 -20
  123. package/dist/util/map.js.map +1 -1
  124. package/dist/util/pattern.js +6 -9
  125. package/dist/util/pattern.js.map +1 -1
  126. package/dist/util/time.js +31 -34
  127. package/dist/util/time.js.map +1 -1
  128. package/dist/util/uuid.js +10 -8
  129. package/dist/util/uuid.js.map +1 -1
  130. package/dist/util/wsl.js +19 -25
  131. package/dist/util/wsl.js.map +1 -1
  132. package/dist/version.js +7 -9
  133. package/dist/version.js.map +1 -1
  134. package/dist/webserver/backend/api.js +784 -874
  135. package/dist/webserver/backend/api.js.map +1 -1
  136. package/dist/webserver/backend/calendar.js +14 -17
  137. package/dist/webserver/backend/calendar.js.map +1 -1
  138. package/dist/webserver/backend/database.js +563 -613
  139. package/dist/webserver/backend/database.js.map +1 -1
  140. package/dist/webserver/backend/index.js +153 -191
  141. package/dist/webserver/backend/index.js.map +1 -1
  142. package/dist/webserver/backend/metrics.js +219 -248
  143. package/dist/webserver/backend/metrics.js.map +1 -1
  144. package/dist/webserver/backend/util.js +47 -68
  145. package/dist/webserver/backend/util.js.map +1 -1
  146. package/dist/worker.js +322 -0
  147. package/dist/worker.js.map +1 -0
  148. package/package.json +14 -10
  149. package/templates/safe-ts/omegga.d.ts +1 -1
  150. package/vite.backend.config.mts +46 -0
  151. package/vite.frontend.config.mts +58 -0
  152. package/vitest.backend.config.mts +7 -0
  153. package/dist/brickadia/config.d.ts +0 -3
  154. package/dist/brickadia/presets.d.ts +0 -65
  155. package/dist/brickadia/presets.js +0 -3
  156. package/dist/brickadia/presets.js.map +0 -1
  157. package/dist/brickadia/server.d.ts +0 -36
  158. package/dist/brickadia/types.d.ts +0 -45
  159. package/dist/brickadia/types.js +0 -3
  160. package/dist/brickadia/types.js.map +0 -1
  161. package/dist/cli/auth.d.ts +0 -26
  162. package/dist/cli/config.d.ts +0 -10
  163. package/dist/cli/index.d.ts +0 -30
  164. package/dist/cli/installer.d.ts +0 -1
  165. package/dist/cli/plugin.d.ts +0 -22
  166. package/dist/cli/terminal.d.ts +0 -25
  167. package/dist/config/authorizer.d.ts +0 -2
  168. package/dist/config/authorizer.js +0 -38
  169. package/dist/config/authorizer.js.map +0 -1
  170. package/dist/config/formats/format_js.d.ts +0 -3
  171. package/dist/config/formats/format_yml.d.ts +0 -3
  172. package/dist/config/index.d.ts +0 -18
  173. package/dist/config/reader.d.ts +0 -3
  174. package/dist/config/types.d.ts +0 -50
  175. package/dist/config/types.js +0 -3
  176. package/dist/config/types.js.map +0 -1
  177. package/dist/config/validator.d.ts +0 -6
  178. package/dist/config/writer.d.ts +0 -3
  179. package/dist/index.d.ts +0 -22
  180. package/dist/info/default_commands.json +0 -29
  181. package/dist/logger.d.ts +0 -41
  182. package/dist/main.d.ts +0 -1
  183. package/dist/omegga/auth.d.ts +0 -9
  184. package/dist/omegga/commandInjector.d.ts +0 -35
  185. package/dist/omegga/index.d.ts +0 -7
  186. package/dist/omegga/logWrangler.d.ts +0 -32
  187. package/dist/omegga/matchers/auth.d.ts +0 -10
  188. package/dist/omegga/matchers/chat.d.ts +0 -10
  189. package/dist/omegga/matchers/command.d.ts +0 -7
  190. package/dist/omegga/matchers/exit.d.ts +0 -3
  191. package/dist/omegga/matchers/index.d.ts +0 -3
  192. package/dist/omegga/matchers/init.d.ts +0 -3
  193. package/dist/omegga/matchers/interact.d.ts +0 -4
  194. package/dist/omegga/matchers/join.d.ts +0 -4
  195. package/dist/omegga/matchers/leave.d.ts +0 -4
  196. package/dist/omegga/matchers/mapChange.d.ts +0 -3
  197. package/dist/omegga/matchers/minigameJoin.d.ts +0 -9
  198. package/dist/omegga/matchers/types.d.ts +0 -5
  199. package/dist/omegga/matchers/types.js +0 -3
  200. package/dist/omegga/matchers/types.js.map +0 -1
  201. package/dist/omegga/matchers/version.d.ts +0 -3
  202. package/dist/omegga/player.d.ts +0 -81
  203. package/dist/omegga/plugin/interface.d.ts +0 -30
  204. package/dist/omegga/plugin/plugin_jsonrpc_stdio.d.ts +0 -23
  205. package/dist/omegga/plugin/plugin_node_safe/proxyOmegga.d.ts +0 -145
  206. package/dist/omegga/plugin/plugin_node_safe/worker.d.ts +0 -1
  207. package/dist/omegga/plugin/plugin_node_safe/worker.js +0 -367
  208. package/dist/omegga/plugin/plugin_node_safe/worker.js.map +0 -1
  209. package/dist/omegga/plugin/plugin_node_safe.d.ts +0 -23
  210. package/dist/omegga/plugin/plugin_node_unsafe.d.ts +0 -13
  211. package/dist/omegga/plugin.d.ts +0 -63
  212. package/dist/omegga/server.d.ts +0 -166
  213. package/dist/omegga/types.d.ts +0 -49
  214. package/dist/omegga/types.js +0 -3
  215. package/dist/omegga/types.js.map +0 -1
  216. package/dist/omegga/wrapper.d.ts +0 -32
  217. package/dist/plugin.d.ts +0 -916
  218. package/dist/softconfig.d.ts +0 -67
  219. package/dist/tsconfig.tsbuildinfo +0 -1
  220. package/dist/updater/index.d.ts +0 -1
  221. package/dist/updater/index.js +0 -10
  222. package/dist/updater/index.js.map +0 -1
  223. package/dist/updater/steam.d.ts +0 -52
  224. package/dist/util/brdb.d.ts +0 -31
  225. package/dist/util/brick/checkBounds.d.ts +0 -8
  226. package/dist/util/brick/constants.d.ts +0 -18
  227. package/dist/util/brick/displayName.d.ts +0 -7
  228. package/dist/util/brick/getBounds.d.ts +0 -5
  229. package/dist/util/brick/getBrickSize.d.ts +0 -3
  230. package/dist/util/brick/getScaleAxis.d.ts +0 -3
  231. package/dist/util/brick/index.d.ts +0 -14
  232. package/dist/util/brick/rotate.d.ts +0 -16
  233. package/dist/util/brick/setOwnership.d.ts +0 -12
  234. package/dist/util/chat.d.ts +0 -23
  235. package/dist/util/color.d.ts +0 -13
  236. package/dist/util/file.d.ts +0 -5
  237. package/dist/util/index.d.ts +0 -183
  238. package/dist/util/map.d.ts +0 -6
  239. package/dist/util/pattern.d.ts +0 -1
  240. package/dist/util/time.d.ts +0 -39
  241. package/dist/util/uuid.d.ts +0 -3
  242. package/dist/util/wsl.d.ts +0 -2
  243. package/dist/version.d.ts +0 -2
  244. package/dist/webserver/backend/api.d.ts +0 -115
  245. package/dist/webserver/backend/calendar.d.ts +0 -5
  246. package/dist/webserver/backend/database.d.ts +0 -150
  247. package/dist/webserver/backend/index.d.ts +0 -30
  248. package/dist/webserver/backend/metrics.d.ts +0 -3
  249. package/dist/webserver/backend/types.d.ts +0 -114
  250. package/dist/webserver/backend/types.js +0 -3
  251. package/dist/webserver/backend/types.js.map +0 -1
  252. package/dist/webserver/backend/util.d.ts +0 -2
  253. package/dist/webserver/index.d.ts +0 -2
  254. package/dist/webserver/index.js +0 -9
  255. package/dist/webserver/index.js.map +0 -1
@@ -1,447 +1,542 @@
1
1
  "use strict";
2
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
3
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
4
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
5
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
6
- };
7
- var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
8
- if (kind === "m") throw new TypeError("Private method is not writable");
9
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
10
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
11
- return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
12
- };
13
- var __importDefault = (this && this.__importDefault) || function (mod) {
14
- return (mod && mod.__esModule) ? mod : { "default": mod };
15
- };
16
- var _RpcPlugin_child, _RpcPlugin_rpc, _RpcPlugin_errInterface, _RpcPlugin_outInterface;
17
- Object.defineProperty(exports, "__esModule", { value: true });
18
- const logger_1 = __importDefault(require("../../logger"));
19
- const child_process_1 = require("child_process");
20
- const fs_1 = __importDefault(require("fs"));
21
- const json_rpc_2_0_1 = require("json-rpc-2.0");
22
- const path_1 = __importDefault(require("path"));
23
- const readline_1 = __importDefault(require("readline"));
24
- const interface_1 = require("./interface");
25
- const proxyOmegga_1 = require("./plugin_node_safe/proxyOmegga");
26
- // TODO: check if version is compatible (v1 -> v2) from file
27
- // TODO: write jsonrpc wrappers in a few languages, implement a few simple plugins
28
- // TODO: languages: [ python, go ]
29
- const MAIN_FILE = 'omegga_plugin';
30
- const DOC_FILE = 'doc.json';
31
- const PLUGIN_FILE = 'plugin.json';
32
- class RpcPlugin extends interface_1.Plugin {
33
- // all RPC plugins require a main (binary) file and a doc file
34
- static canLoad(pluginPath) {
35
- return (fs_1.default.existsSync(path_1.default.join(pluginPath, MAIN_FILE)) &&
36
- fs_1.default.existsSync(path_1.default.join(pluginPath, DOC_FILE)));
2
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
+ const logger = require("../../logger.js");
4
+ const jsonRpc2_0 = require("json-rpc-2.0");
5
+ const node_child_process = require("node:child_process");
6
+ const fs = require("node:fs");
7
+ const path = require("node:path");
8
+ const readline = require("readline");
9
+ const _interface = require("./interface.js");
10
+ const proxyOmegga = require("./plugin_node_safe/proxyOmegga.js");
11
+ const MAIN_FILE = "omegga_plugin";
12
+ const DOC_FILE = "doc.json";
13
+ const PLUGIN_FILE = "plugin.json";
14
+ class RpcPlugin extends _interface.Plugin {
15
+ #child;
16
+ #rpc;
17
+ #errInterface;
18
+ #outInterface;
19
+ // all RPC plugins require a main (binary) file and a doc file
20
+ static canLoad(pluginPath) {
21
+ return fs.existsSync(path.join(pluginPath, MAIN_FILE)) && fs.existsSync(path.join(pluginPath, DOC_FILE));
22
+ }
23
+ // websocket rpc plugin type
24
+ static getFormat() {
25
+ return "jsonrpc_stdio";
26
+ }
27
+ // documentation is based on doc.json file
28
+ getDocumentation() {
29
+ return this.documentation;
30
+ }
31
+ constructor(pluginPath, omegga) {
32
+ super(pluginPath, omegga);
33
+ this.messageCounter = 0;
34
+ this.documentation = _interface.Plugin.readJSON(path.join(pluginPath, DOC_FILE));
35
+ this.pluginConfig = _interface.Plugin.readJSON(path.join(pluginPath, PLUGIN_FILE));
36
+ this.pluginFile = path.join(pluginPath, MAIN_FILE);
37
+ this.eventPassthrough = this.eventPassthrough.bind(this);
38
+ this.commands = [];
39
+ this.initRPC();
40
+ }
41
+ isLoaded() {
42
+ return !!this.#child && !this.#child.exitCode;
43
+ }
44
+ // determing if a command is registered
45
+ isCommand(cmd) {
46
+ return this.commands.includes(cmd);
47
+ }
48
+ // spawn the plugin as a child process
49
+ async load() {
50
+ const name = this.getName();
51
+ const verbose = (...msg) => logger.default.verbose(name.underline, ...msg);
52
+ verbose("Load method invoked");
53
+ let frozen = true, timed = false;
54
+ this.commands = [];
55
+ if (this.#child) {
56
+ verbose("Plugin already has child process");
57
+ return false;
37
58
  }
38
- // websocket rpc plugin type
39
- static getFormat() {
40
- return 'jsonrpc_stdio';
59
+ let config;
60
+ try {
61
+ verbose("Getting plugin config");
62
+ config = await this.storage.getConfig();
63
+ } catch (e) {
64
+ return false;
41
65
  }
42
- // documentation is based on doc.json file
43
- getDocumentation() {
44
- return this.documentation;
66
+ try {
67
+ if (this.pluginConfig?.emitConfig) {
68
+ verbose("Emitting plugin config");
69
+ await fs.promises.writeFile(
70
+ path.join(this.path, this.pluginConfig.emitConfig),
71
+ JSON.stringify(config)
72
+ );
73
+ }
74
+ verbose("Spawning child process");
75
+ this.#child = node_child_process.spawn(this.pluginFile);
76
+ this.#child.stdin.setDefaultEncoding("utf8");
77
+ this.#outInterface = readline.createInterface({
78
+ input: this.#child.stdout,
79
+ terminal: false
80
+ });
81
+ this.#errInterface = readline.createInterface({
82
+ input: this.#child.stderr,
83
+ terminal: false
84
+ });
85
+ this.attachListeners();
86
+ } catch (err) {
87
+ logger.default.errorp(
88
+ "error loading stdio rpc plugin",
89
+ name.brightRed.underline,
90
+ err
91
+ );
92
+ await this.kill();
93
+ this.emitStatus();
94
+ return false;
45
95
  }
46
- constructor(pluginPath, omegga) {
47
- super(pluginPath, omegga);
48
- _RpcPlugin_child.set(this, void 0);
49
- _RpcPlugin_rpc.set(this, void 0);
50
- _RpcPlugin_errInterface.set(this, void 0);
51
- _RpcPlugin_outInterface.set(this, void 0);
52
- this.messageCounter = 0;
53
- // TODO: validate documentation
54
- this.documentation = interface_1.Plugin.readJSON(path_1.default.join(pluginPath, DOC_FILE));
55
- this.pluginConfig = interface_1.Plugin.readJSON(path_1.default.join(pluginPath, PLUGIN_FILE));
56
- this.pluginFile = path_1.default.join(pluginPath, MAIN_FILE);
57
- this.eventPassthrough = this.eventPassthrough.bind(this);
58
- this.commands = [];
59
- this.initRPC();
60
- }
61
- isLoaded() {
62
- return !!__classPrivateFieldGet(this, _RpcPlugin_child, "f") && !__classPrivateFieldGet(this, _RpcPlugin_child, "f").exitCode;
63
- }
64
- // determing if a command is registered
65
- isCommand(cmd) {
66
- return this.commands.includes(cmd);
67
- }
68
- // spawn the plugin as a child process
69
- async load() {
70
- var _a;
71
- const name = this.getName();
72
- const verbose = (...msg) => logger_1.default.verbose(name.underline, ...msg);
73
- verbose('Load method invoked');
74
- let frozen = true, timed = false;
75
- this.commands = [];
76
- // can't load the plugin if the child is still running
77
- if (__classPrivateFieldGet(this, _RpcPlugin_child, "f")) {
78
- verbose('Plugin already has child process');
79
- return false;
80
- }
81
- let config;
96
+ return Promise.race([
97
+ (async () => {
82
98
  try {
83
- verbose('Getting plugin config');
84
- config = await this.storage.getConfig();
85
- }
86
- catch (e) {
87
- return false;
88
- }
89
- try {
90
- if ((_a = this.pluginConfig) === null || _a === void 0 ? void 0 : _a.emitConfig) {
91
- verbose('Emitting plugin config');
92
- await fs_1.default.promises.writeFile(path_1.default.join(this.path, this.pluginConfig.emitConfig), JSON.stringify(config));
99
+ const initialData = proxyOmegga.bootstrap(this.omegga);
100
+ verbose("Sending initial data");
101
+ for (const ev in initialData) {
102
+ this.notify(ev, initialData[ev]);
103
+ }
104
+ verbose("Initializing event passthrough");
105
+ this.omegga.on("*", this.eventPassthrough);
106
+ try {
107
+ verbose("Waiting for plugin to start...");
108
+ const result = await this.emit("init", config);
109
+ verbose("Initialized with result:", result);
110
+ if (typeof result === "object" && result) {
111
+ const cmds = result.registeredCommands;
112
+ if (cmds && cmds instanceof Array && cmds.every((i) => typeof i === "string"))
113
+ this.commands = cmds;
93
114
  }
94
- verbose('Spawning child process');
95
- __classPrivateFieldSet(this, _RpcPlugin_child, (0, child_process_1.spawn)(this.pluginFile), "f");
96
- __classPrivateFieldGet(this, _RpcPlugin_child, "f").stdin.setDefaultEncoding('utf8');
97
- __classPrivateFieldSet(this, _RpcPlugin_outInterface, readline_1.default.createInterface({
98
- input: __classPrivateFieldGet(this, _RpcPlugin_child, "f").stdout,
99
- terminal: false,
100
- }), "f");
101
- __classPrivateFieldSet(this, _RpcPlugin_errInterface, readline_1.default.createInterface({
102
- input: __classPrivateFieldGet(this, _RpcPlugin_child, "f").stderr,
103
- terminal: false,
104
- }), "f");
105
- this.attachListeners();
106
- }
107
- catch (err) {
108
- logger_1.default.errorp('error loading stdio rpc plugin', name.brightRed.underline, err);
109
- await this.kill();
110
- this.emitStatus();
111
- return false;
112
- }
113
- return Promise.race([
114
- (async () => {
115
- try {
116
- // get some initial information to create an omegga proxy
117
- const initialData = (0, proxyOmegga_1.bootstrap)(this.omegga);
118
- verbose('Sending initial data');
119
- // send all of the mock events to the proxy omegga
120
- for (const ev in initialData) {
121
- // send some initial information
122
- this.notify(ev, initialData[ev]);
123
- }
124
- verbose('Initializing event passthrough');
125
- // pass events through
126
- this.omegga.on('*', this.eventPassthrough);
127
- try {
128
- // tell the plugin to start
129
- verbose('Waiting for plugin to start...');
130
- const result = await this.emit('init', config);
131
- verbose('Initialized with result:', result);
132
- // plugins can return a result object
133
- if (typeof result === 'object' && result) {
134
- // if registeredCommands is in the results, register the provided strings as commands
135
- const cmds = result.registeredCommands;
136
- if (cmds &&
137
- cmds instanceof Array &&
138
- cmds.every(i => typeof i === 'string'))
139
- this.commands = cmds;
140
- }
141
- }
142
- catch (e) {
143
- if (!e.message)
144
- return;
145
- logger_1.default.errorp(name.brightRed.underline, 'error starting: ', e);
146
- }
147
- // plugin is not frozen, resolve that it has loaded
148
- frozen = false;
149
- if (timed)
150
- return;
151
- this.emitStatus();
152
- return true;
153
- }
154
- catch (e) {
155
- if (timed)
156
- return;
157
- logger_1.default.errorp('error loading stdio rpc plugin', name.brightRed.underline, e);
158
- await this.kill();
159
- frozen = false;
160
- this.emitStatus();
161
- return false;
162
- }
163
- })(),
164
- new Promise(resolve => {
165
- // let user know if the child quit while launching
166
- __classPrivateFieldGet(this, _RpcPlugin_child, "f").once('exit', () => {
167
- if (!frozen || timed)
168
- return;
169
- verbose('Plugin exited during init');
170
- frozen = false;
171
- this.emitStatus();
172
- resolve(false);
173
- });
174
- // check if the child is frozen (while true)
175
- setTimeout(() => {
176
- if (!frozen)
177
- return;
178
- logger_1.default.errorp('I appear to be unresponsive when starting (maybe I forgot to respond to init)', name.brightRed.underline);
179
- this.kill();
180
- timed = true;
181
- this.emitStatus();
182
- resolve(false);
183
- }, 5000);
184
- }),
185
- ]);
186
- }
187
- // kill the child process after requesting it to stop
188
- unload() {
189
- if (!__classPrivateFieldGet(this, _RpcPlugin_child, "f") || __classPrivateFieldGet(this, _RpcPlugin_child, "f").exitCode) {
190
- this.detachListeners();
191
- this.emitStatus();
192
- return Promise.resolve(true);
115
+ } catch (e) {
116
+ if (!e.message) return;
117
+ logger.default.errorp(name.brightRed.underline, "error starting: ", e);
118
+ }
119
+ frozen = false;
120
+ if (timed) return;
121
+ this.emitStatus();
122
+ return true;
123
+ } catch (e) {
124
+ if (timed) return;
125
+ logger.default.errorp(
126
+ "error loading stdio rpc plugin",
127
+ name.brightRed.underline,
128
+ e
129
+ );
130
+ await this.kill();
131
+ frozen = false;
132
+ this.emitStatus();
133
+ return false;
193
134
  }
194
- let frozen = true, timed = false;
195
- const name = this.getName();
196
- return Promise.race([
197
- (async () => {
198
- try {
199
- // let the plugin know it's time to stop, if this error it's probably because the method was not implemented
200
- try {
201
- await this.emit('stop');
202
- }
203
- catch (e) {
204
- // lazy developer - just implement stop please
205
- }
206
- await this.kill();
207
- frozen = false;
208
- if (timed)
209
- return;
210
- this.emitStatus();
211
- this.commands = [];
212
- return true;
213
- }
214
- catch (e) {
215
- if (timed)
216
- return;
217
- logger_1.default.errorp('error unloading rpc plugin', name.brightRed.underline, e);
218
- frozen = false;
219
- this.emitStatus();
220
- return false;
221
- }
222
- })(),
223
- // this is wrapped in a promise for the freeze check
224
- new Promise(resolve => {
225
- // check if the child is frozen (while true)
226
- setTimeout(() => {
227
- if (!frozen)
228
- return;
229
- logger_1.default.errorp('I appear to be unresponsive when stopping (maybe I forgot to respond to stop)', name.brightRed.underline);
230
- this.kill();
231
- timed = true;
232
- this.emitStatus();
233
- resolve(true);
234
- }, 5000);
235
- }),
236
- ]);
237
- }
238
- // attaches event listeners
239
- attachListeners() {
240
- const name = this.getName();
241
- __classPrivateFieldGet(this, _RpcPlugin_outInterface, "f").on('line', line => {
242
- try {
243
- const rpcData = JSON.parse(line);
244
- try {
245
- __classPrivateFieldGet(this, _RpcPlugin_rpc, "f").receiveAndSend(rpcData);
246
- }
247
- catch (e) {
248
- logger_1.default.error(this.getName().brightRed.underline, '!>'.red, 'error parsing rpc data', e, line);
249
- }
250
- }
251
- catch (_a) {
252
- // fallback to logging
253
- logger_1.default.log(name.underline, '>>'.green, line);
254
- }
255
- });
256
- // stderr - print out the errors
257
- __classPrivateFieldGet(this, _RpcPlugin_errInterface, "f").on('line', err => {
258
- logger_1.default.error(name.brightRed.underline, '!>'.red, err);
135
+ })(),
136
+ new Promise((resolve) => {
137
+ this.#child.once("exit", () => {
138
+ if (!frozen || timed) return;
139
+ verbose("Plugin exited during init");
140
+ frozen = false;
141
+ this.emitStatus();
142
+ resolve(false);
259
143
  });
260
- __classPrivateFieldGet(this, _RpcPlugin_child, "f").on('error', () => this.kill());
261
- __classPrivateFieldGet(this, _RpcPlugin_child, "f").on('close', () => this.kill());
262
- __classPrivateFieldGet(this, _RpcPlugin_child, "f").on('exit', code => {
263
- logger_1.default.errorp('!>'.red, 'rpc plugin', name.brightRed.underline, 'exited with code', code);
264
- this.kill();
265
- });
266
- }
267
- // removes previously attached event listeners
268
- detachListeners() {
269
- __classPrivateFieldGet(this, _RpcPlugin_outInterface, "f").removeAllListeners('line');
270
- __classPrivateFieldGet(this, _RpcPlugin_errInterface, "f").removeAllListeners('line');
271
- if (__classPrivateFieldGet(this, _RpcPlugin_child, "f")) {
272
- __classPrivateFieldGet(this, _RpcPlugin_child, "f").removeAllListeners('exit');
273
- __classPrivateFieldGet(this, _RpcPlugin_child, "f").removeAllListeners('close');
274
- __classPrivateFieldGet(this, _RpcPlugin_child, "f").removeAllListeners('error');
275
- }
144
+ setTimeout(() => {
145
+ if (!frozen) return;
146
+ logger.default.errorp(
147
+ "I appear to be unresponsive when starting (maybe I forgot to respond to init)",
148
+ name.brightRed.underline
149
+ );
150
+ this.kill();
151
+ timed = true;
152
+ this.emitStatus();
153
+ resolve(false);
154
+ }, 5e3);
155
+ })
156
+ ]);
157
+ }
158
+ // kill the child process after requesting it to stop
159
+ unload() {
160
+ if (!this.#child || this.#child.exitCode) {
161
+ this.detachListeners();
162
+ this.emitStatus();
163
+ return Promise.resolve(true);
276
164
  }
277
- // write a string to the child process
278
- writeln(line) {
165
+ let frozen = true, timed = false;
166
+ const name = this.getName();
167
+ return Promise.race([
168
+ (async () => {
279
169
  try {
280
- if (__classPrivateFieldGet(this, _RpcPlugin_child, "f") && !__classPrivateFieldGet(this, _RpcPlugin_child, "f").exitCode)
281
- __classPrivateFieldGet(this, _RpcPlugin_child, "f").stdin.write(line + '\n');
170
+ try {
171
+ await this.emit("stop");
172
+ } catch (e) {
173
+ }
174
+ await this.kill();
175
+ frozen = false;
176
+ if (timed) return;
177
+ this.emitStatus();
178
+ this.commands = [];
179
+ return true;
180
+ } catch (e) {
181
+ if (timed) return;
182
+ logger.default.errorp(
183
+ "error unloading rpc plugin",
184
+ name.brightRed.underline,
185
+ e
186
+ );
187
+ frozen = false;
188
+ this.emitStatus();
189
+ return false;
282
190
  }
283
- catch (e) {
284
- // the child probably died... oops!
191
+ })(),
192
+ // this is wrapped in a promise for the freeze check
193
+ new Promise((resolve) => {
194
+ setTimeout(() => {
195
+ if (!frozen) return;
196
+ logger.default.errorp(
197
+ "I appear to be unresponsive when stopping (maybe I forgot to respond to stop)",
198
+ name.brightRed.underline
199
+ );
200
+ this.kill();
201
+ timed = true;
202
+ this.emitStatus();
203
+ resolve(true);
204
+ }, 5e3);
205
+ })
206
+ ]);
207
+ }
208
+ // attaches event listeners
209
+ attachListeners() {
210
+ const name = this.getName();
211
+ this.#outInterface.on("line", (line) => {
212
+ try {
213
+ const rpcData = JSON.parse(line);
214
+ try {
215
+ this.#rpc.receiveAndSend(rpcData);
216
+ } catch (e) {
217
+ logger.default.error(
218
+ this.getName().brightRed.underline,
219
+ "!>".red,
220
+ "error parsing rpc data",
221
+ e,
222
+ line
223
+ );
285
224
  }
225
+ } catch {
226
+ logger.default.log(name.underline, ">>".green, line);
227
+ }
228
+ });
229
+ this.#errInterface.on("line", (err) => {
230
+ logger.default.error(name.brightRed.underline, "!>".red, err);
231
+ });
232
+ this.#child.on("error", () => this.kill());
233
+ this.#child.on("close", () => this.kill());
234
+ this.#child.on("exit", (code) => {
235
+ logger.default.errorp(
236
+ "!>".red,
237
+ "rpc plugin",
238
+ name.brightRed.underline,
239
+ "exited with code",
240
+ code
241
+ );
242
+ this.kill();
243
+ });
244
+ }
245
+ // removes previously attached event listeners
246
+ detachListeners() {
247
+ this.#outInterface.removeAllListeners("line");
248
+ this.#errInterface.removeAllListeners("line");
249
+ if (this.#child) {
250
+ this.#child.removeAllListeners("exit");
251
+ this.#child.removeAllListeners("close");
252
+ this.#child.removeAllListeners("error");
286
253
  }
287
- // forcibly kills the plugin
288
- async kill() {
289
- __classPrivateFieldGet(this, _RpcPlugin_rpc, "f").rejectAllPendingRequests('Plugin Terminated');
290
- this.detachListeners();
291
- this.omegga.off('*', this.eventPassthrough);
292
- if (!__classPrivateFieldGet(this, _RpcPlugin_child, "f"))
293
- return;
294
- // create a promise for the exit of the process
295
- const promise = new Promise(resolve => __classPrivateFieldGet(this, _RpcPlugin_child, "f").once('exit', resolve));
296
- // kill the process
297
- __classPrivateFieldGet(this, _RpcPlugin_child, "f").kill('SIGINT');
298
- // ...kill it again just to make sure it's dead
299
- (0, child_process_1.spawn)('kill', ['-9', __classPrivateFieldGet(this, _RpcPlugin_child, "f").pid + '']);
300
- // wait for the process to exit
301
- await promise;
302
- __classPrivateFieldSet(this, _RpcPlugin_child, undefined, "f");
303
- this.emitStatus();
254
+ }
255
+ // write a string to the child process
256
+ writeln(line) {
257
+ try {
258
+ if (this.#child && !this.#child.exitCode)
259
+ this.#child.stdin.write(line + "\n");
260
+ } catch (e) {
304
261
  }
305
- eventPassthrough(type, ...args) {
306
- if (!__classPrivateFieldGet(this, _RpcPlugin_child, "f"))
307
- return;
308
- this.notify(type, args);
309
- }
310
- // setup the JSONRPC communication
311
- initRPC() {
312
- const server = new json_rpc_2_0_1.JSONRPCServer();
313
- const client = new json_rpc_2_0_1.JSONRPCClient(req => {
314
- try {
315
- this.writeln(JSON.stringify(req));
316
- return Promise.resolve();
317
- }
318
- catch (error) {
319
- return Promise.reject(error);
320
- }
321
- });
322
- const rpc = (__classPrivateFieldSet(this, _RpcPlugin_rpc, new json_rpc_2_0_1.JSONRPCServerAndClient(server, client), "f"));
323
- // plugin log generator function
324
- const ezLog = (logFn, name, symbol) => (line) => console[logFn](name.underline, symbol, line);
325
- const name = this.getName();
326
- // server can output logs special formatting for stdout
327
- rpc.addMethod('log', ezLog('log', name, '>>'.green));
328
- rpc.addMethod('error', ezLog('error', name.brightRed, '!>'.red));
329
- rpc.addMethod('info', ezLog('info', name, '#>'.blue));
330
- rpc.addMethod('debug', ezLog('debug', name, '?>'.blue));
331
- rpc.addMethod('warn', ezLog('warn', name.brightYellow, ':>'.yellow));
332
- rpc.addMethod('trace', ezLog('trace', name, 'T>'.grey));
333
- // plugin store interactions
334
- rpc.addMethod('store.get', key => this.storage.get(key));
335
- rpc.addMethod('store.set', ([key, value]) => this.storage.set(key, value));
336
- rpc.addMethod('store.delete', key => this.storage.delete(key));
337
- rpc.addMethod('store.wipe', () => this.storage.wipe());
338
- rpc.addMethod('store.count', () => this.storage.count());
339
- rpc.addMethod('store.keys', () => this.storage.keys());
340
- // server can run console commands
341
- rpc.addMethod('exec', line => this.omegga.writeln(line));
342
- rpc.addMethod('writeln', line => this.omegga.writeln(line));
343
- rpc.addMethod('broadcast', line => this.omegga.broadcast(line));
344
- rpc.addMethod('whisper', ({ target, line }) => this.omegga.whisper(target, line));
345
- rpc.addMethod('middlePrint', ({ target, line }) => this.omegga.middlePrint(target, line));
346
- rpc.addMethod('getPlayers', () => this.omegga.getPlayers());
347
- rpc.addMethod('getPlayerPosition', name => { var _a; return (_a = this.omegga.getPlayer(name)) === null || _a === void 0 ? void 0 : _a.getPosition(); }); // included for compatibility
348
- rpc.addMethod('getAllPlayerPositions', () => this.omegga.getAllPlayerPositions());
349
- rpc.addMethod('getEnvironmentPresets', () => this.omegga.getEnvironmentPresets());
350
- rpc.addMethod('resetEnvironment', () => this.omegga.resetEnvironment());
351
- rpc.addMethod('saveEnvironment', name => this.omegga.saveEnvironment(name));
352
- rpc.addMethod('loadEnvironment', name => this.omegga.loadEnvironment(name));
353
- rpc.addMethod('loadEnvironmentData', data => this.omegga.loadEnvironmentData(data));
354
- rpc.addMethod('getServerStatus', () => this.omegga.getServerStatus());
355
- rpc.addMethod('getMinigames', () => this.omegga.getMinigames());
356
- rpc.addMethod('getMinigamePresets', () => this.omegga.getMinigamePresets());
357
- rpc.addMethod('saveMinigame', ({ index, name }) => this.omegga.saveMinigame(index, name));
358
- rpc.addMethod('loadMinigame', ({ name, owner }) => this.omegga.loadMinigame(name, owner));
359
- rpc.addMethod('nextRoundMinigame', index => this.omegga.nextRoundMinigame(index));
360
- rpc.addMethod('resetMinigame', index => this.omegga.resetMinigame(index));
361
- rpc.addMethod('deleteMinigame', index => this.omegga.deleteMinigame(index));
362
- rpc.addMethod('listMinigames', () => this.omegga.listMinigames());
363
- rpc.addMethod('getHostId', () => this.omegga.getHostId());
364
- rpc.addMethod('getRoleSetup', () => this.omegga.getRoleSetup());
365
- rpc.addMethod('getBanList', () => this.omegga.getBanList());
366
- rpc.addMethod('getSaves', () => this.omegga.getSaves());
367
- rpc.addMethod('getSavePath', name => this.omegga.getSavePath(name));
368
- rpc.addMethod('clearBricks', ({ target, quiet = false }) => this.omegga.clearBricks(target, quiet));
369
- rpc.addMethod('clearAllBricks', quiet => this.omegga.clearAllBricks(quiet));
370
- rpc.addMethod('saveBricks', name => this.omegga.saveBricks(name));
371
- rpc.addMethod('loadBricks', ({ name, offX = 0, offY = 0, offZ = 0, quiet = false, }) => this.omegga.loadBricks(name, { offX, offY, offZ, quiet }));
372
- rpc.addMethod('loadBricksOnPlayer', ({ name, player, offX = 0, offY = 0, offZ = 0, }) => this.omegga.loadBricksOnPlayer(name, player, { offX, offY, offZ }));
373
- rpc.addMethod('readSaveData', name => this.omegga.readSaveData(name));
374
- rpc.addMethod('getSaveData', () => this.omegga.getSaveData());
375
- rpc.addMethod('loadSaveData', ({ data, offX = 0, offY = 0, offZ = 0, quiet = false, }) => this.omegga.loadSaveData(data, { offX, offY, offZ, quiet }));
376
- rpc.addMethod('loadSaveDataOnPlayer', ({ data, player, offX = 0, offY = 0, offZ = 0, }) => this.omegga.loadSaveDataOnPlayer(data, player, { offX, offY, offZ }));
377
- rpc.addMethod('changeMap', map => this.omegga.changeMap(map));
378
- rpc.addMethod('unload', () => this.unload());
379
- rpc.addMethod('reload', async () => {
380
- await this.unload();
381
- await this.load();
382
- });
383
- // player related operations
384
- const addPlayerMethod = (name) => rpc.addMethod(`player.${name}`, player => { var _a; return (_a = this.omegga.getPlayer(player)) === null || _a === void 0 ? void 0 : _a[name](); });
385
- rpc.addMethod('player.get', target => {
386
- let player = this.omegga.getPlayer(target);
387
- return player && { ...player, host: player.isHost() };
388
- });
389
- addPlayerMethod('getRoles');
390
- addPlayerMethod('getPermissions');
391
- addPlayerMethod('getNameColor');
392
- addPlayerMethod('getPosition');
393
- addPlayerMethod('getGhostBrick');
394
- addPlayerMethod('getPaint');
395
- addPlayerMethod('getTemplateBounds');
396
- addPlayerMethod('getTemplateBoundsData');
397
- rpc.addMethod('player.loadDataAtGhostBrick', ({ target, data, rotate = true, offX = 0, offY = 0, offZ = 0, quiet = false, }) => {
398
- var _a;
399
- return (_a = this.omegga
400
- .getPlayer(target)) === null || _a === void 0 ? void 0 : _a.loadDataAtGhostBrick(data, { rotate, offX, offY, offZ, quiet });
401
- });
402
- rpc.addMethod('player.loadSaveData', ({ target, data, offX = 0, offY = 0, offZ = 0, }) => { var _a; return (_a = this.omegga.getPlayer(target)) === null || _a === void 0 ? void 0 : _a.loadSaveData(data, { offX, offY, offZ }); });
403
- // plugin related operations
404
- rpc.addMethod('plugin.get', async (name) => {
405
- const plugin = this.omegga.pluginLoader.plugins.find(p => p.getName() === name);
406
- if (plugin) {
407
- return {
408
- name,
409
- documentation: plugin.getDocumentation(),
410
- loaded: plugin.isLoaded(),
411
- };
412
- }
413
- else {
414
- return null;
415
- }
416
- });
417
- rpc.addMethod('plugin.emit', async ([name, event, ...args]) => {
418
- const plugin = this.omegga.pluginLoader.plugins.find(p => p.getName() === name);
419
- if (plugin) {
420
- return plugin.emitPlugin(event, this.getName(), args);
421
- }
422
- else {
423
- return null;
424
- }
425
- });
426
- }
427
- // emit a custom plugin event
428
- async emitPlugin(event, from, args) {
429
- return await this.emit('plugin:emit', [event, from, ...args]);
430
- }
431
- // emit a message to the plugin via the jsonrpc client and expect a response
432
- emit(type, arg) {
433
- return __classPrivateFieldGet(this, _RpcPlugin_rpc, "f").request(type, arg);
434
- }
435
- // emit a message to the plugin via the jsonrpc client, don't expect a response
436
- notify(type, arg) {
437
- try {
438
- __classPrivateFieldGet(this, _RpcPlugin_rpc, "f").notify(type, arg);
439
- }
440
- catch (e) {
441
- // this only happens if the RPC library is hitting some issues - probably redundant
262
+ }
263
+ // forcibly kills the plugin
264
+ async kill() {
265
+ this.#rpc.rejectAllPendingRequests("Plugin Terminated");
266
+ this.detachListeners();
267
+ this.omegga.off("*", this.eventPassthrough);
268
+ if (!this.#child) return;
269
+ const promise = new Promise((resolve) => this.#child.once("exit", resolve));
270
+ this.#child.kill("SIGINT");
271
+ node_child_process.spawn("kill", ["-9", this.#child.pid + ""]);
272
+ await promise;
273
+ this.#child = void 0;
274
+ this.emitStatus();
275
+ }
276
+ eventPassthrough(type, ...args) {
277
+ if (!this.#child) return;
278
+ this.notify(type, args);
279
+ }
280
+ // setup the JSONRPC communication
281
+ initRPC() {
282
+ const server = new jsonRpc2_0.JSONRPCServer();
283
+ const client = new jsonRpc2_0.JSONRPCClient((req) => {
284
+ try {
285
+ this.writeln(JSON.stringify(req));
286
+ return Promise.resolve();
287
+ } catch (error) {
288
+ return Promise.reject(error);
289
+ }
290
+ });
291
+ const rpc = this.#rpc = new jsonRpc2_0.JSONRPCServerAndClient(server, client);
292
+ const ezLog = (logFn, name2, symbol) => (line) => console[logFn](name2.underline, symbol, line);
293
+ const name = this.getName();
294
+ rpc.addMethod("log", ezLog("log", name, ">>".green));
295
+ rpc.addMethod("error", ezLog("error", name.brightRed, "!>".red));
296
+ rpc.addMethod("info", ezLog("info", name, "#>".blue));
297
+ rpc.addMethod("debug", ezLog("debug", name, "?>".blue));
298
+ rpc.addMethod("warn", ezLog("warn", name.brightYellow, ":>".yellow));
299
+ rpc.addMethod("trace", ezLog("trace", name, "T>".grey));
300
+ rpc.addMethod(
301
+ "store.get",
302
+ (key) => this.storage.get(key)
303
+ );
304
+ rpc.addMethod(
305
+ "store.set",
306
+ ([key, value]) => this.storage.set(key, value)
307
+ );
308
+ rpc.addMethod(
309
+ "store.delete",
310
+ (key) => this.storage.delete(key)
311
+ );
312
+ rpc.addMethod("store.wipe", () => this.storage.wipe());
313
+ rpc.addMethod("store.count", () => this.storage.count());
314
+ rpc.addMethod("store.keys", () => this.storage.keys());
315
+ rpc.addMethod(
316
+ "exec",
317
+ (line) => this.omegga.writeln(line)
318
+ );
319
+ rpc.addMethod(
320
+ "writeln",
321
+ (line) => this.omegga.writeln(line)
322
+ );
323
+ rpc.addMethod(
324
+ "broadcast",
325
+ (line) => this.omegga.broadcast(line)
326
+ );
327
+ rpc.addMethod(
328
+ "whisper",
329
+ ({ target, line }) => this.omegga.whisper(target, line)
330
+ );
331
+ rpc.addMethod(
332
+ "middlePrint",
333
+ ({ target, line }) => this.omegga.middlePrint(target, line)
334
+ );
335
+ rpc.addMethod("getPlayers", () => this.omegga.getPlayers());
336
+ rpc.addMethod(
337
+ "getPlayerPosition",
338
+ (name2) => this.omegga.getPlayer(name2)?.getPosition()
339
+ );
340
+ rpc.addMethod(
341
+ "getAllPlayerPositions",
342
+ () => this.omegga.getAllPlayerPositions()
343
+ );
344
+ rpc.addMethod(
345
+ "getEnvironmentPresets",
346
+ () => this.omegga.getEnvironmentPresets()
347
+ );
348
+ rpc.addMethod("resetEnvironment", () => this.omegga.resetEnvironment());
349
+ rpc.addMethod(
350
+ "saveEnvironment",
351
+ (name2) => this.omegga.saveEnvironment(name2)
352
+ );
353
+ rpc.addMethod(
354
+ "loadEnvironment",
355
+ (name2) => this.omegga.loadEnvironment(name2)
356
+ );
357
+ rpc.addMethod(
358
+ "loadEnvironmentData",
359
+ (data) => this.omegga.loadEnvironmentData(data)
360
+ );
361
+ rpc.addMethod("getServerStatus", () => this.omegga.getServerStatus());
362
+ rpc.addMethod("getMinigames", () => this.omegga.getMinigames());
363
+ rpc.addMethod("getMinigamePresets", () => this.omegga.getMinigamePresets());
364
+ rpc.addMethod(
365
+ "saveMinigame",
366
+ ({ index, name: name2 }) => this.omegga.saveMinigame(index, name2)
367
+ );
368
+ rpc.addMethod(
369
+ "loadMinigame",
370
+ ({ name: name2, owner }) => this.omegga.loadMinigame(name2, owner)
371
+ );
372
+ rpc.addMethod(
373
+ "nextRoundMinigame",
374
+ (index) => this.omegga.nextRoundMinigame(index)
375
+ );
376
+ rpc.addMethod(
377
+ "resetMinigame",
378
+ (index) => this.omegga.resetMinigame(index)
379
+ );
380
+ rpc.addMethod(
381
+ "deleteMinigame",
382
+ (index) => this.omegga.deleteMinigame(index)
383
+ );
384
+ rpc.addMethod("listMinigames", () => this.omegga.listMinigames());
385
+ rpc.addMethod("getHostId", () => this.omegga.getHostId());
386
+ rpc.addMethod("getRoleSetup", () => this.omegga.getRoleSetup());
387
+ rpc.addMethod("getBanList", () => this.omegga.getBanList());
388
+ rpc.addMethod("getSaves", () => this.omegga.getSaves());
389
+ rpc.addMethod(
390
+ "getSavePath",
391
+ (name2) => this.omegga.getSavePath(name2)
392
+ );
393
+ rpc.addMethod(
394
+ "clearBricks",
395
+ ({ target, quiet = false }) => this.omegga.clearBricks(target, quiet)
396
+ );
397
+ rpc.addMethod(
398
+ "clearAllBricks",
399
+ (quiet) => this.omegga.clearAllBricks(quiet)
400
+ );
401
+ rpc.addMethod(
402
+ "saveBricks",
403
+ (name2) => this.omegga.saveBricks(name2)
404
+ );
405
+ rpc.addMethod(
406
+ "loadBricks",
407
+ ({
408
+ name: name2,
409
+ offX = 0,
410
+ offY = 0,
411
+ offZ = 0,
412
+ quiet = false
413
+ }) => this.omegga.loadBricks(name2, { offX, offY, offZ, quiet })
414
+ );
415
+ rpc.addMethod(
416
+ "loadBricksOnPlayer",
417
+ ({
418
+ name: name2,
419
+ player,
420
+ offX = 0,
421
+ offY = 0,
422
+ offZ = 0
423
+ }) => this.omegga.loadBricksOnPlayer(name2, player, { offX, offY, offZ })
424
+ );
425
+ rpc.addMethod(
426
+ "readSaveData",
427
+ (name2) => this.omegga.readSaveData(name2)
428
+ );
429
+ rpc.addMethod("getSaveData", () => this.omegga.getSaveData());
430
+ rpc.addMethod(
431
+ "loadSaveData",
432
+ ({
433
+ data,
434
+ offX = 0,
435
+ offY = 0,
436
+ offZ = 0,
437
+ quiet = false
438
+ }) => this.omegga.loadSaveData(data, { offX, offY, offZ, quiet })
439
+ );
440
+ rpc.addMethod(
441
+ "loadSaveDataOnPlayer",
442
+ ({
443
+ data,
444
+ player,
445
+ offX = 0,
446
+ offY = 0,
447
+ offZ = 0
448
+ }) => this.omegga.loadSaveDataOnPlayer(data, player, { offX, offY, offZ })
449
+ );
450
+ rpc.addMethod(
451
+ "changeMap",
452
+ (map) => this.omegga.changeMap(map)
453
+ );
454
+ rpc.addMethod("unload", () => this.unload());
455
+ rpc.addMethod("reload", async () => {
456
+ await this.unload();
457
+ await this.load();
458
+ });
459
+ const addPlayerMethod = (name2) => rpc.addMethod(
460
+ `player.${name2}`,
461
+ (player) => this.omegga.getPlayer(player)?.[name2]()
462
+ );
463
+ rpc.addMethod("player.get", (target) => {
464
+ let player = this.omegga.getPlayer(target);
465
+ return player && { ...player, host: player.isHost() };
466
+ });
467
+ addPlayerMethod("getRoles");
468
+ addPlayerMethod("getPermissions");
469
+ addPlayerMethod("getNameColor");
470
+ addPlayerMethod("getPosition");
471
+ addPlayerMethod("getGhostBrick");
472
+ addPlayerMethod("getPaint");
473
+ addPlayerMethod("getTemplateBounds");
474
+ addPlayerMethod("getTemplateBoundsData");
475
+ rpc.addMethod(
476
+ "player.loadDataAtGhostBrick",
477
+ ({
478
+ target,
479
+ data,
480
+ rotate = true,
481
+ offX = 0,
482
+ offY = 0,
483
+ offZ = 0,
484
+ quiet = false
485
+ }) => this.omegga.getPlayer(target)?.loadDataAtGhostBrick(data, { rotate, offX, offY, offZ, quiet })
486
+ );
487
+ rpc.addMethod(
488
+ "player.loadSaveData",
489
+ ({
490
+ target,
491
+ data,
492
+ offX = 0,
493
+ offY = 0,
494
+ offZ = 0
495
+ }) => this.omegga.getPlayer(target)?.loadSaveData(data, { offX, offY, offZ })
496
+ );
497
+ rpc.addMethod("plugin.get", async (name2) => {
498
+ const plugin = this.omegga.pluginLoader.plugins.find(
499
+ (p) => p.getName() === name2
500
+ );
501
+ if (plugin) {
502
+ return {
503
+ name: name2,
504
+ documentation: plugin.getDocumentation(),
505
+ loaded: plugin.isLoaded()
506
+ };
507
+ } else {
508
+ return null;
509
+ }
510
+ });
511
+ rpc.addMethod(
512
+ "plugin.emit",
513
+ async ([name2, event, ...args]) => {
514
+ const plugin = this.omegga.pluginLoader.plugins.find(
515
+ (p) => p.getName() === name2
516
+ );
517
+ if (plugin) {
518
+ return plugin.emitPlugin(event, this.getName(), args);
519
+ } else {
520
+ return null;
442
521
  }
522
+ }
523
+ );
524
+ }
525
+ // emit a custom plugin event
526
+ async emitPlugin(event, from, args) {
527
+ return await this.emit("plugin:emit", [event, from, ...args]);
528
+ }
529
+ // emit a message to the plugin via the jsonrpc client and expect a response
530
+ emit(type, arg) {
531
+ return this.#rpc.request(type, arg);
532
+ }
533
+ // emit a message to the plugin via the jsonrpc client, don't expect a response
534
+ notify(type, arg) {
535
+ try {
536
+ this.#rpc.notify(type, arg);
537
+ } catch (e) {
443
538
  }
539
+ }
444
540
  }
445
- _RpcPlugin_child = new WeakMap(), _RpcPlugin_rpc = new WeakMap(), _RpcPlugin_errInterface = new WeakMap(), _RpcPlugin_outInterface = new WeakMap();
446
541
  exports.default = RpcPlugin;
447
- //# sourceMappingURL=plugin_jsonrpc_stdio.js.map
542
+ //# sourceMappingURL=plugin_jsonrpc_stdio.js.map