@sagl/server 0.0.0-stage → 0.1.0-next.51
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/LICENSE +21 -0
- package/README.md +61 -2
- package/dist/actions.d.ts +46 -0
- package/dist/actions.js +80 -0
- package/dist/actions.js.map +1 -0
- package/dist/animations.d.ts +32 -0
- package/dist/animations.js +95 -0
- package/dist/animations.js.map +1 -0
- package/dist/audio.d.ts +180 -0
- package/dist/audio.js +353 -0
- package/dist/audio.js.map +1 -0
- package/dist/audio_effects.d.ts +219 -0
- package/dist/audio_effects.js +84 -0
- package/dist/audio_effects.js.map +1 -0
- package/dist/camera.d.ts +188 -0
- package/dist/camera.js +247 -0
- package/dist/camera.js.map +1 -0
- package/dist/claims.d.ts +27 -0
- package/dist/claims.js +48 -0
- package/dist/claims.js.map +1 -0
- package/dist/commands.d.ts +135 -0
- package/dist/commands.js +373 -0
- package/dist/commands.js.map +1 -0
- package/dist/console.d.ts +21 -0
- package/dist/console.js +100 -0
- package/dist/console.js.map +1 -0
- package/dist/constants.d.ts +654 -0
- package/dist/constants.js +657 -0
- package/dist/constants.js.map +1 -0
- package/dist/cutscene.d.ts +47 -0
- package/dist/cutscene.js +190 -0
- package/dist/cutscene.js.map +1 -0
- package/dist/draw.d.ts +106 -0
- package/dist/draw.js +132 -0
- package/dist/draw.js.map +1 -0
- package/dist/effects.d.ts +91 -0
- package/dist/effects.js +116 -0
- package/dist/effects.js.map +1 -0
- package/dist/gangzones.d.ts +47 -0
- package/dist/gangzones.js +122 -0
- package/dist/gangzones.js.map +1 -0
- package/dist/geo.d.ts +11 -0
- package/dist/geo.js +25 -0
- package/dist/geo.js.map +1 -0
- package/dist/hud.d.ts +159 -0
- package/dist/hud.js +247 -0
- package/dist/hud.js.map +1 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/interaction.d.ts +81 -0
- package/dist/interaction.js +143 -0
- package/dist/interaction.js.map +1 -0
- package/dist/junctions.d.ts +1 -0
- package/dist/junctions.js +330 -0
- package/dist/junctions.js.map +1 -0
- package/dist/map.d.ts +55 -0
- package/dist/map.js +71 -0
- package/dist/map.js.map +1 -0
- package/dist/menu.d.ts +96 -0
- package/dist/menu.js +129 -0
- package/dist/menu.js.map +1 -0
- package/dist/mission.d.ts +482 -0
- package/dist/mission.js +1258 -0
- package/dist/mission.js.map +1 -0
- package/dist/models.d.ts +56 -0
- package/dist/models.js +71 -0
- package/dist/models.js.map +1 -0
- package/dist/modshop.d.ts +229 -0
- package/dist/modshop.js +904 -0
- package/dist/modshop.js.map +1 -0
- package/dist/modshop_data.d.ts +44 -0
- package/dist/modshop_data.js +287 -0
- package/dist/modshop_data.js.map +1 -0
- package/dist/native.d.ts +809 -0
- package/dist/native.js +27 -0
- package/dist/native.js.map +1 -0
- package/dist/objects.d.ts +249 -0
- package/dist/objects.js +455 -0
- package/dist/objects.js.map +1 -0
- package/dist/paint.d.ts +124 -0
- package/dist/paint.js +84 -0
- package/dist/paint.js.map +1 -0
- package/dist/paynspray.d.ts +44 -0
- package/dist/paynspray.js +177 -0
- package/dist/paynspray.js.map +1 -0
- package/dist/ped.d.ts +335 -0
- package/dist/ped.js +536 -0
- package/dist/ped.js.map +1 -0
- package/dist/player.d.ts +685 -0
- package/dist/player.js +1163 -0
- package/dist/player.js.map +1 -0
- package/dist/screeneffects.d.ts +99 -0
- package/dist/screeneffects.js +257 -0
- package/dist/screeneffects.js.map +1 -0
- package/dist/scripts.d.ts +69 -0
- package/dist/scripts.js +125 -0
- package/dist/scripts.js.map +1 -0
- package/dist/server.d.ts +713 -0
- package/dist/server.js +1080 -0
- package/dist/server.js.map +1 -0
- package/dist/shopblips.d.ts +9 -0
- package/dist/shopblips.js +30 -0
- package/dist/shopblips.js.map +1 -0
- package/dist/special.d.ts +33 -0
- package/dist/special.js +26 -0
- package/dist/special.js.map +1 -0
- package/dist/splash.d.ts +42 -0
- package/dist/splash.js +55 -0
- package/dist/splash.js.map +1 -0
- package/dist/text.d.ts +19 -0
- package/dist/text.js +25 -0
- package/dist/text.js.map +1 -0
- package/dist/ui.d.ts +141 -0
- package/dist/ui.js +243 -0
- package/dist/ui.js.map +1 -0
- package/dist/vehicle.d.ts +306 -0
- package/dist/vehicle.js +612 -0
- package/dist/vehicle.js.map +1 -0
- package/dist/vehiclecolors.d.ts +26 -0
- package/dist/vehiclecolors.js +49 -0
- package/dist/vehiclecolors.js.map +1 -0
- package/dist/world.d.ts +222 -0
- package/dist/world.js +227 -0
- package/dist/world.js.map +1 -0
- package/dist/zone.d.ts +89 -0
- package/dist/zone.js +140 -0
- package/dist/zone.js.map +1 -0
- package/package.json +33 -4
package/dist/commands.js
ADDED
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
/** A command's usage went wrong: the message is shown to the player. */
|
|
2
|
+
export class CommandError extends Error {
|
|
3
|
+
}
|
|
4
|
+
let lookup = { players: () => [], vehicle: () => undefined };
|
|
5
|
+
/** @internal */
|
|
6
|
+
export function setLookup(l) {
|
|
7
|
+
lookup = l;
|
|
8
|
+
}
|
|
9
|
+
const clean = (s) => s.replace(/[\t\n:|]/g, " ");
|
|
10
|
+
/** Argument types for `command(...).argument(name, type)`. */
|
|
11
|
+
export const arg = {
|
|
12
|
+
/** A player: by id, their name, or the start of it (one match). */
|
|
13
|
+
player() {
|
|
14
|
+
return {
|
|
15
|
+
label: "player",
|
|
16
|
+
token: "player",
|
|
17
|
+
parse(input) {
|
|
18
|
+
const all = lookup.players();
|
|
19
|
+
if (/^\d+$/.test(input)) {
|
|
20
|
+
const p = all.find((x) => x.id === Number(input));
|
|
21
|
+
if (p)
|
|
22
|
+
return p;
|
|
23
|
+
}
|
|
24
|
+
const lower = input.toLowerCase();
|
|
25
|
+
const exact = all.find((x) => x.name.toLowerCase() === lower);
|
|
26
|
+
if (exact)
|
|
27
|
+
return exact;
|
|
28
|
+
const matches = all.filter((x) => x.name.toLowerCase().startsWith(lower));
|
|
29
|
+
if (matches.length === 1)
|
|
30
|
+
return matches[0];
|
|
31
|
+
if (matches.length > 1)
|
|
32
|
+
throw new CommandError(`More than one player matches "${input}": ${matches.map((p) => p.name).join(", ")}`);
|
|
33
|
+
throw new CommandError(`No player "${input}"`);
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
},
|
|
37
|
+
/** A whole number, within `min`-`max`. */
|
|
38
|
+
integer(o = {}) {
|
|
39
|
+
const { min = -2147483648, max = 2147483647 } = o;
|
|
40
|
+
return {
|
|
41
|
+
label: o.min !== undefined || o.max !== undefined ? `${o.min ?? ""}-${o.max ?? ""}`.replace(/^-$/, "number") : "number",
|
|
42
|
+
token: `int:${min}:${max}`,
|
|
43
|
+
parse(input) {
|
|
44
|
+
if (!/^[-+]?\d+$/.test(input))
|
|
45
|
+
throw new CommandError(`"${input}" isn't a whole number`);
|
|
46
|
+
const n = Number(input);
|
|
47
|
+
if (n < min || n > max)
|
|
48
|
+
throw new CommandError(`${n} isn't within ${min}-${max}`);
|
|
49
|
+
return n;
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
},
|
|
53
|
+
/** A number (decimals too), within `min`-`max`. */
|
|
54
|
+
number(o = {}) {
|
|
55
|
+
const { min = -Infinity, max = Infinity } = o;
|
|
56
|
+
return {
|
|
57
|
+
label: "number",
|
|
58
|
+
token: `num:${Number.isFinite(min) ? min : ""}:${Number.isFinite(max) ? max : ""}`,
|
|
59
|
+
parse(input) {
|
|
60
|
+
const n = Number(input);
|
|
61
|
+
if (input === "" || !Number.isFinite(n))
|
|
62
|
+
throw new CommandError(`"${input}" isn't a number`);
|
|
63
|
+
if (n < min || n > max)
|
|
64
|
+
throw new CommandError(`${n} isn't within ${min}-${max}`);
|
|
65
|
+
return n;
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
},
|
|
69
|
+
/** One word. */
|
|
70
|
+
word() {
|
|
71
|
+
return { label: "word", token: "word", parse: (input) => input };
|
|
72
|
+
},
|
|
73
|
+
/** The rest of the line (it must come last). */
|
|
74
|
+
text() {
|
|
75
|
+
return { label: "text", token: "text", greedy: true, parse: (input) => input };
|
|
76
|
+
},
|
|
77
|
+
/** yes/no, true/false, on/off, 1/0. */
|
|
78
|
+
boolean() {
|
|
79
|
+
return {
|
|
80
|
+
label: "yes/no",
|
|
81
|
+
token: "choice:yes|no|on|off|true|false",
|
|
82
|
+
parse(input) {
|
|
83
|
+
const v = input.toLowerCase();
|
|
84
|
+
if (["yes", "true", "on", "1"].includes(v))
|
|
85
|
+
return true;
|
|
86
|
+
if (["no", "false", "off", "0"].includes(v))
|
|
87
|
+
return false;
|
|
88
|
+
throw new CommandError(`"${input}" isn't yes or no`);
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
},
|
|
92
|
+
/** One of these words. */
|
|
93
|
+
choice(choices) {
|
|
94
|
+
return {
|
|
95
|
+
label: choices.join("|"),
|
|
96
|
+
token: `choice:${choices.map(clean).join("|")}`,
|
|
97
|
+
parse(input) {
|
|
98
|
+
const c = choices.find((x) => x.toLowerCase() === input.toLowerCase());
|
|
99
|
+
if (c === undefined)
|
|
100
|
+
throw new CommandError(`"${input}" isn't one of ${choices.join(", ")}`);
|
|
101
|
+
return c;
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
},
|
|
105
|
+
/** A vehicle, by its id. */
|
|
106
|
+
vehicle() {
|
|
107
|
+
return {
|
|
108
|
+
label: "vehicle id",
|
|
109
|
+
token: "int:0:2147483647",
|
|
110
|
+
parse(input) {
|
|
111
|
+
const v = /^\d+$/.test(input) ? lookup.vehicle(Number(input)) : undefined;
|
|
112
|
+
if (!v)
|
|
113
|
+
throw new CommandError(`No vehicle ${input}`);
|
|
114
|
+
return v;
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
},
|
|
118
|
+
/**
|
|
119
|
+
* Your own: `parse` reads it (throw `CommandError` to refuse), `suggest`
|
|
120
|
+
* offers what the chat suggests as they type (asked of the server).
|
|
121
|
+
*/
|
|
122
|
+
custom(o) {
|
|
123
|
+
return { label: o.label, token: "custom", greedy: o.greedy, parse: o.parse, suggest: o.suggest };
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* A command, built up (as Minecraft's Brigadier): its name, aliases,
|
|
128
|
+
* arguments, subcommands, who may use it, and what it does. Made with
|
|
129
|
+
* `command(name)`.
|
|
130
|
+
*
|
|
131
|
+
* ```ts
|
|
132
|
+
* server.commands.register(
|
|
133
|
+
* command("pay").description("Give money to a player")
|
|
134
|
+
* .argument("player", arg.player())
|
|
135
|
+
* .argument("amount", arg.integer({ min: 1 }))
|
|
136
|
+
* .executes((player, { player: to, amount }) => { ... }),
|
|
137
|
+
* );
|
|
138
|
+
* ```
|
|
139
|
+
*/
|
|
140
|
+
export class CommandBuilder {
|
|
141
|
+
/** @internal */ name;
|
|
142
|
+
/** @internal */ aliases = [];
|
|
143
|
+
/** @internal */ text = "";
|
|
144
|
+
/** @internal */ check = null;
|
|
145
|
+
/** @internal */ args = [];
|
|
146
|
+
/** @internal */ children = [];
|
|
147
|
+
/** @internal */ run = null;
|
|
148
|
+
/** @internal */
|
|
149
|
+
constructor(name) {
|
|
150
|
+
if (!/^[A-Za-z0-9_.-]{1,32}$/.test(name))
|
|
151
|
+
throw new RangeError(`not a command name: "${name}"`);
|
|
152
|
+
this.name = name.toLowerCase();
|
|
153
|
+
}
|
|
154
|
+
/** Other names for it. */
|
|
155
|
+
alias(...names) {
|
|
156
|
+
for (const n of names) {
|
|
157
|
+
if (!/^[A-Za-z0-9_.-]{1,32}$/.test(n))
|
|
158
|
+
throw new RangeError(`not a command name: "${n}"`);
|
|
159
|
+
this.aliases.push(n.toLowerCase());
|
|
160
|
+
}
|
|
161
|
+
return this;
|
|
162
|
+
}
|
|
163
|
+
/** What it does, shown with its usage in the chat's suggestions. */
|
|
164
|
+
description(text) {
|
|
165
|
+
this.text = clean(text);
|
|
166
|
+
return this;
|
|
167
|
+
}
|
|
168
|
+
/** Who may use it (and see it suggested): checked per player. */
|
|
169
|
+
requires(check) {
|
|
170
|
+
this.check = check;
|
|
171
|
+
return this;
|
|
172
|
+
}
|
|
173
|
+
/** The next argument. Optional ones come last. */
|
|
174
|
+
argument(name, type, options = {}) {
|
|
175
|
+
if (!/^[A-Za-z0-9_]{1,32}$/.test(name))
|
|
176
|
+
throw new RangeError(`not an argument name: "${name}"`);
|
|
177
|
+
const last = this.args[this.args.length - 1];
|
|
178
|
+
if (last?.type.greedy)
|
|
179
|
+
throw new TypeError(`/${this.name}: nothing can follow "${last.name}" (it takes the rest of the line)`);
|
|
180
|
+
if (last?.optional && !options.optional)
|
|
181
|
+
throw new TypeError(`/${this.name}: "${name}" can't follow an optional argument`);
|
|
182
|
+
this.args.push({ name, type, optional: options.optional ?? false });
|
|
183
|
+
return this;
|
|
184
|
+
}
|
|
185
|
+
/** A subcommand: `/faction invite ...` is `command("faction").then(command("invite")...)`. */
|
|
186
|
+
then(sub) {
|
|
187
|
+
this.children.push(sub);
|
|
188
|
+
return this;
|
|
189
|
+
}
|
|
190
|
+
/** What it does: `fn(player, args, line)`; throw `CommandError` to tell them what's wrong. */
|
|
191
|
+
executes(fn) {
|
|
192
|
+
this.run = fn;
|
|
193
|
+
return this;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/** Starts a command: see `CommandBuilder`. */
|
|
197
|
+
export function command(name) {
|
|
198
|
+
return new CommandBuilder(name);
|
|
199
|
+
}
|
|
200
|
+
const allowed = (b, p) => {
|
|
201
|
+
try {
|
|
202
|
+
return !b.check || b.check(p);
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
const named = (b, word) => b.name === word || b.aliases.includes(word);
|
|
209
|
+
// Every way of using it: the literals on the way, and the arguments.
|
|
210
|
+
function syntaxes(b, p, prefix = []) {
|
|
211
|
+
const own = [...prefix, ...b.args.map((a) => `${a.optional ? "opt" : "arg"}:${a.name}:${a.type.token}`)];
|
|
212
|
+
const out = [];
|
|
213
|
+
if (b.run)
|
|
214
|
+
out.push({ tokens: own, text: b.text });
|
|
215
|
+
for (const c of b.children) {
|
|
216
|
+
if (allowed(c, p))
|
|
217
|
+
out.push(...syntaxes(c, p, [...own, `lit:${c.name}`]));
|
|
218
|
+
}
|
|
219
|
+
return out;
|
|
220
|
+
}
|
|
221
|
+
// "/pay <player> <amount>", for each way of using it.
|
|
222
|
+
function usage(name, b, p) {
|
|
223
|
+
return syntaxes(b, p).map((s) => `/${name} ` + s.tokens.map((t) => {
|
|
224
|
+
const [kind, n] = t.split(":");
|
|
225
|
+
return kind === "lit" ? n : kind === "opt" ? `[${n}]` : `<${n}>`;
|
|
226
|
+
}).join(" "));
|
|
227
|
+
}
|
|
228
|
+
/** `server.commands`: the server's chat commands. */
|
|
229
|
+
export class Commands {
|
|
230
|
+
#roots = [];
|
|
231
|
+
#send;
|
|
232
|
+
#players;
|
|
233
|
+
#error;
|
|
234
|
+
/** @internal */
|
|
235
|
+
constructor(send, players, error) {
|
|
236
|
+
this.#send = send;
|
|
237
|
+
this.#players = players;
|
|
238
|
+
this.#error = error;
|
|
239
|
+
}
|
|
240
|
+
/** Adds commands (players' chat suggests them at once). */
|
|
241
|
+
register(...commands) {
|
|
242
|
+
for (const c of commands) {
|
|
243
|
+
for (const n of [c.name, ...c.aliases]) {
|
|
244
|
+
if (this.#roots.some((r) => named(r, n)))
|
|
245
|
+
throw new Error(`/${n} is already a command`);
|
|
246
|
+
}
|
|
247
|
+
this.#roots.push(c);
|
|
248
|
+
}
|
|
249
|
+
for (const p of this.#players())
|
|
250
|
+
this.refresh(p);
|
|
251
|
+
return this;
|
|
252
|
+
}
|
|
253
|
+
/** Removes a command, by its name. */
|
|
254
|
+
unregister(name) {
|
|
255
|
+
this.#roots = this.#roots.filter((r) => r.name !== name.toLowerCase());
|
|
256
|
+
for (const p of this.#players())
|
|
257
|
+
this.refresh(p);
|
|
258
|
+
}
|
|
259
|
+
/** Sends their chat the commands they can use now: after what `requires` checks changes (their admin level...). */
|
|
260
|
+
refresh(player) {
|
|
261
|
+
if (!player.connected)
|
|
262
|
+
return;
|
|
263
|
+
const lines = [];
|
|
264
|
+
for (const r of this.#roots) {
|
|
265
|
+
if (!allowed(r, player))
|
|
266
|
+
continue;
|
|
267
|
+
for (const n of [r.name, ...r.aliases]) {
|
|
268
|
+
for (const s of syntaxes(r, player))
|
|
269
|
+
lines.push([n, s.text, s.tokens.join(" ")].join("\t"));
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
this.#send(player, lines.join("\n"));
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* @internal A /command line from `player`: true if a registered command
|
|
276
|
+
* took it (run, or its usage error shown), false if none is called that.
|
|
277
|
+
*/
|
|
278
|
+
async handle(player, line) {
|
|
279
|
+
const words = line.slice(1).trim().split(/\s+/).filter(Boolean);
|
|
280
|
+
const name = (words.shift() ?? "").toLowerCase();
|
|
281
|
+
const root = this.#roots.find((r) => named(r, name));
|
|
282
|
+
if (!root || !allowed(root, player))
|
|
283
|
+
return false;
|
|
284
|
+
const rest = line.slice(1).trim().slice(line.slice(1).trim().split(/\s+/)[0].length).trim();
|
|
285
|
+
try {
|
|
286
|
+
await this.#run(root, player, rest, {}, name, line);
|
|
287
|
+
}
|
|
288
|
+
catch (err) {
|
|
289
|
+
if (err instanceof CommandError) {
|
|
290
|
+
this.#error(player, err.message);
|
|
291
|
+
for (const u of usage(name, root, player).slice(0, 4))
|
|
292
|
+
this.#error(player, `Usage: ${u}`);
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
console.error(`[sagl] /${name} threw:`, err);
|
|
296
|
+
this.#error(player, "That command failed.");
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
return true;
|
|
300
|
+
}
|
|
301
|
+
async #run(b, player, rest, args, name, line) {
|
|
302
|
+
let text = rest;
|
|
303
|
+
for (const a of b.args) {
|
|
304
|
+
text = text.trimStart();
|
|
305
|
+
if (!text) {
|
|
306
|
+
if (a.optional)
|
|
307
|
+
break;
|
|
308
|
+
throw new CommandError(`Missing ${a.name}`);
|
|
309
|
+
}
|
|
310
|
+
let word;
|
|
311
|
+
if (a.type.greedy) {
|
|
312
|
+
word = text;
|
|
313
|
+
text = "";
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
const m = /^\S+/.exec(text);
|
|
317
|
+
word = m[0];
|
|
318
|
+
text = text.slice(word.length);
|
|
319
|
+
}
|
|
320
|
+
args[a.name] = a.type.parse(word, player);
|
|
321
|
+
}
|
|
322
|
+
text = text.trim();
|
|
323
|
+
if (text) {
|
|
324
|
+
const next = text.split(/\s+/)[0].toLowerCase();
|
|
325
|
+
const sub = b.children.find((c) => named(c, next) && allowed(c, player));
|
|
326
|
+
if (sub)
|
|
327
|
+
return this.#run(sub, player, text.slice(next.length), args, name, line);
|
|
328
|
+
if (!b.children.length)
|
|
329
|
+
throw new CommandError("Too much after the command");
|
|
330
|
+
throw new CommandError(`Unknown: "${next}"`);
|
|
331
|
+
}
|
|
332
|
+
if (!b.run)
|
|
333
|
+
throw new CommandError(b.children.length ? "Which one?" : "That can't be used alone");
|
|
334
|
+
await b.run(player, args, line);
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* @internal Suggestions for the custom argument being typed at the end of
|
|
338
|
+
* `line`: [where its word starts, suggestions], or null.
|
|
339
|
+
*/
|
|
340
|
+
async suggest(player, line) {
|
|
341
|
+
const body = line.slice(1);
|
|
342
|
+
const words = body.split(" ");
|
|
343
|
+
const root = this.#roots.find((r) => named(r, (words[0] ?? "").toLowerCase()));
|
|
344
|
+
if (!root || !allowed(root, player))
|
|
345
|
+
return null;
|
|
346
|
+
let b = root;
|
|
347
|
+
let i = 1;
|
|
348
|
+
let pos = 1 + words[0].length + 1;
|
|
349
|
+
for (;;) {
|
|
350
|
+
for (const a of b.args) {
|
|
351
|
+
const last = i === words.length - 1;
|
|
352
|
+
if (a.type.greedy || last) {
|
|
353
|
+
const partial = a.type.greedy ? words.slice(i).join(" ") : words[i];
|
|
354
|
+
if (!a.type.suggest)
|
|
355
|
+
return null;
|
|
356
|
+
const list = await a.type.suggest(player, partial ?? "");
|
|
357
|
+
return [pos, list.slice(0, 20)];
|
|
358
|
+
}
|
|
359
|
+
pos += words[i].length + 1;
|
|
360
|
+
++i;
|
|
361
|
+
}
|
|
362
|
+
if (i >= words.length)
|
|
363
|
+
return null;
|
|
364
|
+
const sub = b.children.find((c) => named(c, words[i].toLowerCase()) && allowed(c, player));
|
|
365
|
+
if (!sub || i === words.length - 1)
|
|
366
|
+
return null;
|
|
367
|
+
pos += words[i].length + 1;
|
|
368
|
+
++i;
|
|
369
|
+
b = sub;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAGA,wEAAwE;AACxE,MAAM,OAAO,YAAa,SAAQ,KAAK;CAAG;AAwB1C,IAAI,MAAM,GAAW,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC;AACrE,gBAAgB;AAChB,MAAM,UAAU,SAAS,CAAC,CAAS;IACjC,MAAM,GAAG,CAAC,CAAC;AACb,CAAC;AAED,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AAEzD,8DAA8D;AAC9D,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,mEAAmE;IACnE,MAAM;QACJ,OAAO;YACL,KAAK,EAAE,QAAQ;YACf,KAAK,EAAE,QAAQ;YACf,KAAK,CAAC,KAAK;gBACT,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC7B,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBACxB,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oBAClD,IAAI,CAAC;wBAAE,OAAO,CAAC,CAAC;gBAClB,CAAC;gBACD,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;gBAClC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC;gBAC9D,IAAI,KAAK;oBAAE,OAAO,KAAK,CAAC;gBACxB,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC1E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC5C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;oBAAE,MAAM,IAAI,YAAY,CAAC,iCAAiC,KAAK,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACpI,MAAM,IAAI,YAAY,CAAC,cAAc,KAAK,GAAG,CAAC,CAAC;YACjD,CAAC;SACF,CAAC;IACJ,CAAC;IACD,0CAA0C;IAC1C,OAAO,CAAC,IAAoC,EAAE;QAC5C,MAAM,EAAE,GAAG,GAAG,CAAC,UAAU,EAAE,GAAG,GAAG,UAAU,EAAE,GAAG,CAAC,CAAC;QAClD,OAAO;YACL,KAAK,EAAE,CAAC,CAAC,GAAG,KAAK,SAAS,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ;YACvH,KAAK,EAAE,OAAO,GAAG,IAAI,GAAG,EAAE;YAC1B,KAAK,CAAC,KAAK;gBACT,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;oBAAE,MAAM,IAAI,YAAY,CAAC,IAAI,KAAK,wBAAwB,CAAC,CAAC;gBACzF,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;gBACxB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG;oBAAE,MAAM,IAAI,YAAY,CAAC,GAAG,CAAC,iBAAiB,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC;gBAClF,OAAO,CAAC,CAAC;YACX,CAAC;SACF,CAAC;IACJ,CAAC;IACD,mDAAmD;IACnD,MAAM,CAAC,IAAoC,EAAE;QAC3C,MAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,EAAE,GAAG,GAAG,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC9C,OAAO;YACL,KAAK,EAAE,QAAQ;YACf,KAAK,EAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAClF,KAAK,CAAC,KAAK;gBACT,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;gBACxB,IAAI,KAAK,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAAE,MAAM,IAAI,YAAY,CAAC,IAAI,KAAK,kBAAkB,CAAC,CAAC;gBAC7F,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG;oBAAE,MAAM,IAAI,YAAY,CAAC,GAAG,CAAC,iBAAiB,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC;gBAClF,OAAO,CAAC,CAAC;YACX,CAAC;SACF,CAAC;IACJ,CAAC;IACD,gBAAgB;IAChB,IAAI;QACF,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC;IACnE,CAAC;IACD,gDAAgD;IAChD,IAAI;QACF,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC;IACjF,CAAC;IACD,uCAAuC;IACvC,OAAO;QACL,OAAO;YACL,KAAK,EAAE,QAAQ;YACf,KAAK,EAAE,iCAAiC;YACxC,KAAK,CAAC,KAAK;gBACT,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;gBAC9B,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAAE,OAAO,IAAI,CAAC;gBACxD,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAAE,OAAO,KAAK,CAAC;gBAC1D,MAAM,IAAI,YAAY,CAAC,IAAI,KAAK,mBAAmB,CAAC,CAAC;YACvD,CAAC;SACF,CAAC;IACJ,CAAC;IACD,0BAA0B;IAC1B,MAAM,CAAmB,OAAqB;QAC5C,OAAO;YACL,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;YACxB,KAAK,EAAE,UAAU,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YAC/C,KAAK,CAAC,KAAK;gBACT,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;gBACvE,IAAI,CAAC,KAAK,SAAS;oBAAE,MAAM,IAAI,YAAY,CAAC,IAAI,KAAK,kBAAkB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC7F,OAAO,CAAC,CAAC;YACX,CAAC;SACF,CAAC;IACJ,CAAC;IACD,4BAA4B;IAC5B,OAAO;QACL,OAAO;YACL,KAAK,EAAE,YAAY;YACnB,KAAK,EAAE,kBAAkB;YACzB,KAAK,CAAC,KAAK;gBACT,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC1E,IAAI,CAAC,CAAC;oBAAE,MAAM,IAAI,YAAY,CAAC,cAAc,KAAK,EAAE,CAAC,CAAC;gBACtD,OAAO,CAAC,CAAC;YACX,CAAC;SACF,CAAC;IACJ,CAAC;IACD;;;OAGG;IACH,MAAM,CAAI,CAKT;QACC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;IACnG,CAAC;CACF,CAAC;AAYF;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,cAAc;IACzB,gBAAgB,CAAU,IAAI,CAAS;IACvC,gBAAgB,CAAC,OAAO,GAAa,EAAE,CAAC;IACxC,gBAAgB,CAAC,IAAI,GAAG,EAAE,CAAC;IAC3B,gBAAgB,CAAC,KAAK,GAAyC,IAAI,CAAC;IACpE,gBAAgB,CAAC,IAAI,GAAa,EAAE,CAAC;IACrC,gBAAgB,CAAC,QAAQ,GAAqB,EAAE,CAAC;IACjD,gBAAgB,CAAC,GAAG,GAAoB,IAAI,CAAC;IAE7C,gBAAgB;IAChB,YAAY,IAAY;QACtB,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,wBAAwB,IAAI,GAAG,CAAC,CAAC;QAChG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,CAAC;IAED,0BAA0B;IAC1B,KAAK,CAAC,GAAG,KAAe;QACtB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC;gBAAE,MAAM,IAAI,UAAU,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC;YAC1F,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QACrC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,oEAAoE;IACpE,WAAW,CAAC,IAAY;QACtB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,iEAAiE;IACjE,QAAQ,CAAC,KAAkC;QACzC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,kDAAkD;IAClD,QAAQ,CAAC,IAAY,EAAE,IAAsB,EAAE,UAAkC,EAAE;QACjF,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,0BAA0B,IAAI,GAAG,CAAC,CAAC;QAChG,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC7C,IAAI,IAAI,EAAE,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,SAAS,CAAC,IAAI,IAAI,CAAC,IAAI,yBAAyB,IAAI,CAAC,IAAI,mCAAmC,CAAC,CAAC;QAC/H,IAAI,IAAI,EAAE,QAAQ,IAAI,CAAC,OAAO,CAAC,QAAQ;YAAE,MAAM,IAAI,SAAS,CAAC,IAAI,IAAI,CAAC,IAAI,MAAM,IAAI,qCAAqC,CAAC,CAAC;QAC3H,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,KAAK,EAAE,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8FAA8F;IAC9F,IAAI,CAAC,GAAmB;QACtB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8FAA8F;IAC9F,QAAQ,CAAC,EAAY;QACnB,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,8CAA8C;AAC9C,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,OAAO,GAAG,CAAC,CAAiB,EAAE,CAAS,EAAE,EAAE;IAC/C,IAAI,CAAC;QACH,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AACF,MAAM,KAAK,GAAG,CAAC,CAAiB,EAAE,IAAY,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAE/F,qEAAqE;AACrE,SAAS,QAAQ,CAAC,CAAiB,EAAE,CAAS,EAAE,SAAmB,EAAE;IACnE,MAAM,GAAG,GAAG,CAAC,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACzG,MAAM,GAAG,GAAyC,EAAE,CAAC;IACrD,IAAI,CAAC,CAAC,GAAG;QAAE,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnD,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC3B,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,sDAAsD;AACtD,SAAS,KAAK,CAAC,IAAY,EAAE,CAAiB,EAAE,CAAS;IACvD,OAAO,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC9B,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC/B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;IACnE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CACb,CAAC;AACJ,CAAC;AAED,qDAAqD;AACrD,MAAM,OAAO,QAAQ;IACnB,MAAM,GAAqB,EAAE,CAAC;IAC9B,KAAK,CAAyC;IAC9C,QAAQ,CAAiB;IACzB,MAAM,CAAyC;IAE/C,gBAAgB;IAChB,YAAY,IAA4C,EAAE,OAAuB,EAAE,KAA6C;QAC9H,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,2DAA2D;IAC3D,QAAQ,CAAC,GAAG,QAA0B;QACpC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YAC1F,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,sCAAsC;IACtC,UAAU,CAAC,IAAY;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACvE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,mHAAmH;IACnH,OAAO,CAAC,MAAc;QACpB,IAAI,CAAC,MAAM,CAAC,SAAS;YAAE,OAAO;QAC9B,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC;gBAAE,SAAS;YAClC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvC,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;oBAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC9F,CAAC;QACH,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACvC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM,CAAC,MAAc,EAAE,IAAY;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAChE,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5F,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,YAAY,EAAE,CAAC;gBAChC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;gBACjC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;oBAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;YAC5F,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,WAAW,IAAI,SAAS,EAAE,GAAG,CAAC,CAAC;gBAC7C,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,CAAiB,EAAE,MAAc,EAAE,IAAY,EAAE,IAAiB,EAAE,IAAY,EAAE,IAAY;QACvG,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;YACvB,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YACxB,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,IAAI,CAAC,CAAC,QAAQ;oBAAE,MAAM;gBACtB,MAAM,IAAI,YAAY,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9C,CAAC;YACD,IAAI,IAAY,CAAC;YACjB,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBAClB,IAAI,GAAG,IAAI,CAAC;gBACZ,IAAI,GAAG,EAAE,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAE,CAAC;gBAC7B,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBACZ,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACjC,CAAC;YACD,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACnB,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YAChD,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;YACzE,IAAI,GAAG;gBAAE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAClF,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM;gBAAE,MAAM,IAAI,YAAY,CAAC,4BAA4B,CAAC,CAAC;YAC7E,MAAM,IAAI,YAAY,CAAC,aAAa,IAAI,GAAG,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC,CAAC,CAAC,GAAG;YAAE,MAAM,IAAI,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC;QAClG,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,IAAY;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAC/E,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QACjD,IAAI,CAAC,GAAG,IAAI,CAAC;QACb,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,IAAI,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAClC,SAAS,CAAC;YACR,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;gBACvB,MAAM,IAAI,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;gBACpC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;oBAC1B,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBACpE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO;wBAAE,OAAO,IAAI,CAAC;oBACjC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;oBACzD,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBAClC,CAAC;gBACD,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC3B,EAAE,CAAC,CAAC;YACN,CAAC;YACD,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YACnC,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;YAC3F,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;YAChD,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YAC3B,EAAE,CAAC,CAAC;YACJ,CAAC,GAAG,GAAG,CAAC;QACV,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Server } from "./server.js";
|
|
2
|
+
export type CommandHandler = (args: string[], line: string) => void;
|
|
3
|
+
/**
|
|
4
|
+
* Operator console on stdin. Comes with built-in commands (`help` lists them);
|
|
5
|
+
* gamemodes add their own:
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* server.console.command("heal", "heal <id>", ([id]) => { ... });
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
11
|
+
export declare class Console {
|
|
12
|
+
#private;
|
|
13
|
+
constructor(server: Server);
|
|
14
|
+
command(name: string, usage: string, run: CommandHandler): this;
|
|
15
|
+
/** Runs one console line, as if typed. */
|
|
16
|
+
run(line: string): void;
|
|
17
|
+
/** @internal */
|
|
18
|
+
start(): void;
|
|
19
|
+
/** @internal */
|
|
20
|
+
stop(): void;
|
|
21
|
+
}
|
package/dist/console.js
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import * as readline from "node:readline";
|
|
2
|
+
import { native } from "./native.js";
|
|
3
|
+
/**
|
|
4
|
+
* Operator console on stdin. Comes with built-in commands (`help` lists them);
|
|
5
|
+
* gamemodes add their own:
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* server.console.command("heal", "heal <id>", ([id]) => { ... });
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
11
|
+
export class Console {
|
|
12
|
+
#server;
|
|
13
|
+
#commands = new Map();
|
|
14
|
+
#rl = null;
|
|
15
|
+
constructor(server) {
|
|
16
|
+
this.#server = server;
|
|
17
|
+
this.#builtins();
|
|
18
|
+
}
|
|
19
|
+
command(name, usage, run) {
|
|
20
|
+
this.#commands.set(name, { usage, run });
|
|
21
|
+
return this;
|
|
22
|
+
}
|
|
23
|
+
/** Runs one console line, as if typed. */
|
|
24
|
+
run(line) {
|
|
25
|
+
const [name, ...args] = line.trim().split(/\s+/);
|
|
26
|
+
if (!name)
|
|
27
|
+
return;
|
|
28
|
+
const command = this.#commands.get(name);
|
|
29
|
+
if (!command) {
|
|
30
|
+
console.log(`unknown command '${name}' (try 'help')`);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
command.run(args, line.trim().slice(name.length).trim());
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
console.error(`${name}:`, err instanceof Error ? err.message : err);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/** @internal */
|
|
41
|
+
start() {
|
|
42
|
+
if (this.#rl || !process.stdin.readable)
|
|
43
|
+
return;
|
|
44
|
+
this.#rl = readline.createInterface({ input: process.stdin, terminal: false });
|
|
45
|
+
this.#rl.on("line", (line) => this.run(line));
|
|
46
|
+
console.log("console: type 'help'");
|
|
47
|
+
}
|
|
48
|
+
/** @internal */
|
|
49
|
+
stop() {
|
|
50
|
+
this.#rl?.close();
|
|
51
|
+
this.#rl = null;
|
|
52
|
+
}
|
|
53
|
+
#player(arg) {
|
|
54
|
+
const player = arg === undefined ? undefined : this.#server.player(Number(arg));
|
|
55
|
+
if (!player)
|
|
56
|
+
throw new Error(`no player ${arg}`);
|
|
57
|
+
return player;
|
|
58
|
+
}
|
|
59
|
+
#builtins() {
|
|
60
|
+
const server = this.#server;
|
|
61
|
+
this.command("help", "help", () => {
|
|
62
|
+
for (const { usage } of this.#commands.values())
|
|
63
|
+
console.log(` ${usage}`);
|
|
64
|
+
});
|
|
65
|
+
this.command("players", "players", () => {
|
|
66
|
+
for (const p of server.players) {
|
|
67
|
+
const pos = p.position;
|
|
68
|
+
console.log(` ${p.id}: ${p.name} ${p.ip} skin ${p.skin} hp ${p.health} ` +
|
|
69
|
+
`at ${pos.x.toFixed(1)} ${pos.y.toFixed(1)} ${pos.z.toFixed(1)} ping ${p.ping} ms`);
|
|
70
|
+
}
|
|
71
|
+
console.log(`${server.players.length} player(s)`);
|
|
72
|
+
});
|
|
73
|
+
this.command("time", "time [HH:MM]", ([arg]) => {
|
|
74
|
+
if (arg) {
|
|
75
|
+
const [hour, minute] = arg.split(":").map(Number);
|
|
76
|
+
server.time = { hour, minute };
|
|
77
|
+
}
|
|
78
|
+
const t = server.time;
|
|
79
|
+
console.log(`time ${String(t.hour).padStart(2, "0")}:${String(t.minute).padStart(2, "0")}, ${t.frozen ? "frozen" : "running"}`);
|
|
80
|
+
});
|
|
81
|
+
this.command("freeze", "freeze", () => server.freezeTime());
|
|
82
|
+
this.command("unfreeze", "unfreeze", () => server.unfreezeTime());
|
|
83
|
+
this.command("skin", "skin <id> <model|random>", ([id, model]) => {
|
|
84
|
+
const skin = model === "random" ? server.randomSkin() : Number(model);
|
|
85
|
+
if (!native.isValidSkin(skin))
|
|
86
|
+
throw new Error(`not a valid ped model: ${model}`);
|
|
87
|
+
this.#player(id).skin = skin;
|
|
88
|
+
});
|
|
89
|
+
this.command("say", "say <text>", (_args, rest) => server.broadcast(rest));
|
|
90
|
+
this.command("kick", "kick <id> [reason]", ([id, ...reason]) => this.#player(id).kick(reason.join(" ")));
|
|
91
|
+
this.command("tp", "tp <id> <x> <y> <z>", ([id, x, y, z]) => this.#player(id).setPosition({ x: Number(x), y: Number(y), z: Number(z) }));
|
|
92
|
+
this.command("hp", "hp <id> <health> [armour]", ([id, health, armour]) => {
|
|
93
|
+
const p = this.#player(id);
|
|
94
|
+
p.health = Number(health);
|
|
95
|
+
if (armour !== undefined)
|
|
96
|
+
p.armour = Number(armour);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=console.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console.js","sourceRoot":"","sources":["../src/console.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAE1C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AASrC;;;;;;;GAOG;AACH,MAAM,OAAO,OAAO;IAClB,OAAO,CAAS;IAChB,SAAS,GAAG,IAAI,GAAG,EAAmB,CAAC;IACvC,GAAG,GAA8B,IAAI,CAAC;IAEtC,YAAY,MAAc;QACxB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAED,OAAO,CAAC,IAAY,EAAE,KAAa,EAAE,GAAmB;QACtD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,0CAA0C;IAC1C,GAAG,CAAC,IAAY;QACd,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,gBAAgB,CAAC,CAAC;YACtD,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,KAAK;QACH,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ;YAAE,OAAO;QAChD,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/E,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACtC,CAAC;IAED,gBAAgB;IAChB,IAAI;QACF,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;QAClB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAuB;QAC7B,MAAM,MAAM,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChF,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,aAAa,GAAG,EAAE,CAAC,CAAC;QACjD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,SAAS;QACP,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE;YAChC,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE;gBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;QAC7E,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE;YACtC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC/B,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC;gBACvB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,MAAM,GAAG;oBAC3D,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,CACrF,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,YAAY,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE;YAC7C,IAAI,GAAG,EAAE,CAAC;gBACR,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAClD,MAAM,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YACjC,CAAC;YACD,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,QAAQ,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QAClI,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;QAClE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,0BAA0B,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE;YAC/D,MAAM,IAAI,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACtE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,EAAE,CAAC,CAAC;YAClF,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;QAC/B,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3E,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,oBAAoB,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACzG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,qBAAqB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAC1D,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAC3E,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,2BAA2B,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE;YACvE,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC3B,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YAC1B,IAAI,MAAM,KAAK,SAAS;gBAAE,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|