omegga 1.4.0 → 1.5.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/.claude/settings.local.json +39 -0
- package/CHANGELOG.md +690 -0
- package/README.md +23 -2
- package/bin/omegga +1 -1
- package/dist/brickadia/server.js +1 -1
- package/dist/brickadia/server.js.map +1 -1
- package/dist/cli/terminal.js +47 -13
- package/dist/cli/terminal.js.map +1 -1
- package/dist/config/index.js +6 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/types.js +51 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config/validator.js +8 -20
- package/dist/config/validator.js.map +1 -1
- package/dist/index.js +12 -6
- package/dist/index.js.map +1 -1
- package/dist/logger.js +38 -8
- package/dist/logger.js.map +1 -1
- package/dist/main.js +27 -1
- package/dist/main.js.map +1 -1
- package/dist/omegga/matchers/command.js +10 -0
- package/dist/omegga/matchers/command.js.map +1 -1
- package/dist/omegga/plugin/plugin_node_unsafe.js +6 -0
- package/dist/omegga/plugin/plugin_node_unsafe.js.map +1 -1
- package/dist/omegga/server.js +51 -5
- package/dist/omegga/server.js.map +1 -1
- package/dist/omegga/wrapper.js +1 -0
- package/dist/omegga/wrapper.js.map +1 -1
- package/dist/plugin.js +1 -2
- package/dist/plugin.js.map +1 -1
- package/dist/updater/steam.js +175 -68
- package/dist/updater/steam.js.map +1 -1
- package/dist/util/brick/checkBounds.js +1 -2
- package/dist/util/brick/checkBounds.js.map +1 -1
- package/dist/util/brick/displayName.js +1 -2
- package/dist/util/brick/displayName.js.map +1 -1
- package/dist/util/brick/getBounds.js +1 -2
- package/dist/util/brick/getBounds.js.map +1 -1
- package/dist/util/brick/getBrickSize.js +1 -2
- package/dist/util/brick/getBrickSize.js.map +1 -1
- package/dist/util/brick/getScaleAxis.js +1 -2
- package/dist/util/brick/getScaleAxis.js.map +1 -1
- package/dist/util/brick/setOwnership.js +1 -2
- package/dist/util/brick/setOwnership.js.map +1 -1
- package/dist/webserver/backend/database.js +5 -3
- package/dist/webserver/backend/database.js.map +1 -1
- package/dist/webserver/backend/events.js +7 -0
- package/dist/webserver/backend/events.js.map +1 -0
- package/dist/webserver/backend/index.js +64 -26
- package/dist/webserver/backend/index.js.map +1 -1
- package/dist/webserver/backend/metrics.js +122 -11
- package/dist/webserver/backend/metrics.js.map +1 -1
- package/dist/webserver/backend/router/chat.js +58 -0
- package/dist/webserver/backend/router/chat.js.map +1 -0
- package/dist/webserver/backend/router/index.js +23 -0
- package/dist/webserver/backend/router/index.js.map +1 -0
- package/dist/webserver/backend/router/player.js +248 -0
- package/dist/webserver/backend/router/player.js.map +1 -0
- package/dist/webserver/backend/router/plugin.js +150 -0
- package/dist/webserver/backend/router/plugin.js.map +1 -0
- package/dist/webserver/backend/router/role.js +17 -0
- package/dist/webserver/backend/router/role.js.map +1 -0
- package/dist/webserver/backend/router/server.js +181 -0
- package/dist/webserver/backend/router/server.js.map +1 -0
- package/dist/webserver/backend/router/session.js +33 -0
- package/dist/webserver/backend/router/session.js.map +1 -0
- package/dist/webserver/backend/router/user.js +93 -0
- package/dist/webserver/backend/router/user.js.map +1 -0
- package/dist/webserver/backend/router/world.js +139 -0
- package/dist/webserver/backend/router/world.js.map +1 -0
- package/dist/webserver/backend/trpc.js +48 -0
- package/dist/webserver/backend/trpc.js.map +1 -0
- package/dist/webserver/backend/util.js +18 -0
- package/dist/webserver/backend/util.js.map +1 -1
- package/package.json +10 -5
- package/public/app.html +122 -4
- package/public/assets/IconWorldPlus-Dkos72Ws.js +2 -0
- package/public/assets/IconWorldPlus-Dkos72Ws.js.map +1 -0
- package/public/assets/app-CLZ-5FIi.js +6 -0
- package/public/assets/app-CLZ-5FIi.js.map +1 -0
- package/public/assets/client-BT1QYH0O.js.map +1 -1
- package/public/assets/index-DLZ8-XzO.js +4 -0
- package/public/assets/index-DLZ8-XzO.js.map +1 -0
- package/public/assets/shared/@components-DPHARroA.js +2 -0
- package/public/assets/shared/@components-DPHARroA.js.map +1 -0
- package/public/assets/shared/@tabler_icons-react-iQk11eD_.js +3 -0
- package/public/assets/shared/{@tabler_icons-react-B4bN8gHc.js.map → @tabler_icons-react-iQk11eD_.js.map} +1 -1
- package/public/auth.html +13 -1
- package/dist/info/default_commands.json.js +0 -39
- package/dist/info/default_commands.json.js.map +0 -1
- package/dist/webserver/backend/api.js +0 -797
- package/dist/webserver/backend/api.js.map +0 -1
- package/public/assets/IconWorldPlus-DpfueG8_.js +0 -2
- package/public/assets/IconWorldPlus-DpfueG8_.js.map +0 -1
- package/public/assets/app-nJIpyOiP.js +0 -6
- package/public/assets/app-nJIpyOiP.js.map +0 -1
- package/public/assets/index-3dNmNZ9B.js +0 -10
- package/public/assets/index-3dNmNZ9B.js.map +0 -1
- package/public/assets/shared/@components-DdtLZOaA.js +0 -2
- package/public/assets/shared/@components-DdtLZOaA.js.map +0 -1
- package/public/assets/shared/@tabler_icons-react-B4bN8gHc.js +0 -3
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const zod = require("zod");
|
|
4
|
+
const ServerConfigSchema = zod.z.object({
|
|
5
|
+
webui: zod.z.boolean().optional(),
|
|
6
|
+
port: zod.z.number().optional(),
|
|
7
|
+
https: zod.z.boolean().optional(),
|
|
8
|
+
plugins: zod.z.boolean().optional(),
|
|
9
|
+
singleUser: zod.z.boolean().optional(),
|
|
10
|
+
debug: zod.z.boolean().optional()
|
|
11
|
+
});
|
|
12
|
+
const BrickadiaConfigSchema = zod.z.object({
|
|
13
|
+
port: zod.z.number(),
|
|
14
|
+
map: zod.z.string().optional(),
|
|
15
|
+
world: zod.z.string().optional(),
|
|
16
|
+
branch: zod.z.string().optional(),
|
|
17
|
+
steambeta: zod.z.string().optional(),
|
|
18
|
+
steambetaPassword: zod.z.string().optional(),
|
|
19
|
+
name: zod.z.string().optional(),
|
|
20
|
+
description: zod.z.string().optional(),
|
|
21
|
+
password: zod.z.string().optional(),
|
|
22
|
+
players: zod.z.number().optional(),
|
|
23
|
+
publiclyListed: zod.z.boolean().optional(),
|
|
24
|
+
welcomeMessage: zod.z.string().optional(),
|
|
25
|
+
authDir: zod.z.string().optional(),
|
|
26
|
+
savedDir: zod.z.string().optional(),
|
|
27
|
+
launchArgs: zod.z.string().optional(),
|
|
28
|
+
__LOCAL: zod.z.boolean().optional(),
|
|
29
|
+
__LEGACY: zod.z.string().optional()
|
|
30
|
+
});
|
|
31
|
+
const TerminalConfigSchema = zod.z.object({
|
|
32
|
+
timestamp: zod.z.string().optional()
|
|
33
|
+
});
|
|
34
|
+
const CredentialsSchema = zod.z.object({
|
|
35
|
+
email: zod.z.string().optional(),
|
|
36
|
+
password: zod.z.string().optional(),
|
|
37
|
+
token: zod.z.string().optional()
|
|
38
|
+
});
|
|
39
|
+
const ConfigSchema = zod.z.object({
|
|
40
|
+
omegga: ServerConfigSchema.optional(),
|
|
41
|
+
server: BrickadiaConfigSchema,
|
|
42
|
+
terminal: TerminalConfigSchema.optional(),
|
|
43
|
+
credentials: CredentialsSchema.optional(),
|
|
44
|
+
__STEAM: zod.z.boolean().optional()
|
|
45
|
+
});
|
|
46
|
+
exports.BrickadiaConfigSchema = BrickadiaConfigSchema;
|
|
47
|
+
exports.ConfigSchema = ConfigSchema;
|
|
48
|
+
exports.CredentialsSchema = CredentialsSchema;
|
|
49
|
+
exports.ServerConfigSchema = ServerConfigSchema;
|
|
50
|
+
exports.TerminalConfigSchema = TerminalConfigSchema;
|
|
51
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sources":["../../src/config/types.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const ServerConfigSchema = z.object({\n webui: z.boolean().optional(),\n port: z.number().optional(),\n https: z.boolean().optional(),\n plugins: z.boolean().optional(),\n singleUser: z.boolean().optional(),\n debug: z.boolean().optional(),\n});\n\nexport const BrickadiaConfigSchema = z.object({\n port: z.number(),\n map: z.string().optional(),\n world: z.string().optional(),\n branch: z.string().optional(),\n steambeta: z.string().optional(),\n steambetaPassword: z.string().optional(),\n name: z.string().optional(),\n description: z.string().optional(),\n password: z.string().optional(),\n players: z.number().optional(),\n publiclyListed: z.boolean().optional(),\n welcomeMessage: z.string().optional(),\n authDir: z.string().optional(),\n savedDir: z.string().optional(),\n launchArgs: z.string().optional(),\n __LOCAL: z.boolean().optional(),\n __LEGACY: z.string().optional(),\n});\n\nexport const TerminalConfigSchema = z.object({\n timestamp: z.string().optional(),\n});\n\nexport const CredentialsSchema = z.object({\n email: z.string().optional(),\n password: z.string().optional(),\n token: z.string().optional(),\n});\n\nexport const ConfigSchema = z.object({\n omegga: ServerConfigSchema.optional(),\n server: BrickadiaConfigSchema,\n terminal: TerminalConfigSchema.optional(),\n credentials: CredentialsSchema.optional(),\n __STEAM: z.boolean().optional(),\n});\n\nexport type IServerConfig = z.infer<typeof ServerConfigSchema>;\nexport type IBrickadiaConfig = z.infer<typeof BrickadiaConfigSchema>;\nexport type IConfig = z.infer<typeof ConfigSchema>;\n\nexport type IConfigFormat = {\n extension: string;\n writer: (blob: IConfig) => string;\n} & (\n | {\n encoding: 'string';\n reader: (str: string) => IConfig;\n }\n | {\n encoding: 'buffer';\n reader: (str: Buffer) => IConfig;\n }\n);\n"],"names":["z"],"mappings":";;;AAEO,MAAM,qBAAqBA,IAAAA,EAAE,OAAO;AAAA,EACzC,OAAOA,IAAAA,EAAE,QAAA,EAAU,SAAA;AAAA,EACnB,MAAMA,IAAAA,EAAE,OAAA,EAAS,SAAA;AAAA,EACjB,OAAOA,IAAAA,EAAE,QAAA,EAAU,SAAA;AAAA,EACnB,SAASA,IAAAA,EAAE,QAAA,EAAU,SAAA;AAAA,EACrB,YAAYA,IAAAA,EAAE,QAAA,EAAU,SAAA;AAAA,EACxB,OAAOA,IAAAA,EAAE,QAAA,EAAU,SAAA;AACrB,CAAC;AAEM,MAAM,wBAAwBA,IAAAA,EAAE,OAAO;AAAA,EAC5C,MAAMA,IAAAA,EAAE,OAAA;AAAA,EACR,KAAKA,IAAAA,EAAE,OAAA,EAAS,SAAA;AAAA,EAChB,OAAOA,IAAAA,EAAE,OAAA,EAAS,SAAA;AAAA,EAClB,QAAQA,IAAAA,EAAE,OAAA,EAAS,SAAA;AAAA,EACnB,WAAWA,IAAAA,EAAE,OAAA,EAAS,SAAA;AAAA,EACtB,mBAAmBA,IAAAA,EAAE,OAAA,EAAS,SAAA;AAAA,EAC9B,MAAMA,IAAAA,EAAE,OAAA,EAAS,SAAA;AAAA,EACjB,aAAaA,IAAAA,EAAE,OAAA,EAAS,SAAA;AAAA,EACxB,UAAUA,IAAAA,EAAE,OAAA,EAAS,SAAA;AAAA,EACrB,SAASA,IAAAA,EAAE,OAAA,EAAS,SAAA;AAAA,EACpB,gBAAgBA,IAAAA,EAAE,QAAA,EAAU,SAAA;AAAA,EAC5B,gBAAgBA,IAAAA,EAAE,OAAA,EAAS,SAAA;AAAA,EAC3B,SAASA,IAAAA,EAAE,OAAA,EAAS,SAAA;AAAA,EACpB,UAAUA,IAAAA,EAAE,OAAA,EAAS,SAAA;AAAA,EACrB,YAAYA,IAAAA,EAAE,OAAA,EAAS,SAAA;AAAA,EACvB,SAASA,IAAAA,EAAE,QAAA,EAAU,SAAA;AAAA,EACrB,UAAUA,IAAAA,EAAE,OAAA,EAAS,SAAA;AACvB,CAAC;AAEM,MAAM,uBAAuBA,IAAAA,EAAE,OAAO;AAAA,EAC3C,WAAWA,IAAAA,EAAE,OAAA,EAAS,SAAA;AACxB,CAAC;AAEM,MAAM,oBAAoBA,IAAAA,EAAE,OAAO;AAAA,EACxC,OAAOA,IAAAA,EAAE,OAAA,EAAS,SAAA;AAAA,EAClB,UAAUA,IAAAA,EAAE,OAAA,EAAS,SAAA;AAAA,EACrB,OAAOA,IAAAA,EAAE,OAAA,EAAS,SAAA;AACpB,CAAC;AAEM,MAAM,eAAeA,IAAAA,EAAE,OAAO;AAAA,EACnC,QAAQ,mBAAmB,SAAA;AAAA,EAC3B,QAAQ;AAAA,EACR,UAAU,qBAAqB,SAAA;AAAA,EAC/B,aAAa,kBAAkB,SAAA;AAAA,EAC/B,SAASA,IAAAA,EAAE,QAAA,EAAU,SAAA;AACvB,CAAC;;;;;;"}
|
package/dist/config/validator.js
CHANGED
|
@@ -1,27 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
|
-
const
|
|
3
|
+
const types = require("./types.js");
|
|
4
4
|
const validate = (obj) => {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
return { valid: false, errors: ["contains invalid keys"] };
|
|
9
|
-
if (!("server" in obj) || typeof obj?.server !== "object")
|
|
10
|
-
return { valid: false, errors: ["missing/invalid server category"] };
|
|
11
|
-
if (typeof obj.server.port !== "number")
|
|
12
|
-
return { valid: false, errors: ["server.port must be a number"] };
|
|
13
|
-
const strings = ["branch", "authDir", "savedDir", "launchArgs"];
|
|
14
|
-
for (const s of strings) {
|
|
15
|
-
if (obj.server[s] && typeof obj.server[s] !== "string")
|
|
16
|
-
return { valid: false, errors: [`server.${s} must be a string`] };
|
|
5
|
+
const result = types.ConfigSchema.safeParse(obj);
|
|
6
|
+
if (result.success) {
|
|
7
|
+
return { valid: true, errors: [] };
|
|
17
8
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
return { valid: false, errors: ["omegga.port must be a number"] };
|
|
23
|
-
}
|
|
24
|
-
return { valid: true, errors: [] };
|
|
9
|
+
return {
|
|
10
|
+
valid: false,
|
|
11
|
+
errors: result.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`)
|
|
12
|
+
};
|
|
25
13
|
};
|
|
26
14
|
exports.default = validate;
|
|
27
15
|
//# sourceMappingURL=validator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.js","sources":["../../src/config/validator.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"validator.js","sources":["../../src/config/validator.ts"],"sourcesContent":["import { ConfigSchema } from './types';\n\nconst validate = (obj: unknown) => {\n const result = ConfigSchema.safeParse(obj);\n if (result.success) {\n return { valid: true as const, errors: [] as string[] };\n }\n return {\n valid: false as const,\n errors: result.error.issues.map(i => `${i.path.join('.')}: ${i.message}`),\n };\n};\n\nexport default validate;\n"],"names":["ConfigSchema"],"mappings":";;;AAEA,MAAM,WAAW,CAAC,QAAiB;AACjC,QAAM,SAASA,MAAAA,aAAa,UAAU,GAAG;AACzC,MAAI,OAAO,SAAS;AAClB,WAAO,EAAE,OAAO,MAAe,QAAQ,CAAA,EAAC;AAAA,EAC1C;AACA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,QAAQ,OAAO,MAAM,OAAO,IAAI,CAAA,MAAK,GAAG,EAAE,KAAK,KAAK,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE;AAAA,EAAA;AAE5E;;"}
|
package/dist/index.js
CHANGED
|
@@ -1,19 +1,25 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
|
+
const types = require("./config/types.js");
|
|
3
4
|
const plugin = require("./plugin.js");
|
|
4
5
|
const server$1 = require("./brickadia/server.js");
|
|
5
6
|
const config = require("./brickadia/config.js");
|
|
6
7
|
const server = require("./omegga/server.js");
|
|
7
|
-
const index = require("./omegga/index.js");
|
|
8
|
-
const index$
|
|
9
|
-
const index
|
|
8
|
+
const index$1 = require("./omegga/index.js");
|
|
9
|
+
const index$2 = require("./util/index.js");
|
|
10
|
+
const index = require("./config/index.js");
|
|
10
11
|
const brickadia = { Server: server$1, config };
|
|
12
|
+
exports.BrickadiaConfigSchema = types.BrickadiaConfigSchema;
|
|
13
|
+
exports.ConfigSchema = types.ConfigSchema;
|
|
14
|
+
exports.CredentialsSchema = types.CredentialsSchema;
|
|
15
|
+
exports.ServerConfigSchema = types.ServerConfigSchema;
|
|
16
|
+
exports.TerminalConfigSchema = types.TerminalConfigSchema;
|
|
11
17
|
exports.OmeggaPlugin = plugin.OmeggaPlugin;
|
|
12
18
|
exports._OMEGGA_UTILS_IMPORT = plugin._OMEGGA_UTILS_IMPORT;
|
|
13
19
|
exports.Omegga = server.default;
|
|
14
20
|
exports.default = server.default;
|
|
15
|
-
exports.omegga = index;
|
|
16
|
-
exports.util = index$
|
|
17
|
-
exports.config = index
|
|
21
|
+
exports.omegga = index$1;
|
|
22
|
+
exports.util = index$2;
|
|
23
|
+
exports.config = index;
|
|
18
24
|
exports.brickadia = brickadia;
|
|
19
25
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["/*\n Library module, includes all available resources\n*/\n\nexport * from '@omegga/types';\nexport * from '@config/types';\nexport * from '@brickadia/types';\n\nexport * from './plugin';\n\n/** BrickadiaServer - manages the server child process */\nimport * as Server from '@brickadia/server';\n/** config writer for brickadia */\nimport * as brConfig from '@brickadia/config';\n\nexport const brickadia = { Server, config: brConfig };\n\n/** the actual object can be required too */\nimport Omegga from '@omegga/server';\nexport default Omegga;\nexport { Omegga };\n\n/** brickadia server wrapper, log parser, and plugin runner */\nexport * as omegga from './omegga';\n\n/** utility functions */\nexport * as util from '@util';\n\n/** config */\nexport * as config from '@config';\n"],"names":["Server"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["/*\n Library module, includes all available resources\n*/\n\nexport * from '@omegga/types';\nexport * from '@config/types';\nexport * from '@brickadia/types';\n\nexport * from './plugin';\n\n/** BrickadiaServer - manages the server child process */\nimport * as Server from '@brickadia/server';\n/** config writer for brickadia */\nimport * as brConfig from '@brickadia/config';\n\nexport const brickadia = { Server, config: brConfig };\n\n/** the actual object can be required too */\nimport Omegga from '@omegga/server';\nexport default Omegga;\nexport { Omegga };\n\n/** brickadia server wrapper, log parser, and plugin runner */\nexport * as omegga from './omegga';\n\n/** utility functions */\nexport * as util from '@util';\n\n/** config */\nexport * as config from '@config';\n"],"names":["Server"],"mappings":";;;;;;;;;;AAeO,MAAM,YAAY,EAAA,QAAEA,UAAQ,OAAQ;;;;;;;;;;;;;;"}
|
package/dist/logger.js
CHANGED
|
@@ -4,54 +4,84 @@ class Logger {
|
|
|
4
4
|
static {
|
|
5
5
|
this.VERBOSE = false;
|
|
6
6
|
}
|
|
7
|
+
static {
|
|
8
|
+
this.dateformat = null;
|
|
9
|
+
}
|
|
10
|
+
static {
|
|
11
|
+
this.timestampFmt = null;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Set the timestamp format and load dateformat
|
|
15
|
+
*/
|
|
16
|
+
static setTimestamp(fmt) {
|
|
17
|
+
Logger.timestampFmt = fmt;
|
|
18
|
+
Logger.dateformat = require("dateformat").default;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Prepend a grey timestamp to args if configured
|
|
22
|
+
*/
|
|
23
|
+
static timestamped(args) {
|
|
24
|
+
if (!Logger.timestampFmt || !Logger.dateformat) return args;
|
|
25
|
+
return [Logger.dateformat(/* @__PURE__ */ new Date(), Logger.timestampFmt).grey, ...args];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Log with timestamp when no terminal, pass through to terminal otherwise
|
|
29
|
+
*/
|
|
30
|
+
static out(method, args) {
|
|
31
|
+
if (Logger.terminal) {
|
|
32
|
+
Logger.terminal[method](...args);
|
|
33
|
+
} else {
|
|
34
|
+
console[method](...Logger.timestamped(args));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
7
37
|
/**
|
|
8
38
|
* Send a console log to the readline terminal or stdout
|
|
9
39
|
*/
|
|
10
40
|
static log(...args) {
|
|
11
|
-
|
|
41
|
+
Logger.out("log", args);
|
|
12
42
|
}
|
|
13
43
|
/**
|
|
14
44
|
* Send a prefixed console log to the readline terminal or stdout
|
|
15
45
|
*/
|
|
16
46
|
static logp(...args) {
|
|
17
|
-
|
|
47
|
+
Logger.out("log", [">>".green, ...args]);
|
|
18
48
|
}
|
|
19
49
|
/**
|
|
20
50
|
* Send a console debug to the readline terminal or stdout
|
|
21
51
|
*/
|
|
22
52
|
static debug(...args) {
|
|
23
|
-
|
|
53
|
+
Logger.out("debug", args);
|
|
24
54
|
}
|
|
25
55
|
/**
|
|
26
56
|
* Send a console error to the readline terminal or stderr
|
|
27
57
|
*/
|
|
28
58
|
static error(...args) {
|
|
29
|
-
|
|
59
|
+
Logger.out("error", args);
|
|
30
60
|
}
|
|
31
61
|
/**
|
|
32
62
|
* Send a prefixed console error to the readline terminal or stderr
|
|
33
63
|
*/
|
|
34
64
|
static errorp(...args) {
|
|
35
|
-
|
|
65
|
+
Logger.out("error", ["!>".red, ...args]);
|
|
36
66
|
}
|
|
37
67
|
/**
|
|
38
68
|
* Send a console warn to the readline terminal or stdout
|
|
39
69
|
*/
|
|
40
70
|
static warn(...args) {
|
|
41
|
-
|
|
71
|
+
Logger.out("warn", args);
|
|
42
72
|
}
|
|
43
73
|
/**
|
|
44
74
|
* Send a prefixed console warn to the readline terminal or stdout
|
|
45
75
|
*/
|
|
46
76
|
static warnp(...args) {
|
|
47
|
-
|
|
77
|
+
Logger.out("warn", [">>".yellow, ...args]);
|
|
48
78
|
}
|
|
49
79
|
/**
|
|
50
80
|
* Send a console log when omegga is launched when --verbose
|
|
51
81
|
*/
|
|
52
82
|
static verbose(...args) {
|
|
53
83
|
if (!Logger.VERBOSE) return;
|
|
54
|
-
|
|
84
|
+
Logger.out("log", ["V>".magenta, ...args]);
|
|
55
85
|
}
|
|
56
86
|
/**
|
|
57
87
|
* Send a console log to the readline terminal or console
|
package/dist/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sources":["../src/logger.ts"],"sourcesContent":["import type Terminal from '@cli/terminal';\n\nexport default class Logger {\n static VERBOSE = false;\n static terminal: Terminal;\n\n /**\n * Send a console log to the readline terminal or stdout\n */\n static log(...args: any[]) {\n
|
|
1
|
+
{"version":3,"file":"logger.js","sources":["../src/logger.ts"],"sourcesContent":["import type Terminal from '@cli/terminal';\n\nexport default class Logger {\n static VERBOSE = false;\n static terminal: Terminal;\n private static dateformat: ((date: Date, fmt: string) => string) | null =\n null;\n private static timestampFmt: string | null = null;\n\n /**\n * Set the timestamp format and load dateformat\n */\n static setTimestamp(fmt: string) {\n Logger.timestampFmt = fmt;\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n Logger.dateformat = require('dateformat').default;\n }\n\n /**\n * Prepend a grey timestamp to args if configured\n */\n static timestamped(args: any[]): any[] {\n if (!Logger.timestampFmt || !Logger.dateformat) return args;\n return [Logger.dateformat(new Date(), Logger.timestampFmt).grey, ...args];\n }\n\n /**\n * Log with timestamp when no terminal, pass through to terminal otherwise\n */\n private static out(method: 'log' | 'debug' | 'warn' | 'error', args: any[]) {\n if (Logger.terminal) {\n Logger.terminal[method](...args);\n } else {\n console[method](...Logger.timestamped(args));\n }\n }\n\n /**\n * Send a console log to the readline terminal or stdout\n */\n static log(...args: any[]) {\n Logger.out('log', args);\n }\n\n /**\n * Send a prefixed console log to the readline terminal or stdout\n */\n static logp(...args: any[]) {\n Logger.out('log', ['>>'.green, ...args]);\n }\n\n /**\n * Send a console debug to the readline terminal or stdout\n */\n static debug(...args: any[]) {\n Logger.out('debug', args);\n }\n\n /**\n * Send a console error to the readline terminal or stderr\n */\n static error(...args: any[]) {\n Logger.out('error', args);\n }\n\n /**\n * Send a prefixed console error to the readline terminal or stderr\n */\n static errorp(...args: any[]) {\n Logger.out('error', ['!>'.red, ...args]);\n }\n\n /**\n * Send a console warn to the readline terminal or stdout\n */\n static warn(...args: any[]) {\n Logger.out('warn', args);\n }\n\n /**\n * Send a prefixed console warn to the readline terminal or stdout\n */\n static warnp(...args: any[]) {\n Logger.out('warn', ['>>'.yellow, ...args]);\n }\n\n /**\n * Send a console log when omegga is launched when --verbose\n */\n static verbose(...args: any[]) {\n if (!Logger.VERBOSE) return;\n Logger.out('log', ['V>'.magenta, ...args]);\n }\n\n /**\n * Send a console log to the readline terminal or console\n */\n static setTerminal(term: Terminal) {\n Logger.terminal = term;\n }\n}\n\nglobal.Logger = Logger;\n"],"names":[],"mappings":";;AAEA,MAAqB,OAAO;AAAA,EAC1B,OAAA;AAAA,SAAO,UAAU;AAAA,EAAA;AAAA,EAEjB,OAAA;AAAA,SAAe,aACb;AAAA,EAAA;AAAA,EACF,OAAA;AAAA,SAAe,eAA8B;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAK7C,OAAO,aAAa,KAAa;AAC/B,WAAO,eAAe;AAEtB,WAAO,aAAa,QAAQ,YAAY,EAAE;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,YAAY,MAAoB;AACrC,QAAI,CAAC,OAAO,gBAAgB,CAAC,OAAO,WAAY,QAAO;AACvD,WAAO,CAAC,OAAO,WAAW,oBAAI,KAAA,GAAQ,OAAO,YAAY,EAAE,MAAM,GAAG,IAAI;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,IAAI,QAA4C,MAAa;AAC1E,QAAI,OAAO,UAAU;AACnB,aAAO,SAAS,MAAM,EAAE,GAAG,IAAI;AAAA,IACjC,OAAO;AACL,cAAQ,MAAM,EAAE,GAAG,OAAO,YAAY,IAAI,CAAC;AAAA,IAC7C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,OAAO,MAAa;AACzB,WAAO,IAAI,OAAO,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,QAAQ,MAAa;AAC1B,WAAO,IAAI,OAAO,CAAC,KAAK,OAAO,GAAG,IAAI,CAAC;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,SAAS,MAAa;AAC3B,WAAO,IAAI,SAAS,IAAI;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,SAAS,MAAa;AAC3B,WAAO,IAAI,SAAS,IAAI;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,UAAU,MAAa;AAC5B,WAAO,IAAI,SAAS,CAAC,KAAK,KAAK,GAAG,IAAI,CAAC;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,QAAQ,MAAa;AAC1B,WAAO,IAAI,QAAQ,IAAI;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,SAAS,MAAa;AAC3B,WAAO,IAAI,QAAQ,CAAC,KAAK,QAAQ,GAAG,IAAI,CAAC;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,WAAW,MAAa;AAC7B,QAAI,CAAC,OAAO,QAAS;AACrB,WAAO,IAAI,OAAO,CAAC,KAAK,SAAS,GAAG,IAAI,CAAC;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,YAAY,MAAgB;AACjC,WAAO,WAAW;AAAA,EACpB;AACF;AAEA,OAAO,SAAS;;"}
|
package/dist/main.js
CHANGED
|
@@ -68,6 +68,9 @@ const program = commander.description(version.PKG.description).version(version.V
|
|
|
68
68
|
logger.default.verbose(error);
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
|
+
if (conf?.terminal?.timestamp) {
|
|
72
|
+
logger.default.setTimestamp(conf.terminal.timestamp);
|
|
73
|
+
}
|
|
71
74
|
const overrideBinary = softconfig.getOverrideGameBinary();
|
|
72
75
|
const isSteam = !conf?.server?.branch;
|
|
73
76
|
if (overrideBinary) {
|
|
@@ -201,6 +204,29 @@ program.command("init").description("Sets up the current directory as a brickadi
|
|
|
201
204
|
}
|
|
202
205
|
createDefaultConfig();
|
|
203
206
|
});
|
|
207
|
+
program.command("steamlogin").description("Interactively log in to Steam (for Steam Guard authentication)").action(async () => {
|
|
208
|
+
if (!process.env.STEAM_USERNAME) {
|
|
209
|
+
logger.default.errorp("STEAM_USERNAME environment variable is required.");
|
|
210
|
+
logger.default.errorp("Set it in your .env file or environment.");
|
|
211
|
+
process.exit(1);
|
|
212
|
+
}
|
|
213
|
+
if (!fs.existsSync(softconfig.STEAMCMD_PATH)) {
|
|
214
|
+
logger.default.errorp(
|
|
215
|
+
"SteamCMD is not installed. Run",
|
|
216
|
+
"omegga".yellow,
|
|
217
|
+
"first to set it up."
|
|
218
|
+
);
|
|
219
|
+
process.exit(1);
|
|
220
|
+
}
|
|
221
|
+
logger.default.logp("Logging in to Steam interactively...");
|
|
222
|
+
const success = await steam.steamcmdInteractiveLogin();
|
|
223
|
+
if (success) {
|
|
224
|
+
logger.default.logp("Steam login successful. Credentials are now cached.");
|
|
225
|
+
} else {
|
|
226
|
+
logger.default.errorp("Steam login failed.");
|
|
227
|
+
process.exit(1);
|
|
228
|
+
}
|
|
229
|
+
});
|
|
204
230
|
program.command("config [field] [value]").description(
|
|
205
231
|
"Configure Omegga's default behavior.\nType " + "omegga config list".yellow.underline + " for current settings and available fields"
|
|
206
232
|
).action((field, value) => {
|
|
@@ -444,7 +470,7 @@ async function setupSteam(config2, forceUpdate = false) {
|
|
|
444
470
|
}
|
|
445
471
|
logger.default.logp("Downloading Brickadia", (steambeta ?? "main").yellow, "...");
|
|
446
472
|
try {
|
|
447
|
-
steam.steamcmdDownloadGame({ steambeta, steambetaPassword });
|
|
473
|
+
await steam.steamcmdDownloadGame({ steambeta, steambetaPassword });
|
|
448
474
|
} catch (err) {
|
|
449
475
|
logger.default.errorp("Error downloading Brickadia:", err);
|
|
450
476
|
process.exit(1);
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sources":["../src/main.ts"],"sourcesContent":["import soft, {\n getOverrideGameBinary,\n getSteamGameDir,\n getSteamInstallDir,\n} from '@/softconfig';\nimport { installLauncher } from '@cli/installer';\nimport * as config from '@config';\nimport Omegga from '@omegga/server';\nimport * as file from '@util/file';\nimport 'colors';\nimport commander from 'commander';\nimport dotenv from 'dotenv';\nimport hasbin from 'hasbin';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport prompts from 'prompts';\nimport updateNotifier from 'update-notifier-cjs';\nimport { auth, config as omeggaConfig, pluginUtil, Terminal } from './cli';\nimport { IConfig } from './config/types';\nimport Logger from './logger';\nimport { GAME_BIN_PATH, STEAMCMD_PATH } from './softconfig';\nimport {\n hasSteamUpdate,\n steamcmdDownloadGame,\n steamcmdDownloadSelf,\n} from './updater';\nimport { PKG, VERSION } from './version';\n\ndotenv.config({ quiet: true });\n\nconst notifier =\n process.env.PACKAGE_NOTIFIER !== 'false'\n ? updateNotifier({\n pkg: PKG,\n updateCheckInterval: 1000 * 60 * 60 * 24,\n })\n : null;\nnotifier?.notify();\n\n// TODO: let omegga bundle config (roles, bans, server config) to zip\n// TODO: let omegga unbundle config from zip to current omegga dir\n\n// write a default config file\nconst createDefaultConfig = () => {\n Logger.logp('Created default config file');\n config.write(soft.CONFIG_FILENAMES[0] + '.yml', config.defaultConfig);\n file.mkdir(`data/${soft.CONFIG_SAVED_DIR}/Builds`);\n file.mkdir('plugins');\n return config.defaultConfig;\n};\n\nconst program = commander\n .description(PKG.description)\n .version(VERSION)\n .option(\n '-d, --debug',\n 'Print all console logs rather than just chat messages',\n )\n .option(\n '-u, --update',\n 'Check for brickadia updates (on steam) and install them if available',\n )\n .option('-v, --verbose', 'Print extra messages for debugging purposes')\n .action(async () => {\n const { debug, verbose, update } = program.opts();\n if (program.args.length > 0) {\n program.help();\n process.exit(1);\n }\n Logger.VERBOSE = Boolean(verbose);\n\n // default working directory is the one specified in config\n let workDir = config.store.get('defaultOmegga');\n Logger.verbose('Using working directory', workDir?.yellow);\n\n // if there's a config in the current directory, use that one instead\n if (config.find('.')) workDir = '.';\n\n // check if configured path exists\n if (!fs.existsSync(workDir)) {\n Logger.errorp('configured omegga default path does not exist');\n process.exit(1);\n }\n if (!fs.statSync(workDir).isDirectory) {\n Logger.errorp('configured omegga default path is not a directory');\n process.exit(1);\n }\n\n // find the config for the working directory\n const configFile = config.find(workDir);\n Logger.verbose('Target config file:', configFile?.yellow);\n let conf: IConfig;\n\n // create a default config file if it does not already exist, otherwise load in the existing one\n if (!configFile) {\n Logger.verbose('Creating a new config');\n conf = createDefaultConfig();\n } else {\n Logger.verbose('Reading config file');\n try {\n conf = config.read(configFile);\n } catch (error) {\n Logger.errorp('Error reading config file');\n Logger.verbose(error);\n }\n }\n\n const overrideBinary = getOverrideGameBinary();\n const isSteam = !conf?.server?.branch;\n if (overrideBinary) {\n if (!fs.existsSync(overrideBinary)) {\n Logger.error(\n 'Binary',\n overrideBinary.yellow,\n 'in',\n 'BRICKADIA_DIR'.yellow,\n 'does not exist!',\n );\n process.exit(1);\n }\n\n Logger.verbose(\n 'Using override binary',\n overrideBinary.yellow,\n '- skipping download.',\n );\n } else if (isSteam) {\n conf.__STEAM = true;\n await setupSteam(conf, update);\n } else {\n Logger.warnp(\n 'Brickadia will be launched with',\n 'non-steam launcher'.yellow,\n );\n Logger.warnp(\n 'New versions of Brickadia are not published on the old launcher.'\n .yellow,\n );\n\n // Check if the local launcher is installed\n if (fs.existsSync(soft.LOCAL_LAUNCHER)) {\n Logger.verbose(\"Using omegga's brickadia-launcher\");\n conf.server.__LOCAL = true;\n } else {\n Logger.verbose(\"Installing launcher as it's missing\");\n await installLauncher();\n }\n }\n\n const globalToken = auth.getGlobalToken();\n\n const hasHostingToken = Boolean(\n conf?.credentials?.token || process.env.BRICKADIA_TOKEN || globalToken,\n );\n\n // Skip auth when the hosting token is present\n if (hasHostingToken) {\n Logger.verbose(\n 'Skipping auth token generation due to host token presence',\n );\n if (conf?.credentials?.token)\n Logger.verbose('Found token in config file');\n else if (process.env.BRICKADIA_TOKEN)\n Logger.verbose('Found token in', 'BRICKADIA_TOKEN'.yellow);\n else if (globalToken)\n Logger.verbose('Found token in omegga global config');\n else Logger.verbose('unreachable - no token found');\n\n // check if the auth files don't exist\n } else if (\n !auth.exists(\n path.join(\n workDir,\n soft.DATA_PATH,\n conf?.server?.savedDir ?? soft.CONFIG_SAVED_DIR,\n conf?.server?.authDir ?? soft.CONFIG_AUTH_DIR,\n ),\n )\n ) {\n const success = await auth.prompt({\n debug,\n email: conf?.credentials?.['email'] ?? process.env.BRICKADIA_USER,\n password: conf?.credentials?.['password'] ?? process.env.BRICKADIA_PASS,\n isSteam,\n branch: conf?.server?.branch,\n authDir: conf?.server?.authDir,\n savedDir: conf?.server?.savedDir,\n launchArgs: conf?.server?.launchArgs,\n });\n if (!success) {\n Logger.errorp('Start aborted - could not generate auth tokens');\n process.exit(1);\n }\n } else {\n Logger.verbose(\n 'Skipping auth token generation due to existing auth files',\n );\n }\n\n // build options\n const options = {\n // default enable web ui (set to false)\n noweb: typeof conf.omegga?.webui === 'boolean' && !conf.omegga?.webui,\n // default enable https (set to true, will not be https if it can't generate)\n https: typeof conf.omegga?.https !== 'boolean' || conf.omegga?.https,\n port: conf.omegga?.port || soft.DEFAULT_PORT,\n debug,\n };\n\n Logger.verbose('Launching with options', options);\n\n // setup the server\n const server = new Omegga(workDir, conf, options);\n Logger.verbose('Created omegga object');\n\n if (verbose) {\n server.on(\n '*',\n (ev: string) => ev !== 'line' && Logger.verbose('EVENT'.green, ev),\n );\n }\n\n // create a terminal\n Logger.setTerminal(new Terminal(server, options));\n\n if (notifier?.update) {\n Logger.logp(\n `Omegga update is available (${('v' + notifier.update.latest).yellow})! Run`,\n 'npm i -g omegga'.yellow,\n 'to update!',\n );\n }\n\n if (\n conf.__STEAM &&\n !update &&\n !conf.server?.steambetaPassword &&\n process.env.STEAM_NOTIFIER !== 'false'\n ) {\n hasSteamUpdate(conf.server?.steambeta).then(hasUpdate => {\n if (hasUpdate) {\n Logger.logp('A server update is available!'.brightBlue);\n Logger.log(\n ' Restart with',\n 'omegga --update'.yellow,\n 'to update every start.',\n );\n Logger.log(' Run', '/update'.yellow, 'to update', 'now'.green + '!');\n } else {\n Logger.verbose('No server updates available.');\n }\n });\n }\n\n Logger.logp(\n `Launching brickadia server on port ${\n ('' + (conf.server.port || 7777)).green\n }...`,\n );\n\n // start the server\n Logger.verbose('Starting Omegga');\n server.start();\n });\n\nprogram\n .command('init')\n .description('Sets up the current directory as a brickadia server')\n .action(async () => {\n const configFile = config.find('.');\n if (configFile) {\n Logger.errorp('Config file already exists:', configFile.yellow.underline);\n process.exit(1);\n }\n createDefaultConfig();\n });\n\nprogram\n .command('config [field] [value]')\n .description(\n \"Configure Omegga's default behavior.\\n\" +\n 'Type ' +\n 'omegga config list'.yellow.underline +\n ' for current settings and available fields',\n )\n .action((field, value) => {\n if (!field) field = 'list';\n omeggaConfig(field, value, program.opts());\n });\n\nprogram\n .command('auth')\n .option('-g, --global', 'Remove global auth files')\n .option('-l, --local', 'Remove local auth files')\n .option('-w, --workdir', 'Remove configured location auth files')\n .option('-u, --email <email>', 'User email (must provide password)')\n .option('-p, --pass <password>', 'User password (must provide email)')\n .option('-v, --verbose', 'Print extra messages for debugging purposes')\n .description(\n 'Generates server auth tokens from brickadia account email+password',\n )\n .action(\n async ({\n email,\n pass: password,\n local: localAuth,\n workDir,\n global: globalAuth,\n }) => {\n const { verbose, debug } = program.opts();\n Logger.VERBOSE = Boolean(verbose);\n\n let branch: string, authDir: string, savedDir: string, launchArgs: string;\n let isSteam: boolean;\n\n // if there's a config in the current directory, use that one instead\n if (config.find('.')) workDir = '.';\n\n // check if configured path exists\n if (fs.existsSync(workDir) && fs.statSync(workDir).isDirectory) {\n Logger.verbose('Using working directory', workDir.yellow);\n // find the config for the working directory\n const configFile = config.find(workDir);\n Logger.verbose('Target config file:', configFile?.yellow);\n try {\n // read the config and extract the branch\n const conf = config.read(configFile);\n Logger.verbose(\n 'Auth config:',\n conf?.server ?? 'no server config'.grey,\n );\n branch = conf?.server?.branch;\n authDir = conf?.server?.authDir;\n savedDir = conf?.server?.savedDir;\n launchArgs = conf?.server?.launchArgs;\n isSteam = !conf?.server?.branch;\n\n if (localAuth && conf?.credentials?.token) {\n Logger.logp(\n \"This server's auth is managed by the token in\",\n configFile.yellow,\n );\n return;\n }\n } catch (error) {\n Logger.errorp('Error reading config file');\n Logger.verbose(error);\n }\n } else {\n Logger.verbose('Using default working directory', workDir.yellow);\n }\n\n savedDir ??= soft.CONFIG_SAVED_DIR;\n\n const workdirPath = path.join(\n config.store.get('defaultOmegga'),\n `data/${savedDir}/Auth`,\n );\n\n if (globalAuth || localAuth) {\n if (globalAuth) {\n const globalAuthPath = path.join(\n soft.CONFIG_HOME,\n savedDir !== soft.CONFIG_SAVED_DIR ? savedDir : '',\n authDir ?? soft.CONFIG_AUTH_DIR,\n );\n Logger.logp('Clearing auth files from', globalAuthPath.yellow);\n auth.clean(globalAuthPath);\n }\n if (workDir) {\n Logger.logp('Clearing auth files from', workdirPath.yellow);\n await file.rmdir(workdirPath);\n }\n if (localAuth) {\n const localPath = path.resolve(\n `data/${savedDir}/`,\n authDir ?? soft.CONFIG_AUTH_DIR,\n );\n Logger.logp('Clearing auth files from', localPath.yellow);\n await file.rmdir(localPath);\n }\n return;\n }\n\n if (!isSteam) {\n Logger.warnp('Authenticating with', 'non-steam launcher'.yellow);\n }\n\n auth.prompt({\n email,\n password,\n debug,\n branch,\n authDir,\n savedDir,\n launchArgs,\n });\n },\n );\n\nprogram\n .command('info')\n .alias('n')\n .description(\n 'Shows server name, description, port, install info, and installed plugins',\n )\n .action(async () => {\n Logger.errorp('not implemented yet');\n // TODO: implement config parsing\n });\n\nprogram\n .command('install <pluginUrl...>')\n .alias('i')\n .option('-f, --force', 'Forcefully re-install existing plugin') // TODO: implement install --force\n .option('-v, --verbose', 'Print extra messages for debugging purposes')\n .description('Installs a plugin to the current brickadia server')\n .action(async plugins => {\n if (!hasbin.sync('git')) {\n Logger.errorp('git'.yellow, 'must be installed to install plugins.');\n process.exit(1);\n }\n\n if (!config.find('.')) {\n Logger.errorp(\n 'Not an omegga directory, run ',\n 'omegga init'.yellow,\n 'to setup one.',\n );\n process.exit(1);\n }\n const { verbose, force } = program.opts();\n Logger.VERBOSE = Boolean(verbose);\n pluginUtil.install(plugins, { verbose, force });\n });\n\nprogram\n .command('update [pluginNames...]')\n .alias('u')\n .option('-f, --force', 'Forcefully re-upgrade existing plugin') // TODO: implement update --force\n .option('-v, --verbose', 'Print extra messages for debugging purposes')\n .description('Updates all or selected installed plugins to latest versions')\n .action(async plugins => {\n if (!config.find('.')) {\n Logger.errorp(\n 'Not an omegga directory, run ',\n 'omegga init'.yellow,\n 'to setup one.',\n );\n process.exit(1);\n }\n const { verbose, force } = program.opts();\n Logger.VERBOSE = Boolean(verbose);\n pluginUtil.update(plugins, { verbose, force });\n });\n\nprogram\n .command('check [pluginNames...]')\n .option('-v, --verbose', 'Print extra messages for debugging purposes')\n .description('Checks plugins for compatibility issues')\n .action(async plugins => {\n if (!config.find('.')) {\n Logger.errorp(\n 'Not an omegga directory, run ',\n 'omegga init'.yellow,\n 'to setup one.',\n );\n process.exit(1);\n }\n const { verbose } = program.opts();\n Logger.VERBOSE = Boolean(verbose);\n pluginUtil.check(plugins, { verbose });\n });\n\nprogram\n .command('init-plugin')\n .option('-v, --verbose', 'Print extra messages for debugging purposes')\n .description('Initializes a new plugin with the given name and settings')\n .action(async () => {\n const { verbose } = program.opts();\n Logger.VERBOSE = Boolean(verbose);\n\n pluginUtil.init();\n });\n\nprogram\n .command('plugin-init')\n .description('Alias for ' + 'init-plugin'.yellow.underline)\n .option('-v, --verbose', 'Print extra messages for debugging purposes')\n .action(async () => {\n const { verbose } = program.opts();\n Logger.VERBOSE = Boolean(verbose);\n\n pluginUtil.init();\n });\n\nprogram\n .command('get-config <pluginName> [configName]')\n .option('-v, --verbose', 'Print extra messages for debugging purposes')\n .option('-j, --json', 'Print config as json')\n .description(\n 'Gets a config for a plugin. If ' +\n 'configName'.yellow.underline +\n ' is omitted, returns all config values.',\n )\n .action(async (pluginName, configName) => {\n if (!config.find('.')) {\n Logger.errorp(\n 'Not an omegga directory, run ',\n 'omegga init'.yellow,\n 'to setup one.',\n );\n process.exit(1);\n }\n const { verbose } = program.opts();\n const json = program.args.includes('-j') || program.args.includes('--json');\n Logger.VERBOSE = Boolean(verbose);\n if (!configName) {\n pluginUtil.listConfig(pluginName, json);\n } else {\n pluginUtil.getConfig(pluginName, configName, json);\n }\n });\n\nprogram\n .command('set-config <pluginName> [configName] [configValue]')\n .option('-y, --yes', 'Skip confirmation prompt')\n .option('-v, --verbose', 'Print extra messages for debugging purposes')\n .description(\n 'Sets a config for a plugin. If ' +\n 'configValue'.yellow.underline +\n ' is omitted, the config will be reset. If ' +\n 'configName'.yellow.underline +\n ' is omitted, the entire plugin config will be reset.',\n )\n .action(async (pluginName, configName, configValue) => {\n if (!config.find('.')) {\n Logger.errorp(\n 'Not an omegga directory, run ',\n 'omegga init'.yellow,\n 'to setup one.',\n );\n process.exit(1);\n }\n const { verbose } = program.opts();\n const yes = program.args.includes('-y') || program.args.includes('--yes');\n Logger.VERBOSE = Boolean(verbose);\n if (!configName) {\n pluginUtil.resetAllConfigs(pluginName, yes);\n } else if (!configValue) {\n pluginUtil.resetConfig(pluginName, configName);\n } else {\n pluginUtil.setConfig(pluginName, configName, configValue);\n }\n });\n\nprogram.parseAsync(process.argv);\n\nasync function setupSteam(config: config.IConfig, forceUpdate = false) {\n const steambeta = config?.server?.steambeta;\n const steambetaPassword = config?.server?.steambetaPassword;\n\n const binaryPath = path.join(\n getSteamInstallDir(), // steam install directory\n steambeta ?? 'main', // steam beta branch (or main)\n getSteamGameDir(), // Brickadia\n GAME_BIN_PATH, // path to binary\n );\n\n if (!forceUpdate && fs.existsSync(binaryPath)) {\n Logger.verbose(\n 'Game binary already exists at',\n binaryPath.yellow,\n '- skipping download.',\n );\n return;\n }\n\n // Check if steamcmd is installed\n if (!fs.existsSync(STEAMCMD_PATH)) {\n // Lookup steamcmd in path\n const hasSteamcmd = hasbin.sync('steamcmd');\n\n if (!hasSteamcmd) {\n // Prompt to install steamcmd\n const { install } =\n process.env.SKIP_STEAMCMD_PROMPT === 'true'\n ? { install: true }\n : await prompts({\n type: 'confirm',\n name: 'install',\n message: 'SteamCMD is not installed. OK to download it?',\n initial: true,\n });\n\n if (!install) {\n Logger.errorp('SteamCMD is required for steam support. Exiting...');\n process.exit(1);\n }\n\n Logger.logp('Downloading SteamCMD...');\n }\n\n try {\n steamcmdDownloadSelf();\n if (!fs.existsSync(STEAMCMD_PATH)) {\n Logger.errorp('Failed to setup SteamCMD. Exiting...');\n process.exit(1);\n }\n } catch (err) {\n Logger.errorp('Error setting up SteamCMD:', err);\n process.exit(1);\n }\n }\n\n Logger.logp('Downloading Brickadia', (steambeta ?? 'main').yellow, '...');\n try {\n steamcmdDownloadGame({ steambeta, steambetaPassword });\n } catch (err) {\n Logger.errorp('Error downloading Brickadia:', err);\n process.exit(1);\n }\n}\n"],"names":["PKG","Logger","config.write","soft","config.defaultConfig","file.mkdir","VERSION","config.store","config.find","config.read","getOverrideGameBinary","installLauncher","auth","server","Omegga","Terminal","hasSteamUpdate","omeggaConfig","file.rmdir","pluginUtil","config","getSteamInstallDir","getSteamGameDir","GAME_BIN_PATH","STEAMCMD_PATH","steamcmdDownloadSelf","steamcmdDownloadGame"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"main.js","sources":["../src/main.ts"],"sourcesContent":["import soft, {\n getOverrideGameBinary,\n getSteamGameDir,\n getSteamInstallDir,\n} from '@/softconfig';\nimport { installLauncher } from '@cli/installer';\nimport * as config from '@config';\nimport Omegga from '@omegga/server';\nimport * as file from '@util/file';\nimport 'colors';\nimport commander from 'commander';\nimport dotenv from 'dotenv';\nimport hasbin from 'hasbin';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport prompts from 'prompts';\nimport updateNotifier from 'update-notifier-cjs';\nimport { auth, config as omeggaConfig, pluginUtil, Terminal } from './cli';\nimport { IConfig } from './config/types';\nimport Logger from './logger';\nimport { GAME_BIN_PATH, STEAMCMD_PATH } from './softconfig';\nimport {\n hasSteamUpdate,\n steamcmdDownloadGame,\n steamcmdDownloadSelf,\n steamcmdInteractiveLogin,\n} from './updater';\nimport { PKG, VERSION } from './version';\n\ndotenv.config({ quiet: true });\n\nconst notifier =\n process.env.PACKAGE_NOTIFIER !== 'false'\n ? updateNotifier({\n pkg: PKG,\n updateCheckInterval: 1000 * 60 * 60 * 24,\n })\n : null;\nnotifier?.notify();\n\n// TODO: let omegga bundle config (roles, bans, server config) to zip\n// TODO: let omegga unbundle config from zip to current omegga dir\n\n// write a default config file\nconst createDefaultConfig = () => {\n Logger.logp('Created default config file');\n config.write(soft.CONFIG_FILENAMES[0] + '.yml', config.defaultConfig);\n file.mkdir(`data/${soft.CONFIG_SAVED_DIR}/Builds`);\n file.mkdir('plugins');\n return config.defaultConfig;\n};\n\nconst program = commander\n .description(PKG.description)\n .version(VERSION)\n .option(\n '-d, --debug',\n 'Print all console logs rather than just chat messages',\n )\n .option(\n '-u, --update',\n 'Check for brickadia updates (on steam) and install them if available',\n )\n .option('-v, --verbose', 'Print extra messages for debugging purposes')\n .action(async () => {\n const { debug, verbose, update } = program.opts();\n if (program.args.length > 0) {\n program.help();\n process.exit(1);\n }\n Logger.VERBOSE = Boolean(verbose);\n\n // default working directory is the one specified in config\n let workDir = config.store.get('defaultOmegga');\n Logger.verbose('Using working directory', workDir?.yellow);\n\n // if there's a config in the current directory, use that one instead\n if (config.find('.')) workDir = '.';\n\n // check if configured path exists\n if (!fs.existsSync(workDir)) {\n Logger.errorp('configured omegga default path does not exist');\n process.exit(1);\n }\n if (!fs.statSync(workDir).isDirectory) {\n Logger.errorp('configured omegga default path is not a directory');\n process.exit(1);\n }\n\n // find the config for the working directory\n const configFile = config.find(workDir);\n Logger.verbose('Target config file:', configFile?.yellow);\n let conf: IConfig;\n\n // create a default config file if it does not already exist, otherwise load in the existing one\n if (!configFile) {\n Logger.verbose('Creating a new config');\n conf = createDefaultConfig();\n } else {\n Logger.verbose('Reading config file');\n try {\n conf = config.read(configFile);\n } catch (error) {\n Logger.errorp('Error reading config file');\n Logger.verbose(error);\n }\n }\n\n if (conf?.terminal?.timestamp) {\n Logger.setTimestamp(conf.terminal.timestamp);\n }\n\n const overrideBinary = getOverrideGameBinary();\n const isSteam = !conf?.server?.branch;\n if (overrideBinary) {\n if (!fs.existsSync(overrideBinary)) {\n Logger.error(\n 'Binary',\n overrideBinary.yellow,\n 'in',\n 'BRICKADIA_DIR'.yellow,\n 'does not exist!',\n );\n process.exit(1);\n }\n\n Logger.verbose(\n 'Using override binary',\n overrideBinary.yellow,\n '- skipping download.',\n );\n } else if (isSteam) {\n conf.__STEAM = true;\n await setupSteam(conf, update);\n } else {\n Logger.warnp(\n 'Brickadia will be launched with',\n 'non-steam launcher'.yellow,\n );\n Logger.warnp(\n 'New versions of Brickadia are not published on the old launcher.'\n .yellow,\n );\n\n // Check if the local launcher is installed\n if (fs.existsSync(soft.LOCAL_LAUNCHER)) {\n Logger.verbose(\"Using omegga's brickadia-launcher\");\n conf.server.__LOCAL = true;\n } else {\n Logger.verbose(\"Installing launcher as it's missing\");\n await installLauncher();\n }\n }\n\n const globalToken = auth.getGlobalToken();\n\n const hasHostingToken = Boolean(\n conf?.credentials?.token || process.env.BRICKADIA_TOKEN || globalToken,\n );\n\n // Skip auth when the hosting token is present\n if (hasHostingToken) {\n Logger.verbose(\n 'Skipping auth token generation due to host token presence',\n );\n if (conf?.credentials?.token)\n Logger.verbose('Found token in config file');\n else if (process.env.BRICKADIA_TOKEN)\n Logger.verbose('Found token in', 'BRICKADIA_TOKEN'.yellow);\n else if (globalToken)\n Logger.verbose('Found token in omegga global config');\n else Logger.verbose('unreachable - no token found');\n\n // check if the auth files don't exist\n } else if (\n !auth.exists(\n path.join(\n workDir,\n soft.DATA_PATH,\n conf?.server?.savedDir ?? soft.CONFIG_SAVED_DIR,\n conf?.server?.authDir ?? soft.CONFIG_AUTH_DIR,\n ),\n )\n ) {\n const success = await auth.prompt({\n debug,\n email: conf?.credentials?.['email'] ?? process.env.BRICKADIA_USER,\n password: conf?.credentials?.['password'] ?? process.env.BRICKADIA_PASS,\n isSteam,\n branch: conf?.server?.branch,\n authDir: conf?.server?.authDir,\n savedDir: conf?.server?.savedDir,\n launchArgs: conf?.server?.launchArgs,\n });\n if (!success) {\n Logger.errorp('Start aborted - could not generate auth tokens');\n process.exit(1);\n }\n } else {\n Logger.verbose(\n 'Skipping auth token generation due to existing auth files',\n );\n }\n\n // build options\n const options = {\n // default enable web ui (set to false)\n noweb: typeof conf.omegga?.webui === 'boolean' && !conf.omegga?.webui,\n // default enable https (set to true, will not be https if it can't generate)\n https: typeof conf.omegga?.https !== 'boolean' || conf.omegga?.https,\n port: conf.omegga?.port || soft.DEFAULT_PORT,\n debug,\n };\n\n Logger.verbose('Launching with options', options);\n\n // setup the server\n const server = new Omegga(workDir, conf, options);\n Logger.verbose('Created omegga object');\n\n if (verbose) {\n server.on(\n '*',\n (ev: string) => ev !== 'line' && Logger.verbose('EVENT'.green, ev),\n );\n }\n\n // create a terminal\n Logger.setTerminal(new Terminal(server, options));\n\n if (notifier?.update) {\n Logger.logp(\n `Omegga update is available (${('v' + notifier.update.latest).yellow})! Run`,\n 'npm i -g omegga'.yellow,\n 'to update!',\n );\n }\n\n if (\n conf.__STEAM &&\n !update &&\n !conf.server?.steambetaPassword &&\n process.env.STEAM_NOTIFIER !== 'false'\n ) {\n hasSteamUpdate(conf.server?.steambeta).then(hasUpdate => {\n if (hasUpdate) {\n Logger.logp('A server update is available!'.brightBlue);\n Logger.log(\n ' Restart with',\n 'omegga --update'.yellow,\n 'to update every start.',\n );\n Logger.log(' Run', '/update'.yellow, 'to update', 'now'.green + '!');\n } else {\n Logger.verbose('No server updates available.');\n }\n });\n }\n\n Logger.logp(\n `Launching brickadia server on port ${\n ('' + (conf.server.port || 7777)).green\n }...`,\n );\n\n // start the server\n Logger.verbose('Starting Omegga');\n server.start();\n });\n\nprogram\n .command('init')\n .description('Sets up the current directory as a brickadia server')\n .action(async () => {\n const configFile = config.find('.');\n if (configFile) {\n Logger.errorp('Config file already exists:', configFile.yellow.underline);\n process.exit(1);\n }\n createDefaultConfig();\n });\n\nprogram\n .command('steamlogin')\n .description('Interactively log in to Steam (for Steam Guard authentication)')\n .action(async () => {\n if (!process.env.STEAM_USERNAME) {\n Logger.errorp('STEAM_USERNAME environment variable is required.');\n Logger.errorp('Set it in your .env file or environment.');\n process.exit(1);\n }\n\n if (!fs.existsSync(STEAMCMD_PATH)) {\n Logger.errorp(\n 'SteamCMD is not installed. Run',\n 'omegga'.yellow,\n 'first to set it up.',\n );\n process.exit(1);\n }\n\n Logger.logp('Logging in to Steam interactively...');\n const success = await steamcmdInteractiveLogin();\n if (success) {\n Logger.logp('Steam login successful. Credentials are now cached.');\n } else {\n Logger.errorp('Steam login failed.');\n process.exit(1);\n }\n });\n\nprogram\n .command('config [field] [value]')\n .description(\n \"Configure Omegga's default behavior.\\n\" +\n 'Type ' +\n 'omegga config list'.yellow.underline +\n ' for current settings and available fields',\n )\n .action((field, value) => {\n if (!field) field = 'list';\n omeggaConfig(field, value, program.opts());\n });\n\nprogram\n .command('auth')\n .option('-g, --global', 'Remove global auth files')\n .option('-l, --local', 'Remove local auth files')\n .option('-w, --workdir', 'Remove configured location auth files')\n .option('-u, --email <email>', 'User email (must provide password)')\n .option('-p, --pass <password>', 'User password (must provide email)')\n .option('-v, --verbose', 'Print extra messages for debugging purposes')\n .description(\n 'Generates server auth tokens from brickadia account email+password',\n )\n .action(\n async ({\n email,\n pass: password,\n local: localAuth,\n workDir,\n global: globalAuth,\n }) => {\n const { verbose, debug } = program.opts();\n Logger.VERBOSE = Boolean(verbose);\n\n let branch: string, authDir: string, savedDir: string, launchArgs: string;\n let isSteam: boolean;\n\n // if there's a config in the current directory, use that one instead\n if (config.find('.')) workDir = '.';\n\n // check if configured path exists\n if (fs.existsSync(workDir) && fs.statSync(workDir).isDirectory) {\n Logger.verbose('Using working directory', workDir.yellow);\n // find the config for the working directory\n const configFile = config.find(workDir);\n Logger.verbose('Target config file:', configFile?.yellow);\n try {\n // read the config and extract the branch\n const conf = config.read(configFile);\n Logger.verbose(\n 'Auth config:',\n conf?.server ?? 'no server config'.grey,\n );\n branch = conf?.server?.branch;\n authDir = conf?.server?.authDir;\n savedDir = conf?.server?.savedDir;\n launchArgs = conf?.server?.launchArgs;\n isSteam = !conf?.server?.branch;\n\n if (localAuth && conf?.credentials?.token) {\n Logger.logp(\n \"This server's auth is managed by the token in\",\n configFile.yellow,\n );\n return;\n }\n } catch (error) {\n Logger.errorp('Error reading config file');\n Logger.verbose(error);\n }\n } else {\n Logger.verbose('Using default working directory', workDir.yellow);\n }\n\n savedDir ??= soft.CONFIG_SAVED_DIR;\n\n const workdirPath = path.join(\n config.store.get('defaultOmegga'),\n `data/${savedDir}/Auth`,\n );\n\n if (globalAuth || localAuth) {\n if (globalAuth) {\n const globalAuthPath = path.join(\n soft.CONFIG_HOME,\n savedDir !== soft.CONFIG_SAVED_DIR ? savedDir : '',\n authDir ?? soft.CONFIG_AUTH_DIR,\n );\n Logger.logp('Clearing auth files from', globalAuthPath.yellow);\n auth.clean(globalAuthPath);\n }\n if (workDir) {\n Logger.logp('Clearing auth files from', workdirPath.yellow);\n await file.rmdir(workdirPath);\n }\n if (localAuth) {\n const localPath = path.resolve(\n `data/${savedDir}/`,\n authDir ?? soft.CONFIG_AUTH_DIR,\n );\n Logger.logp('Clearing auth files from', localPath.yellow);\n await file.rmdir(localPath);\n }\n return;\n }\n\n if (!isSteam) {\n Logger.warnp('Authenticating with', 'non-steam launcher'.yellow);\n }\n\n auth.prompt({\n email,\n password,\n debug,\n branch,\n authDir,\n savedDir,\n launchArgs,\n });\n },\n );\n\nprogram\n .command('info')\n .alias('n')\n .description(\n 'Shows server name, description, port, install info, and installed plugins',\n )\n .action(async () => {\n Logger.errorp('not implemented yet');\n // TODO: implement config parsing\n });\n\nprogram\n .command('install <pluginUrl...>')\n .alias('i')\n .option('-f, --force', 'Forcefully re-install existing plugin') // TODO: implement install --force\n .option('-v, --verbose', 'Print extra messages for debugging purposes')\n .description('Installs a plugin to the current brickadia server')\n .action(async plugins => {\n if (!hasbin.sync('git')) {\n Logger.errorp('git'.yellow, 'must be installed to install plugins.');\n process.exit(1);\n }\n\n if (!config.find('.')) {\n Logger.errorp(\n 'Not an omegga directory, run ',\n 'omegga init'.yellow,\n 'to setup one.',\n );\n process.exit(1);\n }\n const { verbose, force } = program.opts();\n Logger.VERBOSE = Boolean(verbose);\n pluginUtil.install(plugins, { verbose, force });\n });\n\nprogram\n .command('update [pluginNames...]')\n .alias('u')\n .option('-f, --force', 'Forcefully re-upgrade existing plugin') // TODO: implement update --force\n .option('-v, --verbose', 'Print extra messages for debugging purposes')\n .description('Updates all or selected installed plugins to latest versions')\n .action(async plugins => {\n if (!config.find('.')) {\n Logger.errorp(\n 'Not an omegga directory, run ',\n 'omegga init'.yellow,\n 'to setup one.',\n );\n process.exit(1);\n }\n const { verbose, force } = program.opts();\n Logger.VERBOSE = Boolean(verbose);\n pluginUtil.update(plugins, { verbose, force });\n });\n\nprogram\n .command('check [pluginNames...]')\n .option('-v, --verbose', 'Print extra messages for debugging purposes')\n .description('Checks plugins for compatibility issues')\n .action(async plugins => {\n if (!config.find('.')) {\n Logger.errorp(\n 'Not an omegga directory, run ',\n 'omegga init'.yellow,\n 'to setup one.',\n );\n process.exit(1);\n }\n const { verbose } = program.opts();\n Logger.VERBOSE = Boolean(verbose);\n pluginUtil.check(plugins, { verbose });\n });\n\nprogram\n .command('init-plugin')\n .option('-v, --verbose', 'Print extra messages for debugging purposes')\n .description('Initializes a new plugin with the given name and settings')\n .action(async () => {\n const { verbose } = program.opts();\n Logger.VERBOSE = Boolean(verbose);\n\n pluginUtil.init();\n });\n\nprogram\n .command('plugin-init')\n .description('Alias for ' + 'init-plugin'.yellow.underline)\n .option('-v, --verbose', 'Print extra messages for debugging purposes')\n .action(async () => {\n const { verbose } = program.opts();\n Logger.VERBOSE = Boolean(verbose);\n\n pluginUtil.init();\n });\n\nprogram\n .command('get-config <pluginName> [configName]')\n .option('-v, --verbose', 'Print extra messages for debugging purposes')\n .option('-j, --json', 'Print config as json')\n .description(\n 'Gets a config for a plugin. If ' +\n 'configName'.yellow.underline +\n ' is omitted, returns all config values.',\n )\n .action(async (pluginName, configName) => {\n if (!config.find('.')) {\n Logger.errorp(\n 'Not an omegga directory, run ',\n 'omegga init'.yellow,\n 'to setup one.',\n );\n process.exit(1);\n }\n const { verbose } = program.opts();\n const json = program.args.includes('-j') || program.args.includes('--json');\n Logger.VERBOSE = Boolean(verbose);\n if (!configName) {\n pluginUtil.listConfig(pluginName, json);\n } else {\n pluginUtil.getConfig(pluginName, configName, json);\n }\n });\n\nprogram\n .command('set-config <pluginName> [configName] [configValue]')\n .option('-y, --yes', 'Skip confirmation prompt')\n .option('-v, --verbose', 'Print extra messages for debugging purposes')\n .description(\n 'Sets a config for a plugin. If ' +\n 'configValue'.yellow.underline +\n ' is omitted, the config will be reset. If ' +\n 'configName'.yellow.underline +\n ' is omitted, the entire plugin config will be reset.',\n )\n .action(async (pluginName, configName, configValue) => {\n if (!config.find('.')) {\n Logger.errorp(\n 'Not an omegga directory, run ',\n 'omegga init'.yellow,\n 'to setup one.',\n );\n process.exit(1);\n }\n const { verbose } = program.opts();\n const yes = program.args.includes('-y') || program.args.includes('--yes');\n Logger.VERBOSE = Boolean(verbose);\n if (!configName) {\n pluginUtil.resetAllConfigs(pluginName, yes);\n } else if (!configValue) {\n pluginUtil.resetConfig(pluginName, configName);\n } else {\n pluginUtil.setConfig(pluginName, configName, configValue);\n }\n });\n\nprogram.parseAsync(process.argv);\n\nasync function setupSteam(config: config.IConfig, forceUpdate = false) {\n const steambeta = config?.server?.steambeta;\n const steambetaPassword = config?.server?.steambetaPassword;\n\n const binaryPath = path.join(\n getSteamInstallDir(), // steam install directory\n steambeta ?? 'main', // steam beta branch (or main)\n getSteamGameDir(), // Brickadia\n GAME_BIN_PATH, // path to binary\n );\n\n if (!forceUpdate && fs.existsSync(binaryPath)) {\n Logger.verbose(\n 'Game binary already exists at',\n binaryPath.yellow,\n '- skipping download.',\n );\n return;\n }\n\n // Check if steamcmd is installed\n if (!fs.existsSync(STEAMCMD_PATH)) {\n // Lookup steamcmd in path\n const hasSteamcmd = hasbin.sync('steamcmd');\n\n if (!hasSteamcmd) {\n // Prompt to install steamcmd\n const { install } =\n process.env.SKIP_STEAMCMD_PROMPT === 'true'\n ? { install: true }\n : await prompts({\n type: 'confirm',\n name: 'install',\n message: 'SteamCMD is not installed. OK to download it?',\n initial: true,\n });\n\n if (!install) {\n Logger.errorp('SteamCMD is required for steam support. Exiting...');\n process.exit(1);\n }\n\n Logger.logp('Downloading SteamCMD...');\n }\n\n try {\n steamcmdDownloadSelf();\n if (!fs.existsSync(STEAMCMD_PATH)) {\n Logger.errorp('Failed to setup SteamCMD. Exiting...');\n process.exit(1);\n }\n } catch (err) {\n Logger.errorp('Error setting up SteamCMD:', err);\n process.exit(1);\n }\n }\n\n Logger.logp('Downloading Brickadia', (steambeta ?? 'main').yellow, '...');\n try {\n await steamcmdDownloadGame({ steambeta, steambetaPassword });\n } catch (err) {\n Logger.errorp('Error downloading Brickadia:', err);\n process.exit(1);\n }\n}\n"],"names":["PKG","Logger","config.write","soft","config.defaultConfig","file.mkdir","VERSION","config.store","config.find","config.read","getOverrideGameBinary","installLauncher","auth","server","Omegga","Terminal","hasSteamUpdate","STEAMCMD_PATH","steamcmdInteractiveLogin","omeggaConfig","file.rmdir","pluginUtil","config","getSteamInstallDir","getSteamGameDir","GAME_BIN_PATH","steamcmdDownloadSelf","steamcmdDownloadGame"],"mappings":"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"}
|
|
@@ -2,16 +2,26 @@
|
|
|
2
2
|
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
3
|
const command = (omegga) => {
|
|
4
4
|
const commandRegExp = /^Player \"(?<name>.+?)\" is trying to call command "\/(?<command>.+?)" with arg string "(?<args>.*?)".$/;
|
|
5
|
+
const errorRegExp = /^Error: Command (?<errorCmd>.+?) does not exist\.$/;
|
|
6
|
+
let lastCommandPlayer = null;
|
|
5
7
|
return {
|
|
6
8
|
// listen for commands messages
|
|
7
9
|
pattern(_line, logMatch) {
|
|
8
10
|
if (!logMatch) return;
|
|
9
11
|
const { generator, data } = logMatch.groups;
|
|
10
12
|
if (generator !== "LogChatCommands") return;
|
|
13
|
+
const errorMatch = data.match(errorRegExp);
|
|
14
|
+
if (errorMatch && lastCommandPlayer) {
|
|
15
|
+
const name = lastCommandPlayer;
|
|
16
|
+
lastCommandPlayer = null;
|
|
17
|
+
omegga.emit("unknownCommand", name, errorMatch.groups.errorCmd);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
11
20
|
const match = data.match(commandRegExp);
|
|
12
21
|
if (match) {
|
|
13
22
|
const { name, command: command2, args } = match.groups;
|
|
14
23
|
if (!omegga.players.some((p) => p.name === name)) return;
|
|
24
|
+
lastCommandPlayer = name;
|
|
15
25
|
return { name, command: command2, args: args.split(" ") };
|
|
16
26
|
}
|
|
17
27
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.js","sources":["../../../src/omegga/matchers/command.ts"],"sourcesContent":["import { MatchGenerator } from './types';\n\nconst command: MatchGenerator<{\n name: string;\n command: string;\n args: string[];\n}> = omegga => {\n // pattern to get PlayerController from a leave message\n const commandRegExp =\n /^Player \\\"(?<name>.+?)\\\" is trying to call command \"\\/(?<command>.+?)\" with arg string \"(?<args>.*?)\".$/;\n\n return {\n // listen for commands messages\n pattern(_line, logMatch) {\n // line is not generic console log\n if (!logMatch) return;\n\n const { generator, data } = logMatch.groups;\n // check if log is a command log\n if (generator !== 'LogChatCommands') return;\n\n // match the log to the command pattern\n const match = data.match(commandRegExp);\n if (match) {\n const { name, command, args } = match.groups;\n\n // no player has this name. probably a bug\n if (!omegga.players.some(p => p.name === name)) return;\n\n // return the player and the command\n return { name, command, args: args.split(' ') };\n }\n\n return;\n },\n // when there's a match, emit the comand event\n callback({ name, command, args }) {\n // if the only argument is an empty string, ignore it\n if (args.length === 1 && args[0].length === 0) args.pop();\n\n omegga.emit('cmd:' + command.toLowerCase(), name, ...args);\n omegga.emit('cmd', command.toLowerCase(), name, ...args);\n },\n };\n};\n\nexport default command;\n"],"names":["command"],"mappings":";;AAEA,MAAM,UAID,CAAA,WAAU;AAEb,QAAM,gBACJ;
|
|
1
|
+
{"version":3,"file":"command.js","sources":["../../../src/omegga/matchers/command.ts"],"sourcesContent":["import { MatchGenerator } from './types';\n\nconst command: MatchGenerator<{\n name: string;\n command: string;\n args: string[];\n}> = omegga => {\n // pattern to get PlayerController from a leave message\n const commandRegExp =\n /^Player \\\"(?<name>.+?)\\\" is trying to call command \"\\/(?<command>.+?)\" with arg string \"(?<args>.*?)\".$/;\n\n // pattern to match the \"command does not exist\" error that follows\n const errorRegExp = /^Error: Command (?<errorCmd>.+?) does not exist\\.$/;\n\n // track the last player who used a command for the error line\n let lastCommandPlayer: string | null = null;\n\n return {\n // listen for commands messages\n pattern(_line, logMatch) {\n // line is not generic console log\n if (!logMatch) return;\n\n const { generator, data } = logMatch.groups;\n // check if log is a command log\n if (generator !== 'LogChatCommands') return;\n\n // check if this is a \"command does not exist\" error\n const errorMatch = data.match(errorRegExp);\n if (errorMatch && lastCommandPlayer) {\n const name = lastCommandPlayer;\n lastCommandPlayer = null;\n omegga.emit('unknownCommand', name, errorMatch.groups.errorCmd);\n return;\n }\n\n // match the log to the command pattern\n const match = data.match(commandRegExp);\n if (match) {\n const { name, command, args } = match.groups;\n\n // no player has this name. probably a bug\n if (!omegga.players.some(p => p.name === name)) return;\n\n // track this player for the potential error line\n lastCommandPlayer = name;\n\n // return the player and the command\n return { name, command, args: args.split(' ') };\n }\n\n return;\n },\n // when there's a match, emit the comand event\n callback({ name, command, args }) {\n // if the only argument is an empty string, ignore it\n if (args.length === 1 && args[0].length === 0) args.pop();\n\n omegga.emit('cmd:' + command.toLowerCase(), name, ...args);\n omegga.emit('cmd', command.toLowerCase(), name, ...args);\n },\n };\n};\n\nexport default command;\n"],"names":["command"],"mappings":";;AAEA,MAAM,UAID,CAAA,WAAU;AAEb,QAAM,gBACJ;AAGF,QAAM,cAAc;AAGpB,MAAI,oBAAmC;AAEvC,SAAO;AAAA;AAAA,IAEL,QAAQ,OAAO,UAAU;AAEvB,UAAI,CAAC,SAAU;AAEf,YAAM,EAAE,WAAW,KAAA,IAAS,SAAS;AAErC,UAAI,cAAc,kBAAmB;AAGrC,YAAM,aAAa,KAAK,MAAM,WAAW;AACzC,UAAI,cAAc,mBAAmB;AACnC,cAAM,OAAO;AACb,4BAAoB;AACpB,eAAO,KAAK,kBAAkB,MAAM,WAAW,OAAO,QAAQ;AAC9D;AAAA,MACF;AAGA,YAAM,QAAQ,KAAK,MAAM,aAAa;AACtC,UAAI,OAAO;AACT,cAAM,EAAE,MAAM,SAAAA,UAAS,KAAA,IAAS,MAAM;AAGtC,YAAI,CAAC,OAAO,QAAQ,KAAK,OAAK,EAAE,SAAS,IAAI,EAAG;AAGhD,4BAAoB;AAGpB,eAAO,EAAE,MAAM,SAAAA,UAAS,MAAM,KAAK,MAAM,GAAG,EAAA;AAAA,MAC9C;AAEA;AAAA,IACF;AAAA;AAAA,IAEA,SAAS,EAAE,MAAM,SAAAA,UAAS,QAAQ;AAEhC,UAAI,KAAK,WAAW,KAAK,KAAK,CAAC,EAAE,WAAW,EAAG,MAAK,IAAA;AAEpD,aAAO,KAAK,SAASA,SAAQ,eAAe,MAAM,GAAG,IAAI;AACzD,aAAO,KAAK,OAAOA,SAAQ,eAAe,MAAM,GAAG,IAAI;AAAA,IACzD;AAAA,EAAA;AAEJ;;"}
|
|
@@ -108,6 +108,12 @@ class NodePlugin extends _interface.Plugin {
|
|
|
108
108
|
return false;
|
|
109
109
|
}
|
|
110
110
|
}
|
|
111
|
+
// forward plugin events to the loaded plugin instance
|
|
112
|
+
async emitPlugin(ev, from, args) {
|
|
113
|
+
if (typeof this.loadedPlugin?.pluginEvent === "function") {
|
|
114
|
+
return await this.loadedPlugin.pluginEvent(ev, from, ...args);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
111
117
|
// disrequire all that match plugin path in require.cache
|
|
112
118
|
disrequireAll() {
|
|
113
119
|
const requiredFiles = Object.keys(require.cache).filter(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin_node_unsafe.js","sources":["../../../src/omegga/plugin/plugin_node_unsafe.ts"],"sourcesContent":["import Logger from '@/logger';\nimport OmeggaPlugin, { PluginStore } from '@/plugin';\nimport type Omegga from '@omegga/server';\nimport * as util from '@util';\nimport disrequire from 'disrequire';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { Plugin } from './interface';\n\nglobal.OMEGGA_UTIL = util;\n\n// Main plugin file (like index.js)\n// this isn't named 'index.js' or 'plugin.js' because those may be filenames\n// used with other loaders (rpc loader) and are too generic\n// omegga.main.js is rather unique and helps avoid collision\nconst MAIN_FILE = 'omegga.main.js';\n\n// Documentation file (contains name, description, author, command helptext)\nconst DOC_FILE = 'doc.json';\nconst PLUGIN_FILE = 'plugin.json';\n\nexport default class NodePlugin extends Plugin {\n // every node plugin requires the main file and a doc file\n // may evolve this so it checks the contents of the doc file later\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 // unsafe node plugins (can potentially crash omegga) are powerful\n static getFormat() {\n return 'node_unsafe';\n }\n\n constructor(pluginPath: string, omegga: Omegga) {\n super(pluginPath, omegga);\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 // list of registered comands\n this.commands = [];\n }\n\n // documentation is based on doc.json file\n getDocumentation() {\n return this.documentation;\n }\n\n // loaded state is based on if the loadedPlugin object is created\n isLoaded() {\n return !!this.loadedPlugin;\n }\n\n // determing if a command is registered\n isCommand(cmd: string) {\n return this.commands.includes(cmd);\n }\n\n // require the plugin into the system, run the init func\n async load() {\n const stopPlugin = (reason?: string) => {\n Logger.errorp('error launching node plugin', this.getName(), ':', reason);\n try {\n this.disrequireAll();\n } catch (e) {\n Logger.errorp('error unloading node plugin (2)', this.getName(), e);\n }\n this.emitStatus();\n return false;\n };\n this.commands = [];\n\n try {\n const config = await this.storage.getConfig();\n if (this.pluginConfig?.emitConfig) {\n await fs.promises.writeFile(\n path.join(this.path, this.pluginConfig.emitConfig),\n JSON.stringify(config),\n );\n }\n\n // require the plugin itself\n const Plugin: OmeggaPlugin = require(this.pluginFile);\n\n // node plugins must export a class with a constructor\n if (\n typeof (Plugin as any).prototype !== 'object' ||\n typeof (Plugin as any).prototype.constructor !== 'function'\n )\n return stopPlugin('missing constructor in plugin');\n\n // interface with plugin store\n const store: PluginStore = {\n get: key => this.storage.get(key),\n set: (key, value) => this.storage.set(key, value),\n delete: key => this.storage.delete(key),\n wipe: () => this.storage.wipe(),\n count: () => this.storage.count(),\n keys: () => this.storage.keys(),\n };\n\n // create the loaded plugin\n this.loadedPlugin = new (Plugin as any)(this.omegga, config, store);\n\n // start the loaded plugin\n if (typeof this.loadedPlugin.init === 'function') {\n const result = await this.loadedPlugin.init();\n\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 }\n\n this.emitStatus();\n return true;\n } catch (e) {\n Logger.errorp('error loading node plugin', this.getName(), e);\n this.emitStatus();\n return false;\n }\n }\n\n // disrequire the plugin into the system, run the stop func\n async unload() {\n // can't unload the plugin if it hasn't been loaded\n if (typeof this.loadedPlugin === 'undefined') {\n this.emitStatus();\n return false;\n }\n\n try {\n // run the stop func on the plugin if applicable\n if (typeof this.loadedPlugin.stop === 'function')\n await this.loadedPlugin.stop();\n\n // unload the plugin\n this.disrequireAll();\n this.loadedPlugin = undefined;\n this.emitStatus();\n this.commands = [];\n return true;\n } catch (e) {\n Logger.errorp('error unloading node plugin', this.getName(), e);\n this.emitStatus();\n return false;\n }\n }\n\n // disrequire all that match plugin path in require.cache\n disrequireAll() {\n // get all files in plugin directory from require cache\n const requiredFiles = Object.keys(require.cache).filter(requiredFile =>\n requiredFile.includes(this.path),\n );\n // disrequire all the files\n requiredFiles.forEach(file => {\n try {\n disrequire(file);\n } catch (e) {\n if (e.code !== 'MODULE_NOT_FOUND')\n // ignore error thrown if a module was deleted\n throw e;\n }\n });\n }\n}\n"],"names":["util","Plugin","Logger"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin_node_unsafe.js","sources":["../../../src/omegga/plugin/plugin_node_unsafe.ts"],"sourcesContent":["import Logger from '@/logger';\nimport OmeggaPlugin, { PluginStore } from '@/plugin';\nimport type Omegga from '@omegga/server';\nimport * as util from '@util';\nimport disrequire from 'disrequire';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { Plugin } from './interface';\n\nglobal.OMEGGA_UTIL = util;\n\n// Main plugin file (like index.js)\n// this isn't named 'index.js' or 'plugin.js' because those may be filenames\n// used with other loaders (rpc loader) and are too generic\n// omegga.main.js is rather unique and helps avoid collision\nconst MAIN_FILE = 'omegga.main.js';\n\n// Documentation file (contains name, description, author, command helptext)\nconst DOC_FILE = 'doc.json';\nconst PLUGIN_FILE = 'plugin.json';\n\nexport default class NodePlugin extends Plugin {\n // every node plugin requires the main file and a doc file\n // may evolve this so it checks the contents of the doc file later\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 // unsafe node plugins (can potentially crash omegga) are powerful\n static getFormat() {\n return 'node_unsafe';\n }\n\n constructor(pluginPath: string, omegga: Omegga) {\n super(pluginPath, omegga);\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 // list of registered comands\n this.commands = [];\n }\n\n // documentation is based on doc.json file\n getDocumentation() {\n return this.documentation;\n }\n\n // loaded state is based on if the loadedPlugin object is created\n isLoaded() {\n return !!this.loadedPlugin;\n }\n\n // determing if a command is registered\n isCommand(cmd: string) {\n return this.commands.includes(cmd);\n }\n\n // require the plugin into the system, run the init func\n async load() {\n const stopPlugin = (reason?: string) => {\n Logger.errorp('error launching node plugin', this.getName(), ':', reason);\n try {\n this.disrequireAll();\n } catch (e) {\n Logger.errorp('error unloading node plugin (2)', this.getName(), e);\n }\n this.emitStatus();\n return false;\n };\n this.commands = [];\n\n try {\n const config = await this.storage.getConfig();\n if (this.pluginConfig?.emitConfig) {\n await fs.promises.writeFile(\n path.join(this.path, this.pluginConfig.emitConfig),\n JSON.stringify(config),\n );\n }\n\n // require the plugin itself\n const Plugin: OmeggaPlugin = require(this.pluginFile);\n\n // node plugins must export a class with a constructor\n if (\n typeof (Plugin as any).prototype !== 'object' ||\n typeof (Plugin as any).prototype.constructor !== 'function'\n )\n return stopPlugin('missing constructor in plugin');\n\n // interface with plugin store\n const store: PluginStore = {\n get: key => this.storage.get(key),\n set: (key, value) => this.storage.set(key, value),\n delete: key => this.storage.delete(key),\n wipe: () => this.storage.wipe(),\n count: () => this.storage.count(),\n keys: () => this.storage.keys(),\n };\n\n // create the loaded plugin\n this.loadedPlugin = new (Plugin as any)(this.omegga, config, store);\n\n // start the loaded plugin\n if (typeof this.loadedPlugin.init === 'function') {\n const result = await this.loadedPlugin.init();\n\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 }\n\n this.emitStatus();\n return true;\n } catch (e) {\n Logger.errorp('error loading node plugin', this.getName(), e);\n this.emitStatus();\n return false;\n }\n }\n\n // disrequire the plugin into the system, run the stop func\n async unload() {\n // can't unload the plugin if it hasn't been loaded\n if (typeof this.loadedPlugin === 'undefined') {\n this.emitStatus();\n return false;\n }\n\n try {\n // run the stop func on the plugin if applicable\n if (typeof this.loadedPlugin.stop === 'function')\n await this.loadedPlugin.stop();\n\n // unload the plugin\n this.disrequireAll();\n this.loadedPlugin = undefined;\n this.emitStatus();\n this.commands = [];\n return true;\n } catch (e) {\n Logger.errorp('error unloading node plugin', this.getName(), e);\n this.emitStatus();\n return false;\n }\n }\n\n // forward plugin events to the loaded plugin instance\n async emitPlugin(ev: string, from: string, args: any[]) {\n if (typeof this.loadedPlugin?.pluginEvent === 'function') {\n return await this.loadedPlugin.pluginEvent(ev, from, ...args);\n }\n }\n\n // disrequire all that match plugin path in require.cache\n disrequireAll() {\n // get all files in plugin directory from require cache\n const requiredFiles = Object.keys(require.cache).filter(requiredFile =>\n requiredFile.includes(this.path),\n );\n // disrequire all the files\n requiredFiles.forEach(file => {\n try {\n disrequire(file);\n } catch (e) {\n if (e.code !== 'MODULE_NOT_FOUND')\n // ignore error thrown if a module was deleted\n throw e;\n }\n });\n }\n}\n"],"names":["util","Plugin","Logger"],"mappings":"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"}
|