bakit 2.0.0-alpha.5 → 2.0.0-alpha.6
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/bin/bakit.js +43 -0
- package/dist/index.d.ts +55 -15
- package/dist/index.js +183 -135
- package/package.json +7 -1
package/bin/bakit.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import { config as useEnv } from "dotenv";
|
|
3
|
+
import { program } from "commander";
|
|
4
|
+
|
|
5
|
+
program.name("bakit");
|
|
6
|
+
|
|
7
|
+
program.command("dev").action(async () => {
|
|
8
|
+
useEnv({
|
|
9
|
+
path: [".env.local", ".env"],
|
|
10
|
+
quiet: true,
|
|
11
|
+
});
|
|
12
|
+
const { default: nodemon } = await import("nodemon");
|
|
13
|
+
|
|
14
|
+
nodemon({
|
|
15
|
+
script: "src/index.ts",
|
|
16
|
+
exec: `${process.execPath} --import tsx`,
|
|
17
|
+
ext: "ts,js",
|
|
18
|
+
watch: ["src"],
|
|
19
|
+
env: {
|
|
20
|
+
...process.env,
|
|
21
|
+
FORCE_COLOR: "1",
|
|
22
|
+
NODE_ENV: "development",
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
nodemon.on("start", () => {
|
|
27
|
+
console.log("Starting bakit app...");
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
nodemon.on("restart", () => {
|
|
31
|
+
console.log("Bakit detected changes! Restarting...");
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
nodemon.on("exit", () => {
|
|
35
|
+
console.log("Proccess exited! Did you start bakit correctly?");
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
nodemon.on("quit", () => {
|
|
39
|
+
process.exit();
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
program.parse();
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import * as discord_js from 'discord.js';
|
|
2
|
-
import { GatewayIntentBits, ClientOptions, ChatInputCommandInteraction, CacheType, Message, User, MessageCreateOptions, InteractionReplyOptions, Awaitable, Collection,
|
|
2
|
+
import { GatewayIntentBits, ClientOptions, ChatInputCommandInteraction, CacheType, Message, User, MessageCreateOptions, InteractionReplyOptions, Awaitable, Collection, Events, IntentsBitField, ClientEvents, Client } from 'discord.js';
|
|
3
3
|
import z$1, { z } from 'zod';
|
|
4
4
|
import { inspect } from 'node:util';
|
|
5
|
+
import * as jiti from 'jiti';
|
|
5
6
|
|
|
6
7
|
declare const ProjectConfigSchema: z.ZodObject<{
|
|
7
8
|
intents: z.ZodDefault<z.ZodUnion<readonly [z.ZodLiteral<"auto">, z.ZodBigInt, z.ZodArray<z.ZodEnum<typeof GatewayIntentBits>>]>>;
|
|
@@ -102,20 +103,48 @@ declare const BaseParamSchema: z.ZodObject<{
|
|
|
102
103
|
description: z.ZodOptional<z.ZodString>;
|
|
103
104
|
required: z.ZodDefault<z.ZodBoolean>;
|
|
104
105
|
}, z.core.$strip>;
|
|
105
|
-
declare const StringParamSchema: z.ZodObject<{
|
|
106
|
+
declare const StringParamSchema: z.ZodPipe<z.ZodObject<{
|
|
106
107
|
name: z.ZodString;
|
|
107
108
|
description: z.ZodOptional<z.ZodString>;
|
|
108
109
|
required: z.ZodDefault<z.ZodBoolean>;
|
|
109
110
|
maxLength: z.ZodOptional<z.ZodNumber>;
|
|
110
111
|
minLength: z.ZodOptional<z.ZodNumber>;
|
|
111
|
-
}, z.core.$strip
|
|
112
|
-
|
|
112
|
+
}, z.core.$strip>, z.ZodTransform<{
|
|
113
|
+
name: string;
|
|
114
|
+
required: boolean;
|
|
115
|
+
description?: string | undefined;
|
|
116
|
+
maxLength?: number | undefined;
|
|
117
|
+
minLength?: number | undefined;
|
|
118
|
+
} & {
|
|
119
|
+
description: string;
|
|
120
|
+
}, {
|
|
121
|
+
name: string;
|
|
122
|
+
required: boolean;
|
|
123
|
+
description?: string | undefined;
|
|
124
|
+
maxLength?: number | undefined;
|
|
125
|
+
minLength?: number | undefined;
|
|
126
|
+
}>>;
|
|
127
|
+
declare const NumberParamSchema: z.ZodPipe<z.ZodObject<{
|
|
113
128
|
name: z.ZodString;
|
|
114
129
|
description: z.ZodOptional<z.ZodString>;
|
|
115
130
|
required: z.ZodDefault<z.ZodBoolean>;
|
|
116
131
|
maxValue: z.ZodOptional<z.ZodNumber>;
|
|
117
132
|
minValue: z.ZodOptional<z.ZodNumber>;
|
|
118
|
-
}, z.core.$strip
|
|
133
|
+
}, z.core.$strip>, z.ZodTransform<{
|
|
134
|
+
name: string;
|
|
135
|
+
required: boolean;
|
|
136
|
+
description?: string | undefined;
|
|
137
|
+
maxValue?: number | undefined;
|
|
138
|
+
minValue?: number | undefined;
|
|
139
|
+
} & {
|
|
140
|
+
description: string;
|
|
141
|
+
}, {
|
|
142
|
+
name: string;
|
|
143
|
+
required: boolean;
|
|
144
|
+
description?: string | undefined;
|
|
145
|
+
maxValue?: number | undefined;
|
|
146
|
+
minValue?: number | undefined;
|
|
147
|
+
}>>;
|
|
119
148
|
type BaseParamOptions = z.input<typeof BaseParamSchema>;
|
|
120
149
|
type StringOptions = z.input<typeof StringParamSchema>;
|
|
121
150
|
type NumberOptions = z.input<typeof NumberParamSchema>;
|
|
@@ -192,10 +221,12 @@ type InferParamTuple<T extends readonly BaseParam<any, any, any>[]> = {
|
|
|
192
221
|
[K in keyof T]: T[K] extends AnyParam<any> ? InferParamValue<T[K]> : never;
|
|
193
222
|
};
|
|
194
223
|
|
|
224
|
+
declare function validateParamsOrder(params: readonly AnyParam<boolean>[]): boolean;
|
|
195
225
|
declare const CommandOptionsSchema: z.ZodPipe<z.ZodObject<{
|
|
196
|
-
name: z.ZodString
|
|
197
|
-
description: z.ZodOptional<z.ZodString
|
|
198
|
-
|
|
226
|
+
name: z.ZodReadonly<z.ZodString>;
|
|
227
|
+
description: z.ZodReadonly<z.ZodOptional<z.ZodString>>;
|
|
228
|
+
nsfw: z.ZodReadonly<z.ZodDefault<z.ZodBoolean>>;
|
|
229
|
+
params: z.ZodReadonly<z.ZodDefault<z.ZodArray<z.ZodCustom<BaseParam<{
|
|
199
230
|
name: string;
|
|
200
231
|
description?: string | undefined;
|
|
201
232
|
required?: boolean | undefined;
|
|
@@ -203,12 +234,13 @@ declare const CommandOptionsSchema: z.ZodPipe<z.ZodObject<{
|
|
|
203
234
|
name: string;
|
|
204
235
|
description?: string | undefined;
|
|
205
236
|
required?: boolean | undefined;
|
|
206
|
-
}, unknown, boolean
|
|
207
|
-
quotes: z.ZodDefault<z.ZodBoolean
|
|
237
|
+
}, unknown, boolean>>>>>;
|
|
238
|
+
quotes: z.ZodReadonly<z.ZodDefault<z.ZodBoolean>>;
|
|
208
239
|
}, z.core.$strip>, z.ZodTransform<{
|
|
209
240
|
description: string;
|
|
210
241
|
name: string;
|
|
211
|
-
|
|
242
|
+
nsfw: boolean;
|
|
243
|
+
params: readonly BaseParam<{
|
|
212
244
|
name: string;
|
|
213
245
|
description?: string | undefined;
|
|
214
246
|
required?: boolean | undefined;
|
|
@@ -216,7 +248,8 @@ declare const CommandOptionsSchema: z.ZodPipe<z.ZodObject<{
|
|
|
216
248
|
quotes: boolean;
|
|
217
249
|
}, {
|
|
218
250
|
name: string;
|
|
219
|
-
|
|
251
|
+
nsfw: boolean;
|
|
252
|
+
params: readonly BaseParam<{
|
|
220
253
|
name: string;
|
|
221
254
|
description?: string | undefined;
|
|
222
255
|
required?: boolean | undefined;
|
|
@@ -237,6 +270,9 @@ declare class Command<ParamsList extends readonly AnyParam<any>[] = any[]> exten
|
|
|
237
270
|
params?: ParamsList;
|
|
238
271
|
}) | string);
|
|
239
272
|
private handleSyntaxError;
|
|
273
|
+
toSlashCommandJSON(): discord_js.RESTPostAPIChatInputApplicationCommandsJSONBody;
|
|
274
|
+
private initSlashCommandOptions;
|
|
275
|
+
private initSlashCommandOption;
|
|
240
276
|
}
|
|
241
277
|
/**
|
|
242
278
|
* Define command entry, usually for modules.
|
|
@@ -282,8 +318,10 @@ declare const ListenerOptionsSchema: z$1.ZodObject<{
|
|
|
282
318
|
type ListenerOptions<K extends EventKey = EventKey> = Omit<z$1.input<typeof ListenerOptionsSchema>, "name"> & {
|
|
283
319
|
name: K;
|
|
284
320
|
};
|
|
285
|
-
type EventKey = keyof
|
|
286
|
-
declare class Listener<K extends EventKey = EventKey> extends LifecycleManager<Context, [
|
|
321
|
+
type EventKey = keyof BakitClientEvents;
|
|
322
|
+
declare class Listener<K extends EventKey = EventKey> extends LifecycleManager<Context, [
|
|
323
|
+
...args: BakitClientEvents[K]
|
|
324
|
+
]> {
|
|
287
325
|
options: ListenerOptions<K>;
|
|
288
326
|
constructor(options: K | ListenerOptions<K>);
|
|
289
327
|
}
|
|
@@ -339,6 +377,8 @@ declare const EVENT_INTENT_MAPPING: Record<string, number[]>;
|
|
|
339
377
|
|
|
340
378
|
declare function tokenize(content: string): string[];
|
|
341
379
|
|
|
380
|
+
declare const $jiti: jiti.Jiti;
|
|
381
|
+
|
|
342
382
|
declare class BakitError extends Error {
|
|
343
383
|
constructor(message: string);
|
|
344
384
|
}
|
|
@@ -366,4 +406,4 @@ declare const Params: {
|
|
|
366
406
|
}) => NumberParam<Required>;
|
|
367
407
|
};
|
|
368
408
|
|
|
369
|
-
export { type AnyParam, ArgumentError, BakitClient, type BakitClientEvents, BakitError, BaseClientManager, BaseCommandContext, BaseParam, type BaseParamOptions, BaseParamSchema, ChatInputContext, type ChatInputContextSendOptions, Command, type CommandContext, CommandManager, type CommandOptions, type CommandOptionsInput, CommandOptionsSchema, Context, type ContextSendOptions, EVENT_INTENT_MAPPING, type ErrorHookCallback, type GetPrefixFunction, HookOrder, HookState, type InferParamTuple, type InferParamValue, Instance, LifecycleManager, Listener, ListenerManager, type ListenerOptions, ListenerOptionsSchema, type MainHookCallback, MessageContext, type MessageContextSendOptions, type NumberOptions, NumberParam, NumberParamSchema, type ParamResolvedOutputType, ParamUserType, Params, type ProjectConfig, type ProjectConfigInput, ProjectConfigSchema, type StringOptions, StringParam, StringParamSchema, defineCommand, defineConfig, defineListener, getConfig, loadConfig, tokenize, useApp };
|
|
409
|
+
export { $jiti, type AnyParam, ArgumentError, BakitClient, type BakitClientEvents, BakitError, BaseClientManager, BaseCommandContext, BaseParam, type BaseParamOptions, BaseParamSchema, ChatInputContext, type ChatInputContextSendOptions, Command, type CommandContext, CommandManager, type CommandOptions, type CommandOptionsInput, CommandOptionsSchema, Context, type ContextSendOptions, EVENT_INTENT_MAPPING, type ErrorHookCallback, type GetPrefixFunction, HookOrder, HookState, type InferParamTuple, type InferParamValue, Instance, LifecycleManager, Listener, ListenerManager, type ListenerOptions, ListenerOptionsSchema, type MainHookCallback, MessageContext, type MessageContextSendOptions, type NumberOptions, NumberParam, NumberParamSchema, type ParamResolvedOutputType, ParamUserType, Params, type ProjectConfig, type ProjectConfigInput, ProjectConfigSchema, type StringOptions, StringParam, StringParamSchema, defineCommand, defineConfig, defineListener, getConfig, loadConfig, tokenize, useApp, validateParamsOrder };
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,131 @@
|
|
|
1
|
-
import '
|
|
2
|
-
import { GatewayIntentBits, Events, Client, IntentsBitField, Collection, ChatInputCommandInteraction, Message } from 'discord.js';
|
|
1
|
+
import { GatewayIntentBits, Events, Client, IntentsBitField, Collection, SlashCommandBuilder, SlashCommandStringOption, SlashCommandNumberOption, ChatInputCommandInteraction, Message } from 'discord.js';
|
|
3
2
|
import z3, { z } from 'zod';
|
|
4
|
-
import { pathToFileURL } from 'url';
|
|
5
3
|
import glob from 'tiny-glob';
|
|
4
|
+
import { createJiti } from 'jiti';
|
|
6
5
|
import { inspect } from 'util';
|
|
7
6
|
import { posix } from 'path';
|
|
8
7
|
|
|
9
|
-
// src/
|
|
8
|
+
// src/config.ts
|
|
9
|
+
var INTENT_GROUPS = {
|
|
10
|
+
[GatewayIntentBits.Guilds]: [
|
|
11
|
+
Events.GuildCreate,
|
|
12
|
+
Events.GuildDelete,
|
|
13
|
+
Events.GuildUpdate,
|
|
14
|
+
Events.GuildUnavailable,
|
|
15
|
+
Events.GuildRoleCreate,
|
|
16
|
+
Events.GuildRoleDelete,
|
|
17
|
+
Events.GuildRoleUpdate,
|
|
18
|
+
Events.ChannelCreate,
|
|
19
|
+
Events.ChannelDelete,
|
|
20
|
+
Events.ChannelUpdate,
|
|
21
|
+
Events.ChannelPinsUpdate,
|
|
22
|
+
Events.ThreadCreate,
|
|
23
|
+
Events.ThreadDelete,
|
|
24
|
+
Events.ThreadUpdate,
|
|
25
|
+
Events.ThreadListSync,
|
|
26
|
+
Events.ThreadMemberUpdate,
|
|
27
|
+
Events.ThreadMembersUpdate,
|
|
28
|
+
Events.StageInstanceCreate,
|
|
29
|
+
Events.StageInstanceUpdate,
|
|
30
|
+
Events.StageInstanceDelete
|
|
31
|
+
],
|
|
32
|
+
[GatewayIntentBits.GuildMembers]: [
|
|
33
|
+
Events.GuildMemberAdd,
|
|
34
|
+
Events.GuildMemberUpdate,
|
|
35
|
+
Events.GuildMemberRemove,
|
|
36
|
+
Events.ThreadMembersUpdate
|
|
37
|
+
],
|
|
38
|
+
[GatewayIntentBits.GuildModeration]: [Events.GuildAuditLogEntryCreate, Events.GuildBanAdd, Events.GuildBanRemove],
|
|
39
|
+
[GatewayIntentBits.GuildExpressions]: [
|
|
40
|
+
Events.GuildEmojiCreate,
|
|
41
|
+
Events.GuildEmojiDelete,
|
|
42
|
+
Events.GuildEmojiUpdate,
|
|
43
|
+
Events.GuildStickerCreate,
|
|
44
|
+
Events.GuildStickerDelete,
|
|
45
|
+
Events.GuildStickerUpdate,
|
|
46
|
+
Events.GuildSoundboardSoundCreate,
|
|
47
|
+
Events.GuildSoundboardSoundUpdate,
|
|
48
|
+
Events.GuildSoundboardSoundDelete,
|
|
49
|
+
Events.GuildSoundboardSoundsUpdate
|
|
50
|
+
],
|
|
51
|
+
[GatewayIntentBits.GuildIntegrations]: [Events.GuildIntegrationsUpdate],
|
|
52
|
+
[GatewayIntentBits.GuildWebhooks]: [Events.WebhooksUpdate],
|
|
53
|
+
[GatewayIntentBits.GuildInvites]: [Events.InviteCreate, Events.InviteDelete],
|
|
54
|
+
[GatewayIntentBits.GuildVoiceStates]: [Events.VoiceStateUpdate],
|
|
55
|
+
[GatewayIntentBits.GuildPresences]: [Events.PresenceUpdate],
|
|
56
|
+
[GatewayIntentBits.GuildMessages]: [
|
|
57
|
+
Events.MessageCreate,
|
|
58
|
+
Events.MessageUpdate,
|
|
59
|
+
Events.MessageDelete,
|
|
60
|
+
Events.MessageBulkDelete
|
|
61
|
+
],
|
|
62
|
+
[GatewayIntentBits.GuildMessageReactions]: [
|
|
63
|
+
Events.MessageReactionAdd,
|
|
64
|
+
Events.MessageReactionRemove,
|
|
65
|
+
Events.MessageReactionRemoveAll,
|
|
66
|
+
Events.MessageReactionRemoveEmoji
|
|
67
|
+
],
|
|
68
|
+
[GatewayIntentBits.GuildMessageTyping]: [Events.TypingStart],
|
|
69
|
+
[GatewayIntentBits.DirectMessages]: [
|
|
70
|
+
Events.MessageCreate,
|
|
71
|
+
Events.MessageUpdate,
|
|
72
|
+
Events.MessageDelete,
|
|
73
|
+
Events.ChannelPinsUpdate
|
|
74
|
+
],
|
|
75
|
+
[GatewayIntentBits.DirectMessageReactions]: [
|
|
76
|
+
Events.MessageReactionAdd,
|
|
77
|
+
Events.MessageReactionRemove,
|
|
78
|
+
Events.MessageReactionRemoveAll,
|
|
79
|
+
Events.MessageReactionRemoveEmoji
|
|
80
|
+
],
|
|
81
|
+
[GatewayIntentBits.DirectMessageTyping]: [Events.TypingStart],
|
|
82
|
+
[GatewayIntentBits.MessageContent]: [Events.MessageCreate, Events.MessageUpdate],
|
|
83
|
+
[GatewayIntentBits.GuildScheduledEvents]: [
|
|
84
|
+
Events.GuildScheduledEventCreate,
|
|
85
|
+
Events.GuildScheduledEventDelete,
|
|
86
|
+
Events.GuildScheduledEventUpdate,
|
|
87
|
+
Events.GuildScheduledEventUserAdd,
|
|
88
|
+
Events.GuildScheduledEventUserRemove
|
|
89
|
+
],
|
|
90
|
+
[GatewayIntentBits.AutoModerationConfiguration]: [
|
|
91
|
+
Events.AutoModerationRuleCreate,
|
|
92
|
+
Events.AutoModerationRuleDelete,
|
|
93
|
+
Events.AutoModerationRuleUpdate
|
|
94
|
+
],
|
|
95
|
+
[GatewayIntentBits.AutoModerationExecution]: [Events.AutoModerationActionExecution],
|
|
96
|
+
[GatewayIntentBits.GuildMessagePolls]: [Events.MessagePollVoteAdd, Events.MessagePollVoteRemove],
|
|
97
|
+
[GatewayIntentBits.DirectMessagePolls]: [Events.MessagePollVoteAdd, Events.MessagePollVoteRemove]
|
|
98
|
+
}, EVENT_INTENT_MAPPING = {};
|
|
99
|
+
for (let [intentStr, events] of Object.entries(INTENT_GROUPS)) {
|
|
100
|
+
let intent = Number(intentStr);
|
|
101
|
+
for (let event of events)
|
|
102
|
+
EVENT_INTENT_MAPPING[event] ??= [], EVENT_INTENT_MAPPING[event].includes(intent) || EVENT_INTENT_MAPPING[event].push(intent);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// src/utils/string.ts
|
|
106
|
+
function tokenize(content) {
|
|
107
|
+
let args = [], current = "", quoteChar = null, isEscaped = false;
|
|
108
|
+
for (let i = 0; i < content.length; i++) {
|
|
109
|
+
let char = content[i];
|
|
110
|
+
if (char === void 0)
|
|
111
|
+
break;
|
|
112
|
+
if (isEscaped) {
|
|
113
|
+
current += char, isEscaped = false;
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
if (char === "\\") {
|
|
117
|
+
isEscaped = true;
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
quoteChar ? char === quoteChar ? quoteChar = null : current += char : char === '"' ? quoteChar = char : /\s/.test(char) ? current.length > 0 && (args.push(current), current = "") : current += char;
|
|
121
|
+
}
|
|
122
|
+
return current.length > 0 && args.push(current), args;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// src/utils/index.ts
|
|
126
|
+
var $jiti = createJiti(import.meta.url);
|
|
127
|
+
|
|
128
|
+
// src/config.ts
|
|
10
129
|
var ProjectConfigSchema = z.object({
|
|
11
130
|
/**
|
|
12
131
|
* The gateway intents to use for the Discord client.
|
|
@@ -50,7 +169,7 @@ async function loadConfig(cwd = process.cwd()) {
|
|
|
50
169
|
if (!configPath)
|
|
51
170
|
throw new Error("Missing config file");
|
|
52
171
|
other && console.warn(`Multiple config files found in ${cwd}. Using ${configPath}.`);
|
|
53
|
-
let
|
|
172
|
+
let config = await $jiti.import(configPath, { default: true });
|
|
54
173
|
return _config = Object.freeze(await ProjectConfigSchema.parseAsync(config)), _config;
|
|
55
174
|
}
|
|
56
175
|
function getConfig() {
|
|
@@ -330,17 +449,29 @@ var BaseParam = class {
|
|
|
330
449
|
return this.setOption("maxValue", value);
|
|
331
450
|
}
|
|
332
451
|
};
|
|
333
|
-
|
|
334
|
-
|
|
452
|
+
function validateParamsOrder(params) {
|
|
453
|
+
let seenOptional = false;
|
|
454
|
+
for (let param of params)
|
|
455
|
+
if (param.options.required) {
|
|
456
|
+
if (seenOptional)
|
|
457
|
+
return false;
|
|
458
|
+
} else
|
|
459
|
+
seenOptional = true;
|
|
460
|
+
return true;
|
|
461
|
+
}
|
|
335
462
|
var CommandOptionsSchema = z.object({
|
|
336
|
-
name: z.string(),
|
|
337
|
-
description: z.string().min(1).max(100).optional(),
|
|
338
|
-
|
|
339
|
-
|
|
463
|
+
name: z.string().readonly(),
|
|
464
|
+
description: z.string().min(1).max(100).optional().readonly(),
|
|
465
|
+
nsfw: z.boolean().default(false).readonly(),
|
|
466
|
+
params: z.array(z.instanceof(BaseParam)).default([]).readonly(),
|
|
467
|
+
quotes: z.boolean().default(true).readonly()
|
|
340
468
|
}).transform((data) => ({
|
|
341
469
|
...data,
|
|
342
470
|
description: data.description ?? `Command ${data.name}`
|
|
343
|
-
}))
|
|
471
|
+
})).refine(({ params }) => validateParamsOrder(params), {
|
|
472
|
+
path: ["params"],
|
|
473
|
+
error: "Required params must be placed before optional params"
|
|
474
|
+
}), Command = class extends LifecycleManager {
|
|
344
475
|
constructor(options) {
|
|
345
476
|
let _options = CommandOptionsSchema.parse(typeof options == "string" ? { name: options } : options);
|
|
346
477
|
super(`command:${_options.name}`), this.options = _options, this.setHook("syntaxError", "ERROR" /* Error */, async (ctx, error, ...args) => {
|
|
@@ -350,6 +481,30 @@ var CommandOptionsSchema = z.object({
|
|
|
350
481
|
async handleSyntaxError(context, error, _args) {
|
|
351
482
|
error instanceof BakitError && await context.send(error.message);
|
|
352
483
|
}
|
|
484
|
+
toSlashCommandJSON() {
|
|
485
|
+
let { name, description, nsfw, params } = this.options, builder = new SlashCommandBuilder().setName(name).setDescription(description).setNSFW(nsfw);
|
|
486
|
+
return this.initSlashCommandOptions(builder, params), builder.toJSON();
|
|
487
|
+
}
|
|
488
|
+
initSlashCommandOptions(builder, params) {
|
|
489
|
+
for (let param of params)
|
|
490
|
+
this.initSlashCommandOption(builder, param);
|
|
491
|
+
}
|
|
492
|
+
initSlashCommandOption(builder, param) {
|
|
493
|
+
let initOption = (builder2) => {
|
|
494
|
+
let { name, description, required } = param.options;
|
|
495
|
+
return builder2.setName(name).setDescription(description).setRequired(required);
|
|
496
|
+
};
|
|
497
|
+
if (param instanceof StringParam) {
|
|
498
|
+
let { maxLength, minLength } = param.options, option = initOption(new SlashCommandStringOption());
|
|
499
|
+
maxLength && option.setMaxLength(maxLength), minLength && option.setMinLength(minLength), builder.addStringOption(option);
|
|
500
|
+
return;
|
|
501
|
+
}
|
|
502
|
+
if (param instanceof NumberParam) {
|
|
503
|
+
let { maxValue, minValue } = param.options, option = initOption(new SlashCommandNumberOption());
|
|
504
|
+
maxValue && option.setMaxValue(maxValue), minValue && option.setMinValue(minValue), builder.addNumberOption(option);
|
|
505
|
+
return;
|
|
506
|
+
}
|
|
507
|
+
}
|
|
353
508
|
};
|
|
354
509
|
function defineCommand(options) {
|
|
355
510
|
return new Command(options);
|
|
@@ -370,7 +525,7 @@ var CommandManager = class extends BaseClientManager {
|
|
|
370
525
|
cwd: process.cwd()
|
|
371
526
|
})).map(async (file) => {
|
|
372
527
|
try {
|
|
373
|
-
let
|
|
528
|
+
let command = await $jiti.import(file, { default: !0 });
|
|
374
529
|
if (!command) {
|
|
375
530
|
console.warn(`[Loader] File has no default export: ${file}`);
|
|
376
531
|
return;
|
|
@@ -418,103 +573,6 @@ var ListenerOptionsSchema = z3.object({
|
|
|
418
573
|
function defineListener(options) {
|
|
419
574
|
return new Listener(options);
|
|
420
575
|
}
|
|
421
|
-
var INTENT_GROUPS = {
|
|
422
|
-
[GatewayIntentBits.Guilds]: [
|
|
423
|
-
Events.GuildCreate,
|
|
424
|
-
Events.GuildDelete,
|
|
425
|
-
Events.GuildUpdate,
|
|
426
|
-
Events.GuildUnavailable,
|
|
427
|
-
Events.GuildRoleCreate,
|
|
428
|
-
Events.GuildRoleDelete,
|
|
429
|
-
Events.GuildRoleUpdate,
|
|
430
|
-
Events.ChannelCreate,
|
|
431
|
-
Events.ChannelDelete,
|
|
432
|
-
Events.ChannelUpdate,
|
|
433
|
-
Events.ChannelPinsUpdate,
|
|
434
|
-
Events.ThreadCreate,
|
|
435
|
-
Events.ThreadDelete,
|
|
436
|
-
Events.ThreadUpdate,
|
|
437
|
-
Events.ThreadListSync,
|
|
438
|
-
Events.ThreadMemberUpdate,
|
|
439
|
-
Events.ThreadMembersUpdate,
|
|
440
|
-
Events.StageInstanceCreate,
|
|
441
|
-
Events.StageInstanceUpdate,
|
|
442
|
-
Events.StageInstanceDelete
|
|
443
|
-
],
|
|
444
|
-
[GatewayIntentBits.GuildMembers]: [
|
|
445
|
-
Events.GuildMemberAdd,
|
|
446
|
-
Events.GuildMemberUpdate,
|
|
447
|
-
Events.GuildMemberRemove,
|
|
448
|
-
Events.ThreadMembersUpdate
|
|
449
|
-
],
|
|
450
|
-
[GatewayIntentBits.GuildModeration]: [Events.GuildAuditLogEntryCreate, Events.GuildBanAdd, Events.GuildBanRemove],
|
|
451
|
-
[GatewayIntentBits.GuildExpressions]: [
|
|
452
|
-
Events.GuildEmojiCreate,
|
|
453
|
-
Events.GuildEmojiDelete,
|
|
454
|
-
Events.GuildEmojiUpdate,
|
|
455
|
-
Events.GuildStickerCreate,
|
|
456
|
-
Events.GuildStickerDelete,
|
|
457
|
-
Events.GuildStickerUpdate,
|
|
458
|
-
Events.GuildSoundboardSoundCreate,
|
|
459
|
-
Events.GuildSoundboardSoundUpdate,
|
|
460
|
-
Events.GuildSoundboardSoundDelete,
|
|
461
|
-
Events.GuildSoundboardSoundsUpdate
|
|
462
|
-
],
|
|
463
|
-
[GatewayIntentBits.GuildIntegrations]: [Events.GuildIntegrationsUpdate],
|
|
464
|
-
[GatewayIntentBits.GuildWebhooks]: [Events.WebhooksUpdate],
|
|
465
|
-
[GatewayIntentBits.GuildInvites]: [Events.InviteCreate, Events.InviteDelete],
|
|
466
|
-
[GatewayIntentBits.GuildVoiceStates]: [Events.VoiceStateUpdate],
|
|
467
|
-
[GatewayIntentBits.GuildPresences]: [Events.PresenceUpdate],
|
|
468
|
-
[GatewayIntentBits.GuildMessages]: [
|
|
469
|
-
Events.MessageCreate,
|
|
470
|
-
Events.MessageUpdate,
|
|
471
|
-
Events.MessageDelete,
|
|
472
|
-
Events.MessageBulkDelete
|
|
473
|
-
],
|
|
474
|
-
[GatewayIntentBits.GuildMessageReactions]: [
|
|
475
|
-
Events.MessageReactionAdd,
|
|
476
|
-
Events.MessageReactionRemove,
|
|
477
|
-
Events.MessageReactionRemoveAll,
|
|
478
|
-
Events.MessageReactionRemoveEmoji
|
|
479
|
-
],
|
|
480
|
-
[GatewayIntentBits.GuildMessageTyping]: [Events.TypingStart],
|
|
481
|
-
[GatewayIntentBits.DirectMessages]: [
|
|
482
|
-
Events.MessageCreate,
|
|
483
|
-
Events.MessageUpdate,
|
|
484
|
-
Events.MessageDelete,
|
|
485
|
-
Events.ChannelPinsUpdate
|
|
486
|
-
],
|
|
487
|
-
[GatewayIntentBits.DirectMessageReactions]: [
|
|
488
|
-
Events.MessageReactionAdd,
|
|
489
|
-
Events.MessageReactionRemove,
|
|
490
|
-
Events.MessageReactionRemoveAll,
|
|
491
|
-
Events.MessageReactionRemoveEmoji
|
|
492
|
-
],
|
|
493
|
-
[GatewayIntentBits.DirectMessageTyping]: [Events.TypingStart],
|
|
494
|
-
[GatewayIntentBits.MessageContent]: [Events.MessageCreate, Events.MessageUpdate],
|
|
495
|
-
[GatewayIntentBits.GuildScheduledEvents]: [
|
|
496
|
-
Events.GuildScheduledEventCreate,
|
|
497
|
-
Events.GuildScheduledEventDelete,
|
|
498
|
-
Events.GuildScheduledEventUpdate,
|
|
499
|
-
Events.GuildScheduledEventUserAdd,
|
|
500
|
-
Events.GuildScheduledEventUserRemove
|
|
501
|
-
],
|
|
502
|
-
[GatewayIntentBits.AutoModerationConfiguration]: [
|
|
503
|
-
Events.AutoModerationRuleCreate,
|
|
504
|
-
Events.AutoModerationRuleDelete,
|
|
505
|
-
Events.AutoModerationRuleUpdate
|
|
506
|
-
],
|
|
507
|
-
[GatewayIntentBits.AutoModerationExecution]: [Events.AutoModerationActionExecution],
|
|
508
|
-
[GatewayIntentBits.GuildMessagePolls]: [Events.MessagePollVoteAdd, Events.MessagePollVoteRemove],
|
|
509
|
-
[GatewayIntentBits.DirectMessagePolls]: [Events.MessagePollVoteAdd, Events.MessagePollVoteRemove]
|
|
510
|
-
}, EVENT_INTENT_MAPPING = {};
|
|
511
|
-
for (let [intentStr, events] of Object.entries(INTENT_GROUPS)) {
|
|
512
|
-
let intent = Number(intentStr);
|
|
513
|
-
for (let event of events)
|
|
514
|
-
EVENT_INTENT_MAPPING[event] ??= [], EVENT_INTENT_MAPPING[event].includes(intent) || EVENT_INTENT_MAPPING[event].push(intent);
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
// src/listener/ListenerManager.ts
|
|
518
576
|
var ListenerManager = class extends BaseClientManager {
|
|
519
577
|
listeners = [];
|
|
520
578
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -524,7 +582,7 @@ var ListenerManager = class extends BaseClientManager {
|
|
|
524
582
|
cwd: process.cwd()
|
|
525
583
|
})).map(async (file) => {
|
|
526
584
|
try {
|
|
527
|
-
let
|
|
585
|
+
let listener = await $jiti.import(file, { default: !0 });
|
|
528
586
|
if (!listener) {
|
|
529
587
|
console.warn(`[Loader] File has no default export: ${file}`);
|
|
530
588
|
return;
|
|
@@ -614,37 +672,20 @@ var BakitClient3 = class extends Client {
|
|
|
614
672
|
return `${this.constructor.name} {}`;
|
|
615
673
|
}
|
|
616
674
|
};
|
|
617
|
-
|
|
618
|
-
// src/utils/string.ts
|
|
619
|
-
function tokenize(content) {
|
|
620
|
-
let args = [], current = "", quoteChar = null, isEscaped = false;
|
|
621
|
-
for (let i = 0; i < content.length; i++) {
|
|
622
|
-
let char = content[i];
|
|
623
|
-
if (char === void 0)
|
|
624
|
-
break;
|
|
625
|
-
if (isEscaped) {
|
|
626
|
-
current += char, isEscaped = false;
|
|
627
|
-
continue;
|
|
628
|
-
}
|
|
629
|
-
if (char === "\\") {
|
|
630
|
-
isEscaped = true;
|
|
631
|
-
continue;
|
|
632
|
-
}
|
|
633
|
-
quoteChar ? char === quoteChar ? quoteChar = null : current += char : char === '"' ? quoteChar = char : /\s/.test(char) ? current.length > 0 && (args.push(current), current = "") : current += char;
|
|
634
|
-
}
|
|
635
|
-
return current.length > 0 && args.push(current), args;
|
|
636
|
-
}
|
|
637
675
|
var ParamUserType = /* @__PURE__ */ ((ParamUserType2) => (ParamUserType2.Bot = "bot", ParamUserType2.Normal = "normal", ParamUserType2.Any = "any", ParamUserType2))(ParamUserType || {}), BaseParamSchema = z.object({
|
|
638
676
|
name: z.string(),
|
|
639
677
|
description: z.string().optional(),
|
|
640
678
|
required: z.boolean().default(true)
|
|
679
|
+
}), withDefaultDescription = (data) => ({
|
|
680
|
+
...data,
|
|
681
|
+
description: data.description ?? `${data.name}`
|
|
641
682
|
}), StringParamSchema = BaseParamSchema.extend({
|
|
642
683
|
maxLength: z.number().min(1).optional(),
|
|
643
684
|
minLength: z.number().min(1).optional()
|
|
644
|
-
}), NumberParamSchema = BaseParamSchema.extend({
|
|
685
|
+
}).transform(withDefaultDescription), NumberParamSchema = BaseParamSchema.extend({
|
|
645
686
|
maxValue: z.number().optional(),
|
|
646
687
|
minValue: z.number().optional()
|
|
647
|
-
});
|
|
688
|
+
}).transform(withDefaultDescription);
|
|
648
689
|
|
|
649
690
|
// src/command/param/Params.ts
|
|
650
691
|
function createFactory(ctor) {
|
|
@@ -656,7 +697,14 @@ var Params = {
|
|
|
656
697
|
};
|
|
657
698
|
|
|
658
699
|
// src/defaults/command.ts
|
|
659
|
-
var messageCommandHandler = defineListener(Events.MessageCreate), chatInputCommandHandler = defineListener(Events.InteractionCreate)
|
|
700
|
+
var messageCommandHandler = defineListener(Events.MessageCreate), chatInputCommandHandler = defineListener(Events.InteractionCreate), registerCommandsHandler = defineListener({
|
|
701
|
+
name: Events.ClientReady,
|
|
702
|
+
once: true
|
|
703
|
+
});
|
|
704
|
+
registerCommandsHandler.main(async (_, client) => {
|
|
705
|
+
let { commands } = client.managers, data = commands.commands.map((cmd) => cmd.toSlashCommandJSON()), result = await client.application.commands.set(data);
|
|
706
|
+
console.log(`Registered ${result.size} application command(s)`);
|
|
707
|
+
});
|
|
660
708
|
messageCommandHandler.main(async (_, message) => {
|
|
661
709
|
let config = getConfig();
|
|
662
710
|
if (message.author.bot)
|
|
@@ -717,4 +765,4 @@ function useApp() {
|
|
|
717
765
|
return new Instance();
|
|
718
766
|
}
|
|
719
767
|
|
|
720
|
-
export { ArgumentError, BakitClient3 as BakitClient, BakitError, BaseClientManager, BaseCommandContext, BaseParam, BaseParamSchema, ChatInputContext, Command, CommandManager, CommandOptionsSchema, Context, EVENT_INTENT_MAPPING, HookOrder, HookState, Instance, LifecycleManager, Listener, ListenerManager, ListenerOptionsSchema, MessageContext, NumberParam, NumberParamSchema, ParamUserType, Params, ProjectConfigSchema, StringParam, StringParamSchema, defineCommand, defineConfig, defineListener, getConfig, loadConfig, tokenize, useApp };
|
|
768
|
+
export { $jiti, ArgumentError, BakitClient3 as BakitClient, BakitError, BaseClientManager, BaseCommandContext, BaseParam, BaseParamSchema, ChatInputContext, Command, CommandManager, CommandOptionsSchema, Context, EVENT_INTENT_MAPPING, HookOrder, HookState, Instance, LifecycleManager, Listener, ListenerManager, ListenerOptionsSchema, MessageContext, NumberParam, NumberParamSchema, ParamUserType, Params, ProjectConfigSchema, StringParam, StringParamSchema, defineCommand, defineConfig, defineListener, getConfig, loadConfig, tokenize, useApp, validateParamsOrder };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bakit",
|
|
3
|
-
"version": "2.0.0-alpha.
|
|
3
|
+
"version": "2.0.0-alpha.6",
|
|
4
4
|
"description": "A framework for discord.js",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -10,6 +10,9 @@
|
|
|
10
10
|
"type-check": "tsc --noEmit",
|
|
11
11
|
"test": "vitest run --pass-with-no-tests"
|
|
12
12
|
},
|
|
13
|
+
"bin": {
|
|
14
|
+
"bakit": "./bin/bakit.js"
|
|
15
|
+
},
|
|
13
16
|
"files": [
|
|
14
17
|
"dist"
|
|
15
18
|
],
|
|
@@ -34,7 +37,10 @@
|
|
|
34
37
|
"discord.js": "^14.0.0"
|
|
35
38
|
},
|
|
36
39
|
"dependencies": {
|
|
40
|
+
"commander": "^14.0.2",
|
|
37
41
|
"dotenv": "^17.2.1",
|
|
42
|
+
"jiti": "^2.6.1",
|
|
43
|
+
"nodemon": "^3.1.11",
|
|
38
44
|
"tiny-glob": "^0.2.9",
|
|
39
45
|
"type-fest": "^4.41.0",
|
|
40
46
|
"zod": "^4.1.12"
|