lunibee 0.3.3 → 0.4.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/README.md +1 -1
- package/dist/builders/commands.d.ts +1 -1
- package/dist/builders/components.d.ts +9 -11
- package/dist/builders/embed.d.ts +1 -1
- package/dist/builders/index.d.ts +1 -1
- package/dist/builders/index.js +87 -1298
- package/dist/builders/index.js.map +3 -11
- package/dist/chunks/index-0wn81eng.js +2492 -0
- package/dist/chunks/index-0wn81eng.js.map +17 -0
- package/dist/chunks/index-2en489j6.js +40 -0
- package/dist/chunks/index-2en489j6.js.map +10 -0
- package/dist/chunks/index-3hyps48a.js +203 -0
- package/dist/chunks/index-3hyps48a.js.map +11 -0
- package/dist/chunks/index-57c5n3ms.js +2274 -0
- package/dist/chunks/index-57c5n3ms.js.map +19 -0
- package/dist/chunks/index-5yx92e36.js +1170 -0
- package/dist/chunks/index-5yx92e36.js.map +14 -0
- package/dist/chunks/index-690bp093.js +95 -0
- package/dist/chunks/index-690bp093.js.map +10 -0
- package/dist/chunks/index-7fp2hvmg.js +2155 -0
- package/dist/chunks/index-7fp2hvmg.js.map +24 -0
- package/dist/chunks/index-cnmsajvk.js +1119 -0
- package/dist/chunks/index-cnmsajvk.js.map +12 -0
- package/dist/chunks/index-fdvgk2sw.js +1310 -0
- package/dist/chunks/index-fdvgk2sw.js.map +21 -0
- package/dist/chunks/index-gyvps8b9.js +214 -0
- package/dist/chunks/index-gyvps8b9.js.map +12 -0
- package/dist/chunks/index-jzg4bh99.js +1533 -0
- package/dist/chunks/index-jzg4bh99.js.map +21 -0
- package/dist/chunks/index-mgw2yvrm.js +3547 -0
- package/dist/chunks/index-mgw2yvrm.js.map +25 -0
- package/dist/chunks/index-yh76b55h.js +3449 -0
- package/dist/chunks/index-yh76b55h.js.map +29 -0
- package/dist/collection/index.js +9 -1118
- package/dist/collection/index.js.map +3 -6
- package/dist/core/api.d.ts +3 -3
- package/dist/core/channel-create.d.ts +2 -2
- package/dist/core/commands.d.ts +3 -3
- package/dist/core/events.d.ts +4 -4
- package/dist/core/handles.d.ts +4 -4
- package/dist/core/index.d.ts +25 -20
- package/dist/core/index.js +68 -10130
- package/dist/core/index.js.map +3 -65
- package/dist/core/permissions.d.ts +1 -1
- package/dist/core/redis-cache.d.ts +1 -1
- package/dist/formatters/index.js +41 -110
- package/dist/formatters/index.js.map +3 -4
- package/dist/handlers/index.js +5 -37
- package/dist/handlers/index.js.map +3 -4
- package/dist/index.d.ts +21 -21
- package/dist/index.js +641 -16325
- package/dist/index.js.map +3 -92
- package/dist/managers/advanced.d.ts +3 -3
- package/dist/managers/application.d.ts +2 -2
- package/dist/managers/base.d.ts +1 -1
- package/dist/managers/emoji.d.ts +2 -2
- package/dist/managers/guild-resources.d.ts +6 -6
- package/dist/managers/guild.d.ts +3 -3
- package/dist/managers/index.d.ts +4 -8
- package/dist/managers/index.js +51 -4060
- package/dist/managers/index.js.map +3 -29
- package/dist/managers/member.d.ts +2 -2
- package/dist/managers/message.d.ts +14 -6
- package/dist/managers/role.d.ts +2 -2
- package/dist/managers/thread.d.ts +3 -3
- package/dist/managers/user.d.ts +7 -4
- package/dist/rest/index.d.ts +10 -35
- package/dist/rest/index.js +57 -2184
- package/dist/rest/index.js.map +3 -18
- package/dist/rest/limiter.d.ts +9 -1
- package/dist/rest/webhook.d.ts +2 -8
- package/dist/sharding/bus.d.ts +2 -2
- package/dist/sharding/cluster.d.ts +45 -5
- package/dist/sharding/context.d.ts +45 -3
- package/dist/sharding/gateway-bot.d.ts +2 -1
- package/dist/sharding/health.d.ts +1 -1
- package/dist/sharding/identify.d.ts +12 -0
- package/dist/sharding/index.d.ts +44 -11
- package/dist/sharding/index.js +60 -4620
- package/dist/sharding/index.js.map +3 -33
- package/dist/sharding/supervisor.d.ts +4 -2
- package/dist/structures/audit-log.d.ts +1 -1
- package/dist/structures/base.d.ts +6 -6
- package/dist/structures/channels.d.ts +1 -1
- package/dist/structures/embed.d.ts +1 -1
- package/dist/structures/index.d.ts +14 -14
- package/dist/structures/index.js +109 -2382
- package/dist/structures/index.js.map +3 -16
- package/dist/structures/interactions.d.ts +13 -9
- package/dist/structures/options.d.ts +1 -1
- package/dist/structures/permissions.d.ts +2 -2
- package/dist/structures/resources.d.ts +10 -10
- package/dist/structures/sticker.d.ts +1 -1
- package/dist/types/gateway.d.ts +2 -79
- package/dist/types/index.d.ts +0 -6
- package/dist/types/index.js +41 -272
- package/dist/types/index.js.map +3 -6
- package/dist/utils/index.js +23 -209
- package/dist/utils/index.js.map +3 -5
- package/dist/voice/connection.d.ts +200 -0
- package/dist/voice/crypto.d.ts +50 -0
- package/dist/voice/dave.d.ts +85 -0
- package/dist/voice/effects.d.ts +31 -0
- package/dist/voice/emitter.d.ts +14 -0
- package/dist/voice/gateway.d.ts +59 -0
- package/dist/voice/index.d.ts +25 -228
- package/dist/voice/index.js +111 -442
- package/dist/voice/index.js.map +3 -4
- package/dist/voice/libopus.d.ts +88 -0
- package/dist/voice/networking.d.ts +80 -0
- package/dist/voice/ogg.d.ts +24 -0
- package/dist/voice/opus.d.ts +18 -0
- package/dist/voice/player.d.ts +79 -0
- package/dist/voice/protocol.d.ts +76 -0
- package/dist/voice/receiver.d.ts +59 -0
- package/dist/voice/resource.d.ts +102 -0
- package/dist/voice/udp.d.ts +40 -0
- package/dist/ws/close-codes.d.ts +1 -1
- package/dist/ws/index.d.ts +25 -4
- package/dist/ws/index.js +47 -1336
- package/dist/ws/index.js.map +3 -17
- package/dist/ws/protocol.d.ts +1 -1
- package/dist/ws/send-budget.d.ts +0 -2
- package/dist/ws/state.d.ts +0 -10
- package/package.json +19 -16
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// packages/handlers/src/index.ts
|
|
3
|
+
class HandlerRegistry2 {
|
|
4
|
+
#handlers = {};
|
|
5
|
+
on(event, handler) {
|
|
6
|
+
(this.#handlers[event] ??= new Set).add(handler);
|
|
7
|
+
return this;
|
|
8
|
+
}
|
|
9
|
+
once(event, handler) {
|
|
10
|
+
const wrapped = (...args) => {
|
|
11
|
+
this.off(event, wrapped);
|
|
12
|
+
return handler(...args);
|
|
13
|
+
};
|
|
14
|
+
return this.on(event, wrapped);
|
|
15
|
+
}
|
|
16
|
+
off(event, handler) {
|
|
17
|
+
this.#handlers[event]?.delete(handler);
|
|
18
|
+
return this;
|
|
19
|
+
}
|
|
20
|
+
async dispatch(event, ...args) {
|
|
21
|
+
const errors = [];
|
|
22
|
+
for (const handler of this.#handlers[event] ?? [])
|
|
23
|
+
try {
|
|
24
|
+
await handler(...args);
|
|
25
|
+
} catch (error) {
|
|
26
|
+
errors.push(error);
|
|
27
|
+
}
|
|
28
|
+
if (errors.length === 1)
|
|
29
|
+
throw errors[0];
|
|
30
|
+
if (errors.length > 1)
|
|
31
|
+
throw new AggregateError(errors, "Several handlers failed.");
|
|
32
|
+
}
|
|
33
|
+
emit(event, ...args) {
|
|
34
|
+
return this.dispatch(event, ...args);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export { HandlerRegistry2 };
|
|
39
|
+
|
|
40
|
+
//# debugId=20D8D45903A899F064756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../packages/handlers/src/index.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/** A typed handler registry for Lunibee events. */\nexport class HandlerRegistry<\n Events extends { [K in keyof Events]: unknown[] },\n> {\n /** Registered event handlers. */\n readonly #handlers: {\n [K in keyof Events]?: Set<(...args: Events[K]) => unknown>;\n } = {};\n /** Registers a handler for an event. @param event Event key. @param handler Handler callback. @returns This registry. */\n public on<K extends keyof Events>(\n event: K,\n handler: (...args: Events[K]) => unknown,\n ): this {\n (this.#handlers[event] ??= new Set()).add(handler);\n return this;\n }\n /** Registers a one-shot handler. @param event Event key. @param handler Handler callback. @returns This registry. */\n public once<K extends keyof Events>(\n event: K,\n handler: (...args: Events[K]) => unknown,\n ): this {\n const wrapped = (...args: Events[K]) => {\n this.off(event, wrapped);\n return handler(...args);\n };\n return this.on(event, wrapped);\n }\n /** Removes a handler. @param event Event key. @param handler Handler callback. @returns This registry. */\n public off<K extends keyof Events>(\n event: K,\n handler: (...args: Events[K]) => unknown,\n ): this {\n this.#handlers[event]?.delete(handler);\n return this;\n }\n /** Dispatches an event to registered handlers. @param event Event key. @param args Event arguments. @returns A promise fulfilled after handlers complete. */\n public async dispatch<K extends keyof Events>(\n event: K,\n ...args: Events[K]\n ): Promise<void> {\n const errors: unknown[] = [];\n for (const handler of this.#handlers[event] ?? [])\n try {\n await handler(...args);\n } catch (error) {\n errors.push(error);\n }\n if (errors.length === 1) throw errors[0];\n if (errors.length > 1)\n throw new AggregateError(errors, \"Several handlers failed.\");\n }\n /** Emits an event using the conventional emitter name. @param event Event key. @param args Event arguments. @returns A promise fulfilled after handlers complete. */\n public emit<K extends keyof Events>(\n event: K,\n ...args: Events[K]\n ): Promise<void> {\n return this.dispatch(event, ...args);\n }\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;AACO,MAAM,iBAEX;AAAA,EAEW,YAEL,CAAC;AAAA,EAEE,EAA0B,CAC7B,OACA,SACI;AAAA,KACH,KAAK,UAAU,WAAW,IAAI,KAAO,IAAI,OAAO;AAAA,IACjD,OAAO;AAAA;AAAA,EAGJ,IAA4B,CAC/B,OACA,SACI;AAAA,IACJ,MAAM,UAAU,IAAI,SAAoB;AAAA,MACpC,KAAK,IAAI,OAAO,OAAO;AAAA,MACvB,OAAO,QAAQ,GAAG,IAAI;AAAA;AAAA,IAE1B,OAAO,KAAK,GAAG,OAAO,OAAO;AAAA;AAAA,EAG1B,GAA2B,CAC9B,OACA,SACI;AAAA,IACJ,KAAK,UAAU,QAAQ,OAAO,OAAO;AAAA,IACrC,OAAO;AAAA;AAAA,OAGE,SAAgC,CACzC,UACG,MACU;AAAA,IACb,MAAM,SAAoB,CAAC;AAAA,IAC3B,WAAW,WAAW,KAAK,UAAU,UAAU,CAAC;AAAA,MAC5C,IAAI;AAAA,QACA,MAAM,QAAQ,GAAG,IAAI;AAAA,QACvB,OAAO,OAAO;AAAA,QACZ,OAAO,KAAK,KAAK;AAAA;AAAA,IAEzB,IAAI,OAAO,WAAW;AAAA,MAAG,MAAM,OAAO;AAAA,IACtC,IAAI,OAAO,SAAS;AAAA,MAChB,MAAM,IAAI,eAAe,QAAQ,0BAA0B;AAAA;AAAA,EAG5D,IAA4B,CAC/B,UACG,MACU;AAAA,IACb,OAAO,KAAK,SAAS,OAAO,GAAG,IAAI;AAAA;AAE3C;",
|
|
8
|
+
"debugId": "20D8D45903A899F064756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// packages/utils/src/args.ts
|
|
3
|
+
var SNOWFLAKE = /^\d{16,20}$/;
|
|
4
|
+
var TRUE_WORDS = new Set([
|
|
5
|
+
"true",
|
|
6
|
+
"yes",
|
|
7
|
+
"y",
|
|
8
|
+
"on",
|
|
9
|
+
"1",
|
|
10
|
+
"enable",
|
|
11
|
+
"enabled"
|
|
12
|
+
]);
|
|
13
|
+
var FALSE_WORDS = new Set([
|
|
14
|
+
"false",
|
|
15
|
+
"no",
|
|
16
|
+
"n",
|
|
17
|
+
"off",
|
|
18
|
+
"0",
|
|
19
|
+
"disable",
|
|
20
|
+
"disabled"
|
|
21
|
+
]);
|
|
22
|
+
function tokenizeArgs2(input) {
|
|
23
|
+
const args = [];
|
|
24
|
+
let current = "";
|
|
25
|
+
let quote = null;
|
|
26
|
+
let started = false;
|
|
27
|
+
for (let index = 0;index < input.length; index++) {
|
|
28
|
+
const character = input[index];
|
|
29
|
+
if (character === "\\" && index + 1 < input.length) {
|
|
30
|
+
current += input[++index];
|
|
31
|
+
started = true;
|
|
32
|
+
} else if (quote) {
|
|
33
|
+
if (character === quote)
|
|
34
|
+
quote = null;
|
|
35
|
+
else
|
|
36
|
+
current += character;
|
|
37
|
+
} else if (character === '"' || character === "'") {
|
|
38
|
+
if (started)
|
|
39
|
+
current += character;
|
|
40
|
+
else {
|
|
41
|
+
quote = character;
|
|
42
|
+
started = true;
|
|
43
|
+
}
|
|
44
|
+
} else if (/\s/.test(character)) {
|
|
45
|
+
if (started)
|
|
46
|
+
args.push(current);
|
|
47
|
+
current = "";
|
|
48
|
+
started = false;
|
|
49
|
+
} else {
|
|
50
|
+
current += character;
|
|
51
|
+
started = true;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (started)
|
|
55
|
+
args.push(current);
|
|
56
|
+
return args;
|
|
57
|
+
}
|
|
58
|
+
function parseUserMention2(value) {
|
|
59
|
+
const id = /^<@!?(\d{16,20})>$/.exec(value)?.[1] ?? value;
|
|
60
|
+
return SNOWFLAKE.test(id) ? id : null;
|
|
61
|
+
}
|
|
62
|
+
function parseRoleMention2(value) {
|
|
63
|
+
const id = /^<@&(\d{16,20})>$/.exec(value)?.[1] ?? value;
|
|
64
|
+
return SNOWFLAKE.test(id) ? id : null;
|
|
65
|
+
}
|
|
66
|
+
function parseChannelMention2(value) {
|
|
67
|
+
const id = /^<#(\d{16,20})>$/.exec(value)?.[1] ?? value;
|
|
68
|
+
return SNOWFLAKE.test(id) ? id : null;
|
|
69
|
+
}
|
|
70
|
+
function parseMentionable2(value) {
|
|
71
|
+
const role = /^<@&(\d{16,20})>$/.exec(value)?.[1];
|
|
72
|
+
if (role)
|
|
73
|
+
return { id: role, type: "role" };
|
|
74
|
+
const user = parseUserMention2(value);
|
|
75
|
+
return user ? { id: user, type: "user" } : null;
|
|
76
|
+
}
|
|
77
|
+
function readOne(spec, raw) {
|
|
78
|
+
switch (spec.type) {
|
|
79
|
+
case "string":
|
|
80
|
+
case "rest":
|
|
81
|
+
if (spec.maxLength !== undefined && raw.length > spec.maxLength)
|
|
82
|
+
return {
|
|
83
|
+
error: `must be at most ${spec.maxLength} characters`
|
|
84
|
+
};
|
|
85
|
+
if (spec.choices) {
|
|
86
|
+
const lower = raw.toLowerCase();
|
|
87
|
+
const choice = spec.choices.find((c) => String(c) === raw) ?? spec.choices.find((c) => String(c).toLowerCase() === lower);
|
|
88
|
+
if (choice === undefined)
|
|
89
|
+
return {
|
|
90
|
+
error: `must be one of: ${spec.choices.join(", ")}`
|
|
91
|
+
};
|
|
92
|
+
return { value: String(choice) };
|
|
93
|
+
}
|
|
94
|
+
return { value: raw };
|
|
95
|
+
case "integer":
|
|
96
|
+
case "number": {
|
|
97
|
+
const value = Number(raw);
|
|
98
|
+
if (!Number.isFinite(value) || raw.trim() === "")
|
|
99
|
+
return { error: "must be a number" };
|
|
100
|
+
if (spec.type === "integer" && !Number.isSafeInteger(value))
|
|
101
|
+
return { error: "must be a whole number" };
|
|
102
|
+
if (spec.min !== undefined && value < spec.min)
|
|
103
|
+
return { error: `must be at least ${spec.min}` };
|
|
104
|
+
if (spec.max !== undefined && value > spec.max)
|
|
105
|
+
return { error: `must be at most ${spec.max}` };
|
|
106
|
+
if (spec.choices && !spec.choices.includes(value))
|
|
107
|
+
return { error: `must be one of: ${spec.choices.join(", ")}` };
|
|
108
|
+
return { value };
|
|
109
|
+
}
|
|
110
|
+
case "boolean": {
|
|
111
|
+
const word = raw.toLowerCase();
|
|
112
|
+
if (TRUE_WORDS.has(word))
|
|
113
|
+
return { value: true };
|
|
114
|
+
if (FALSE_WORDS.has(word))
|
|
115
|
+
return { value: false };
|
|
116
|
+
return { error: "must be yes or no" };
|
|
117
|
+
}
|
|
118
|
+
case "user": {
|
|
119
|
+
const id = parseUserMention2(raw);
|
|
120
|
+
return id ? { value: id } : { error: "must be a user mention or ID" };
|
|
121
|
+
}
|
|
122
|
+
case "role": {
|
|
123
|
+
const id = parseRoleMention2(raw);
|
|
124
|
+
return id ? { value: id } : { error: "must be a role mention or ID" };
|
|
125
|
+
}
|
|
126
|
+
case "channel": {
|
|
127
|
+
const id = parseChannelMention2(raw);
|
|
128
|
+
return id ? { value: id } : { error: "must be a channel mention or ID" };
|
|
129
|
+
}
|
|
130
|
+
case "mentionable": {
|
|
131
|
+
const value = parseMentionable2(raw);
|
|
132
|
+
return value ? { value } : { error: "must be a user or role mention" };
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function parsePrefixArgs2(input, specs) {
|
|
137
|
+
const args = typeof input === "string" ? tokenizeArgs2(input) : [...input];
|
|
138
|
+
const values = Object.create(null);
|
|
139
|
+
let position = 0;
|
|
140
|
+
for (const [index, spec] of specs.entries()) {
|
|
141
|
+
if (spec.type === "rest" && index !== specs.length - 1)
|
|
142
|
+
throw new TypeError(`The rest argument "${spec.name}" must be the last one.`);
|
|
143
|
+
const raw = spec.type === "rest" ? args.slice(position).join(" ") : args[position];
|
|
144
|
+
if (raw === undefined || raw === "") {
|
|
145
|
+
if (spec.required)
|
|
146
|
+
return { ok: false, arg: spec.name, error: "is required" };
|
|
147
|
+
values[spec.name] = undefined;
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
const read = readOne(spec, raw);
|
|
151
|
+
if ("error" in read)
|
|
152
|
+
return { ok: false, arg: spec.name, error: read.error };
|
|
153
|
+
values[spec.name] = read.value;
|
|
154
|
+
position += spec.type === "rest" ? args.length : 1;
|
|
155
|
+
}
|
|
156
|
+
return { ok: true, values };
|
|
157
|
+
}
|
|
158
|
+
var OPTION_TYPES = {
|
|
159
|
+
3: "string",
|
|
160
|
+
4: "integer",
|
|
161
|
+
5: "boolean",
|
|
162
|
+
6: "user",
|
|
163
|
+
7: "channel",
|
|
164
|
+
8: "role",
|
|
165
|
+
9: "mentionable",
|
|
166
|
+
10: "number"
|
|
167
|
+
};
|
|
168
|
+
function argsFromCommandOptions2(options, restLast = false) {
|
|
169
|
+
const specs = [];
|
|
170
|
+
for (const option of options) {
|
|
171
|
+
const type = OPTION_TYPES[option.type];
|
|
172
|
+
if (!type)
|
|
173
|
+
continue;
|
|
174
|
+
specs.push({
|
|
175
|
+
name: option.name,
|
|
176
|
+
type,
|
|
177
|
+
required: option.required,
|
|
178
|
+
min: option.min_value,
|
|
179
|
+
max: option.max_value,
|
|
180
|
+
maxLength: option.max_length,
|
|
181
|
+
choices: option.choices?.map((choice) => choice.value)
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
const last = specs[specs.length - 1];
|
|
185
|
+
if (restLast && last?.type === "string")
|
|
186
|
+
last.type = "rest";
|
|
187
|
+
return specs;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// packages/utils/src/index.ts
|
|
191
|
+
function sleep2(ms) {
|
|
192
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
193
|
+
}
|
|
194
|
+
function randomInt2(min, max) {
|
|
195
|
+
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
196
|
+
}
|
|
197
|
+
function isSnowflake2(value) {
|
|
198
|
+
return /^\d{16,20}$/.test(value);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
export { tokenizeArgs2, parseUserMention2, parseRoleMention2, parseChannelMention2, parseMentionable2, parsePrefixArgs2, argsFromCommandOptions2, sleep2, randomInt2, isSnowflake2 };
|
|
202
|
+
|
|
203
|
+
//# debugId=AE9CA0445E018E3B64756E2164756E21
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../packages/utils/src/args.ts", "../packages/utils/src/index.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Prefix-command arguments: split a message into arguments and read them as\n * typed values, the way slash-command options are read.\n */\n\n/** What an argument is read as. `rest` takes everything left, as one string. */\nexport type PrefixArgType =\n | \"string\"\n | \"integer\"\n | \"number\"\n | \"boolean\"\n | \"user\"\n | \"role\"\n | \"channel\"\n | \"mentionable\"\n | \"rest\";\n\n/** One expected argument. */\nexport interface PrefixArgSpec {\n name: string;\n type: PrefixArgType;\n required?: boolean;\n /** For `string` and `rest`: the longest accepted value. */\n maxLength?: number;\n /** For `integer` and `number`: the accepted range. */\n min?: number;\n max?: number;\n /** Accepted values. Strings match without regard to case and are returned as the choice itself. */\n choices?: readonly (string | number)[];\n}\n\n/** A mentionable argument: which kind of mention it was. An unmarked ID reads as a user. */\nexport interface MentionableArg {\n id: string;\n type: \"user\" | \"role\";\n}\n\n/** A parsed prefix-command argument: a string, number, boolean or mention. */\nexport type PrefixArgValue = string | number | boolean | MentionableArg;\n\n/** The result of `parsePrefixArgs`: the parsed values, or the argument that failed and why. */\nexport type PrefixArgsResult =\n | { ok: true; values: Record<string, PrefixArgValue | undefined> }\n | { ok: false; arg: string; error: string };\n\nconst SNOWFLAKE = /^\\d{16,20}$/;\nconst TRUE_WORDS = new Set([\n \"true\",\n \"yes\",\n \"y\",\n \"on\",\n \"1\",\n \"enable\",\n \"enabled\",\n]);\nconst FALSE_WORDS = new Set([\n \"false\",\n \"no\",\n \"n\",\n \"off\",\n \"0\",\n \"disable\",\n \"disabled\",\n]);\n\n/**\n * Splits text into arguments on whitespace. \"Double quotes\" or 'single quotes'\n * keep spaces inside one argument; a backslash escapes the next character.\n * @example tokenizeArgs(`ban @user \"being rude\"`) // [\"ban\", \"@user\", \"being rude\"]\n */\nexport function tokenizeArgs(input: string): string[] {\n const args: string[] = [];\n let current = \"\";\n let quote: string | null = null;\n let started = false;\n for (let index = 0; index < input.length; index++) {\n const character = input[index]!;\n if (character === \"\\\\\" && index + 1 < input.length) {\n current += input[++index];\n started = true;\n } else if (quote) {\n if (character === quote) quote = null;\n else current += character;\n } else if (character === '\"' || character === \"'\") {\n // A quote opens a quoted part only at the start of an argument.\n if (started) current += character;\n else {\n quote = character;\n started = true;\n }\n } else if (/\\s/.test(character)) {\n if (started) args.push(current);\n current = \"\";\n started = false;\n } else {\n current += character;\n started = true;\n }\n }\n if (started) args.push(current);\n return args;\n}\n\n/** The user ID in `<@id>`, `<@!id>` or a bare ID; null otherwise. */\nexport function parseUserMention(value: string): string | null {\n const id = /^<@!?(\\d{16,20})>$/.exec(value)?.[1] ?? value;\n return SNOWFLAKE.test(id) ? id : null;\n}\n\n/** The role ID in `<@&id>` or a bare ID; null otherwise. */\nexport function parseRoleMention(value: string): string | null {\n const id = /^<@&(\\d{16,20})>$/.exec(value)?.[1] ?? value;\n return SNOWFLAKE.test(id) ? id : null;\n}\n\n/** The channel ID in `<#id>` or a bare ID; null otherwise. */\nexport function parseChannelMention(value: string): string | null {\n const id = /^<#(\\d{16,20})>$/.exec(value)?.[1] ?? value;\n return SNOWFLAKE.test(id) ? id : null;\n}\n\n/** A user or role mention; a bare ID reads as a user. Null otherwise. */\nexport function parseMentionable(value: string): MentionableArg | null {\n const role = /^<@&(\\d{16,20})>$/.exec(value)?.[1];\n if (role) return { id: role, type: \"role\" };\n const user = parseUserMention(value);\n return user ? { id: user, type: \"user\" } : null;\n}\n\nfunction readOne(\n spec: PrefixArgSpec,\n raw: string,\n): { value: PrefixArgValue } | { error: string } {\n switch (spec.type) {\n case \"string\":\n case \"rest\":\n if (spec.maxLength !== undefined && raw.length > spec.maxLength)\n return {\n error: `must be at most ${spec.maxLength} characters`,\n };\n if (spec.choices) {\n // Matched without regard to case, but the handler gets the\n // choice itself: code that compares it exactly (as its type\n // says it may) must not see \"ALL\" where it expects \"all\".\n const lower = raw.toLowerCase();\n const choice =\n spec.choices.find((c) => String(c) === raw) ??\n spec.choices.find((c) => String(c).toLowerCase() === lower);\n if (choice === undefined)\n return {\n error: `must be one of: ${spec.choices.join(\", \")}`,\n };\n return { value: String(choice) };\n }\n return { value: raw };\n case \"integer\":\n case \"number\": {\n const value = Number(raw);\n if (!Number.isFinite(value) || raw.trim() === \"\")\n return { error: \"must be a number\" };\n if (spec.type === \"integer\" && !Number.isSafeInteger(value))\n return { error: \"must be a whole number\" };\n if (spec.min !== undefined && value < spec.min)\n return { error: `must be at least ${spec.min}` };\n if (spec.max !== undefined && value > spec.max)\n return { error: `must be at most ${spec.max}` };\n if (spec.choices && !spec.choices.includes(value))\n return { error: `must be one of: ${spec.choices.join(\", \")}` };\n return { value };\n }\n case \"boolean\": {\n const word = raw.toLowerCase();\n if (TRUE_WORDS.has(word)) return { value: true };\n if (FALSE_WORDS.has(word)) return { value: false };\n return { error: \"must be yes or no\" };\n }\n case \"user\": {\n const id = parseUserMention(raw);\n return id\n ? { value: id }\n : { error: \"must be a user mention or ID\" };\n }\n case \"role\": {\n const id = parseRoleMention(raw);\n return id\n ? { value: id }\n : { error: \"must be a role mention or ID\" };\n }\n case \"channel\": {\n const id = parseChannelMention(raw);\n return id\n ? { value: id }\n : { error: \"must be a channel mention or ID\" };\n }\n case \"mentionable\": {\n const value = parseMentionable(raw);\n return value\n ? { value }\n : { error: \"must be a user or role mention\" };\n }\n }\n}\n\n/**\n * Reads prefix-command arguments by position, as typed values. IDs come back\n * as strings (user, role, channel); a mentionable says which it was. The first\n * problem is reported, with the argument's name, instead of throwing.\n * @param input The text after the command name, or already-split arguments.\n * @param specs The expected arguments in order; a `rest` argument must be last.\n * @example\n * const result = parsePrefixArgs(`@user 10 spamming links`, [\n * { name: \"user\", type: \"user\", required: true },\n * { name: \"minutes\", type: \"integer\", min: 1, max: 40320 },\n * { name: \"reason\", type: \"rest\" },\n * ]);\n * if (!result.ok) return message.reply(`\\`${result.arg}\\` ${result.error}.`);\n */\nexport function parsePrefixArgs(\n input: string | readonly string[],\n specs: readonly PrefixArgSpec[],\n): PrefixArgsResult {\n const args = typeof input === \"string\" ? tokenizeArgs(input) : [...input];\n const values: Record<string, PrefixArgValue | undefined> =\n Object.create(null);\n let position = 0;\n for (const [index, spec] of specs.entries()) {\n if (spec.type === \"rest\" && index !== specs.length - 1)\n throw new TypeError(\n `The rest argument \"${spec.name}\" must be the last one.`,\n );\n const raw =\n spec.type === \"rest\"\n ? args.slice(position).join(\" \")\n : args[position];\n if (raw === undefined || raw === \"\") {\n if (spec.required)\n return { ok: false, arg: spec.name, error: \"is required\" };\n values[spec.name] = undefined;\n continue;\n }\n const read = readOne(spec, raw);\n if (\"error\" in read)\n return { ok: false, arg: spec.name, error: read.error };\n values[spec.name] = read.value;\n position += spec.type === \"rest\" ? args.length : 1;\n }\n return { ok: true, values };\n}\n\n/** Discord application-command option types, as numbers (this package has no dependencies). */\nconst OPTION_TYPES: Readonly<Record<number, PrefixArgType>> = {\n 3: \"string\",\n 4: \"integer\",\n 5: \"boolean\",\n 6: \"user\",\n 7: \"channel\",\n 8: \"role\",\n 9: \"mentionable\",\n 10: \"number\",\n};\n\n/**\n * Argument specs from a slash command's options, so one definition serves both\n * `/command` and the prefix command. Subcommands and attachments are left out.\n * @param options The command's (or subcommand's) `options` as sent to Discord.\n * @param restLast Read the last string option as the rest of the message (handy for reasons).\n */\nexport function argsFromCommandOptions(\n options: readonly {\n name: string;\n type: number;\n required?: boolean;\n min_value?: number;\n max_value?: number;\n max_length?: number;\n choices?: readonly { value: string | number }[];\n }[],\n restLast = false,\n): PrefixArgSpec[] {\n const specs: PrefixArgSpec[] = [];\n for (const option of options) {\n const type = OPTION_TYPES[option.type];\n if (!type) continue;\n specs.push({\n name: option.name,\n type,\n required: option.required,\n min: option.min_value,\n max: option.max_value,\n maxLength: option.max_length,\n choices: option.choices?.map((choice) => choice.value),\n });\n }\n const last = specs[specs.length - 1];\n if (restLast && last?.type === \"string\") last.type = \"rest\";\n return specs;\n}\n",
|
|
6
|
+
"/** Returns a promise that resolves after the specified duration. */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/** Returns an integer between the supplied inclusive bounds. */\nexport function randomInt(min: number, max: number): number {\n return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n\n/**\n * Tests whether a value looks like a Discord snowflake: 16 to 20 digits. A\n * snowflake is an unsigned 64-bit number, so it never has more than 20 digits;\n * the minimum keeps short numbers in text from being read as IDs. (`Routes`\n * only validates IDs it is given, so it accepts 1 to 20 digits.)\n */\nexport function isSnowflake(value: string): boolean {\n return /^\\d{16,20}$/.test(value);\n}\n\nexport {\n tokenizeArgs,\n parsePrefixArgs,\n argsFromCommandOptions,\n parseUserMention,\n parseRoleMention,\n parseChannelMention,\n parseMentionable,\n type PrefixArgType,\n type PrefixArgSpec,\n type PrefixArgValue,\n type PrefixArgsResult,\n type MentionableArg,\n} from \"./args.js\";\n"
|
|
7
|
+
],
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "AE9CA0445E018E3B64756E2164756E21",
|
|
10
|
+
"names": []
|
|
11
|
+
}
|