stoatx 0.5.0 → 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/README.md +2 -2
  2. package/dist/index.d.mts +6 -6
  3. package/dist/index.d.ts +6 -6
  4. package/dist/index.js +6 -5
  5. package/dist/index.js.map +1 -1
  6. package/dist/index.mjs +6 -5
  7. package/dist/index.mjs.map +1 -0
  8. package/package.json +4 -10
  9. package/dist/.tsbuildinfo +0 -1
  10. package/dist/decorators/Events.d.ts +0 -55
  11. package/dist/decorators/Events.d.ts.map +0 -1
  12. package/dist/decorators/Events.js +0 -71
  13. package/dist/decorators/Events.js.map +0 -1
  14. package/dist/decorators/Guard.d.ts +0 -38
  15. package/dist/decorators/Guard.d.ts.map +0 -1
  16. package/dist/decorators/Guard.js +0 -47
  17. package/dist/decorators/Guard.js.map +0 -1
  18. package/dist/decorators/SimpleCommand.d.ts +0 -35
  19. package/dist/decorators/SimpleCommand.d.ts.map +0 -1
  20. package/dist/decorators/SimpleCommand.js +0 -43
  21. package/dist/decorators/SimpleCommand.js.map +0 -1
  22. package/dist/decorators/Stoat.d.ts +0 -30
  23. package/dist/decorators/Stoat.d.ts.map +0 -1
  24. package/dist/decorators/Stoat.js +0 -39
  25. package/dist/decorators/Stoat.js.map +0 -1
  26. package/dist/decorators/index.d.ts +0 -9
  27. package/dist/decorators/index.d.ts.map +0 -1
  28. package/dist/decorators/index.js +0 -10
  29. package/dist/decorators/index.js.map +0 -1
  30. package/dist/decorators/keys.d.ts +0 -10
  31. package/dist/decorators/keys.d.ts.map +0 -1
  32. package/dist/decorators/keys.js +0 -10
  33. package/dist/decorators/keys.js.map +0 -1
  34. package/dist/decorators/store.d.ts +0 -46
  35. package/dist/decorators/store.d.ts.map +0 -1
  36. package/dist/decorators/store.js +0 -70
  37. package/dist/decorators/store.js.map +0 -1
  38. package/dist/decorators/utils.d.ts +0 -6
  39. package/dist/decorators/utils.d.ts.map +0 -1
  40. package/dist/decorators/utils.js +0 -16
  41. package/dist/decorators/utils.js.map +0 -1
  42. package/dist/decorators.d.ts +0 -9
  43. package/dist/decorators.d.ts.map +0 -1
  44. package/dist/decorators.js +0 -21
  45. package/dist/decorators.js.map +0 -1
  46. package/dist/handler.d.ts +0 -145
  47. package/dist/handler.d.ts.map +0 -1
  48. package/dist/handler.js +0 -355
  49. package/dist/handler.js.map +0 -1
  50. package/dist/index.d.ts.map +0 -1
  51. package/dist/registry.d.ts +0 -125
  52. package/dist/registry.d.ts.map +0 -1
  53. package/dist/registry.js +0 -279
  54. package/dist/registry.js.map +0 -1
  55. package/dist/types.d.ts +0 -111
  56. package/dist/types.d.ts.map +0 -1
  57. package/dist/types.js +0 -2
  58. package/dist/types.js.map +0 -1
package/dist/handler.js DELETED
@@ -1,355 +0,0 @@
1
- import "reflect-metadata";
2
- import { CommandRegistry } from "./registry";
3
- import { Client as StoatClient } from "stoat.js";
4
- /**
5
- * Client - An extended Client that integrates StoatxHandler directly
6
- *
7
- * @example
8
- * ```ts
9
- * import { Client } from 'stoatx';
10
- *
11
- * const client = new Client({
12
- * prefix: '!',
13
- * owners: ['owner-user-id'],
14
- * });
15
- *
16
- * await client.initCommands();
17
- * ```
18
- */
19
- export class Client extends StoatClient {
20
- handler;
21
- constructor(options) {
22
- super();
23
- this.handler = new StoatxHandler({ ...options, client: this });
24
- // Automatically hook up the message handler
25
- this.on("messageCreate", async (message) => {
26
- await this.handler.handle(message);
27
- });
28
- }
29
- /**
30
- * Initialize the StoatxHandler commands
31
- */
32
- async initCommands() {
33
- await this.handler.init();
34
- }
35
- }
36
- /**
37
- * StoatxHandler - The execution engine for commands
38
- *
39
- * Handles message parsing, middleware execution, and command dispatching
40
- *
41
- * @internal This class is not intended to be instantiated directly. Use the `Client` from `stoatx` instead.
42
- */
43
- export class StoatxHandler {
44
- commandsDir;
45
- discoveryOptions;
46
- prefixResolver;
47
- owners;
48
- registry;
49
- cooldowns = new Map();
50
- disableMentionPrefix;
51
- client;
52
- constructor(options) {
53
- this.client = options.client;
54
- this.commandsDir = options.commandsDir;
55
- this.discoveryOptions = options.discovery;
56
- this.prefixResolver = options.prefix;
57
- this.owners = new Set(options.owners ?? []);
58
- this.registry = new CommandRegistry(options.extensions);
59
- this.disableMentionPrefix = options.disableMentionPrefix ?? false;
60
- }
61
- /**
62
- * Initialize the handler - load all commands
63
- */
64
- async init() {
65
- if (this.commandsDir) {
66
- await this.registry.loadFromDirectory(this.commandsDir);
67
- }
68
- else {
69
- await this.registry.autoDiscover(this.discoveryOptions);
70
- }
71
- this.attachEvents();
72
- }
73
- /**
74
- * Attach registered events to the client
75
- */
76
- attachEvents() {
77
- const events = this.registry.getEvents();
78
- for (const eventDef of events) {
79
- const handler = async (...args) => {
80
- try {
81
- await eventDef.instance[eventDef.methodName](...args, this.client);
82
- }
83
- catch (error) {
84
- console.error(`[Stoatx] Event Handler Error in @${eventDef.type === "on" ? "On" : "Once"}('${eventDef.event}'):`, error);
85
- }
86
- };
87
- if (eventDef.type === "once") {
88
- this.client.once(eventDef.event, handler);
89
- }
90
- else {
91
- this.client.on(eventDef.event, handler);
92
- }
93
- }
94
- }
95
- /**
96
- * Parse a raw message into command context
97
- */
98
- async parseMessage(rawContent, message, meta) {
99
- const prefix = await this.resolvePrefix(meta.serverId);
100
- let usedPrefix = prefix;
101
- let withoutPrefix = "";
102
- // Check for string prefix
103
- if (rawContent.startsWith(prefix)) {
104
- withoutPrefix = rawContent.slice(prefix.length).trim();
105
- usedPrefix = prefix;
106
- }
107
- // Check for mention prefix (e.g., "<@bot-id> command") - unless disabled
108
- else if (!this.disableMentionPrefix && rawContent.match(/^<@!?[\w]+>/)) {
109
- const mentionMatch = rawContent.match(/^<@!?([\w]+)>\s*/);
110
- if (mentionMatch) {
111
- const mentionedId = mentionMatch[1];
112
- const botId = this.client.user?.id;
113
- // Only process if mentioned user is the bot
114
- if (botId && mentionedId === botId) {
115
- usedPrefix = mentionMatch[0];
116
- withoutPrefix = rawContent.slice(mentionMatch[0].length).trim();
117
- }
118
- else {
119
- }
120
- }
121
- }
122
- if (!withoutPrefix) {
123
- return null;
124
- }
125
- const [commandName, ...args] = withoutPrefix.split(/\s+/);
126
- if (!commandName) {
127
- return null;
128
- }
129
- return {
130
- client: this.client,
131
- content: rawContent,
132
- authorId: meta.authorId,
133
- channelId: meta.channelId,
134
- serverId: meta.serverId,
135
- args,
136
- prefix: usedPrefix,
137
- commandName: commandName.toLowerCase(),
138
- reply: meta.reply,
139
- message,
140
- };
141
- }
142
- /**
143
- * Handle a message object using the configured message adapter
144
- *
145
- * @example
146
- * ```ts
147
- * // With message adapter configured
148
- * client.on('messageCreate', (message) => {
149
- * handler.handle(message);
150
- * });
151
- * ```
152
- */
153
- async handle(message) {
154
- if (!message.channel || !message.author) {
155
- return false;
156
- }
157
- // Skip messages from bots
158
- if (message.author.bot) {
159
- return false;
160
- }
161
- const rawContent = message.content;
162
- const authorId = message.author.id;
163
- const channelId = message.channel.id;
164
- const serverId = message.server?.id;
165
- const reply = async (content) => {
166
- return await message.channel.sendMessage(content);
167
- };
168
- return this.handleMessage(rawContent, message, {
169
- authorId,
170
- channelId,
171
- serverId,
172
- reply,
173
- });
174
- }
175
- /**
176
- * Handle a raw message string with metadata
177
- *
178
- * @example
179
- * ```ts
180
- * // Manual usage without message adapter
181
- * client.on('messageCreate', (message) => {
182
- * handler.handleMessage(message.content, message, {
183
- * authorId: message.author.id,
184
- * channelId: message.channel.id,
185
- * serverId: message.server?.id,
186
- * reply: (content) => message.channel.sendMessage(content),
187
- * });
188
- * });
189
- * ```
190
- */
191
- async handleMessage(rawContent, message, meta) {
192
- const ctx = await this.parseMessage(rawContent, message, meta);
193
- if (!ctx) {
194
- return false;
195
- }
196
- return this.execute(ctx);
197
- }
198
- /**
199
- * Execute a command with the given context
200
- */
201
- async execute(ctx) {
202
- const registered = this.registry.get(ctx.commandName);
203
- if (!registered) {
204
- return false;
205
- }
206
- const { instance, metadata, methodName, classConstructor } = registered;
207
- // Owner-only check
208
- if (metadata.ownerOnly && !this.owners.has(ctx.authorId)) {
209
- await ctx.reply("This command is owner-only.");
210
- return false;
211
- }
212
- // Guard checks - use classConstructor for guard metadata
213
- const guards = Reflect.getMetadata("stoatx:command:guards", classConstructor) || [];
214
- for (const guardClass of guards) {
215
- const guardInstance = new guardClass();
216
- if (typeof guardInstance.run === "function") {
217
- const guardResult = await guardInstance.run(ctx);
218
- if (!guardResult) {
219
- if (typeof guardInstance.guardFail === "function") {
220
- await guardInstance.guardFail(ctx);
221
- }
222
- else {
223
- console.error("[Stoatx] Guard check failed but no guardFail method defined on", guardClass.name);
224
- }
225
- return false;
226
- }
227
- }
228
- }
229
- // Cooldown check
230
- if (!this.checkCooldown(ctx.authorId, metadata)) {
231
- const remaining = this.getRemainingCooldown(ctx.authorId, metadata);
232
- // For method-based commands, check if instance has onCooldown
233
- if (typeof instance.onCooldown === "function") {
234
- await instance.onCooldown(ctx, remaining);
235
- }
236
- else {
237
- await ctx.reply(`Please wait ${(remaining / 1000).toFixed(1)} seconds before using this command again.`);
238
- }
239
- return false;
240
- }
241
- try {
242
- await instance[methodName](ctx);
243
- // Set cooldown after successful execution
244
- if (metadata.cooldown > 0) {
245
- this.setCooldown(ctx.authorId, metadata);
246
- }
247
- return true;
248
- }
249
- catch (error) {
250
- // Handle errors
251
- if (typeof instance.onError === "function") {
252
- await instance.onError(ctx, error);
253
- }
254
- else {
255
- console.error(`[Stoatx] Error in command ${metadata.name}:`, error);
256
- await ctx.reply(`An error occurred: ${error.message}`);
257
- }
258
- return false;
259
- }
260
- }
261
- /**
262
- * Get the command registry
263
- */
264
- getRegistry() {
265
- return this.registry;
266
- }
267
- /**
268
- * Get a command by name or alias
269
- */
270
- getCommand(name) {
271
- return this.registry.get(name);
272
- }
273
- /**
274
- * Get all commands
275
- */
276
- getCommands() {
277
- return this.registry.getAll();
278
- }
279
- /**
280
- * Reload all commands
281
- */
282
- async reload() {
283
- this.registry.clear();
284
- this.cooldowns.clear();
285
- if (this.commandsDir) {
286
- await this.registry.loadFromDirectory(this.commandsDir);
287
- return;
288
- }
289
- await this.registry.autoDiscover(this.discoveryOptions);
290
- }
291
- /**
292
- * Check if a user is an owner
293
- */
294
- isOwner(userId) {
295
- return this.owners.has(userId);
296
- }
297
- /**
298
- * Add an owner
299
- */
300
- addOwner(userId) {
301
- this.owners.add(userId);
302
- }
303
- /**
304
- * Remove an owner
305
- */
306
- removeOwner(userId) {
307
- this.owners.delete(userId);
308
- }
309
- /**
310
- * Resolve the prefix for a context
311
- */
312
- async resolvePrefix(serverId) {
313
- if (typeof this.prefixResolver === "function") {
314
- return this.prefixResolver({ serverId });
315
- }
316
- return this.prefixResolver;
317
- }
318
- /**
319
- * Check if user is on cooldown
320
- */
321
- checkCooldown(userId, metadata) {
322
- if (metadata.cooldown <= 0)
323
- return true;
324
- const commandCooldowns = this.cooldowns.get(metadata.name);
325
- if (!commandCooldowns)
326
- return true;
327
- const userCooldown = commandCooldowns.get(userId);
328
- if (!userCooldown)
329
- return true;
330
- return Date.now() >= userCooldown;
331
- }
332
- /**
333
- * Get remaining cooldown time in ms
334
- */
335
- getRemainingCooldown(userId, metadata) {
336
- const commandCooldowns = this.cooldowns.get(metadata.name);
337
- if (!commandCooldowns)
338
- return 0;
339
- const userCooldown = commandCooldowns.get(userId);
340
- if (!userCooldown)
341
- return 0;
342
- return Math.max(0, userCooldown - Date.now());
343
- }
344
- /**
345
- * Set cooldown for a user
346
- */
347
- setCooldown(userId, metadata) {
348
- if (!this.cooldowns.has(metadata.name)) {
349
- this.cooldowns.set(metadata.name, new Map());
350
- }
351
- const commandCooldowns = this.cooldowns.get(metadata.name);
352
- commandCooldowns.set(userId, Date.now() + metadata.cooldown);
353
- }
354
- }
355
- //# sourceMappingURL=handler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,SAAS,CAAC;AAGxB,cAAc,cAAc,CAAC;AAG7B,cAAc,YAAY,CAAC;AAG3B,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC"}
@@ -1,125 +0,0 @@
1
- import type { CommandMetadata } from "./types";
2
- interface AutoDiscoveryOptions {
3
- roots?: string[];
4
- include?: string[];
5
- ignore?: string[];
6
- }
7
- /**
8
- * Stored command entry from @Stoat/@SimpleCommand registration.
9
- */
10
- export interface RegisteredCommand {
11
- /** Instance of the @Stoat class */
12
- instance: object;
13
- /** Command metadata */
14
- metadata: CommandMetadata;
15
- /** Method name to call */
16
- methodName: string;
17
- /** The original class constructor (for guard validation) */
18
- classConstructor: Function;
19
- }
20
- /**
21
- * Stored event entry from @On/@Once registration.
22
- */
23
- export interface RegisteredEvent {
24
- instance: object;
25
- methodName: string;
26
- event: string;
27
- type: "on" | "once";
28
- }
29
- /**
30
- * CommandRegistry - Scans directories and stores commands in a Map
31
- *
32
- * @example
33
- * ```ts
34
- * const registry = new CommandRegistry();
35
- * await registry.loadFromDirectory('./src/commands');
36
- *
37
- * const ping = registry.get('ping');
38
- * const allCommands = registry.getAll();
39
- * ```
40
- */
41
- export declare class CommandRegistry {
42
- private static readonly DEFAULT_AUTO_DISCOVERY_IGNORES;
43
- private readonly commands;
44
- private readonly aliases;
45
- private readonly registeredEvents;
46
- private readonly extensions;
47
- private readonly processedStoatClasses;
48
- constructor(extensions?: string[]);
49
- /**
50
- * Get the number of registered commands
51
- */
52
- get size(): number;
53
- /**
54
- * Load commands from a directory using glob pattern matching
55
- */
56
- loadFromDirectory(directory: string): Promise<void>;
57
- /**
58
- * Auto-discover command files across one or more roots.
59
- */
60
- autoDiscover(options?: AutoDiscoveryOptions): Promise<void>;
61
- private getDefaultAutoDiscoveryPatterns;
62
- private isLikelyCommandModule;
63
- /**
64
- * Register a command instance
65
- */
66
- register(instance: object, metadata: CommandMetadata, classConstructor: Function, methodName: string): void;
67
- /**
68
- * Get a command by name or alias
69
- */
70
- get(name: string): RegisteredCommand | undefined;
71
- /**
72
- * Check if a command exists
73
- */
74
- has(name: string): boolean;
75
- /**
76
- * Get all registered commands
77
- */
78
- getAll(): RegisteredCommand[];
79
- /**
80
- * Get all command metadata
81
- */
82
- getAllMetadata(): CommandMetadata[];
83
- /**
84
- * Get all registered events
85
- */
86
- getEvents(): RegisteredEvent[];
87
- /**
88
- * Get commands grouped by category
89
- */
90
- getByCategory(): Map<string, RegisteredCommand[]>;
91
- /**
92
- * Clear all commands
93
- */
94
- clear(): void;
95
- /**
96
- * Iterate over commands
97
- */
98
- [Symbol.iterator](): IterableIterator<[string, RegisteredCommand]>;
99
- /**
100
- * Iterate over command values
101
- */
102
- values(): IterableIterator<RegisteredCommand>;
103
- /**
104
- * Iterate over command names
105
- */
106
- keys(): IterableIterator<string>;
107
- /**
108
- * Validate that all guards on a command implement the required methods
109
- * @param commandClass
110
- * @param commandName
111
- * @private
112
- */
113
- private validateGuards;
114
- /**
115
- * Load commands from a single file
116
- */
117
- private loadFile;
118
- private registerStoatClassCommands;
119
- /**
120
- * Derive category from file path relative to base directory
121
- */
122
- private getCategoryFromPath;
123
- }
124
- export {};
125
- //# sourceMappingURL=registry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,UAAU,oBAAoB;IAC5B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,mCAAmC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,uBAAuB;IACvB,QAAQ,EAAE,eAAe,CAAC;IAC1B,0BAA0B;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,gBAAgB,EAAE,QAAQ,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,IAAI,GAAG,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,8BAA8B,CAMpD;IAEF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6C;IACtE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;IAC1D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAyB;IAC1D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAW;IACtC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAA4B;gBAEtD,UAAU,GAAE,MAAM,EAA4B;IAI1D;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACG,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBzD;;OAEG;IACG,YAAY,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC;IAgCrE,OAAO,CAAC,+BAA+B;YAKzB,qBAAqB;IAenC;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,gBAAgB,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAsB3G;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAMhD;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAK1B;;OAEG;IACH,MAAM,IAAI,iBAAiB,EAAE;IAI7B;;OAEG;IACH,cAAc,IAAI,eAAe,EAAE;IAInC;;OAEG;IACH,SAAS,IAAI,eAAe,EAAE;IAI9B;;OAEG;IACH,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAajD;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;OAEG;IACH,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAIlE;;OAEG;IACH,MAAM,IAAI,gBAAgB,CAAC,iBAAiB,CAAC;IAI7C;;OAEG;IACH,IAAI,IAAI,gBAAgB,CAAC,MAAM,CAAC;IAIhC;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAuBtB;;OAEG;YACW,QAAQ;IAkBtB,OAAO,CAAC,0BAA0B;IA0ClC;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAU5B"}