yuzuha 0.3.0 → 0.3.1
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/CHANGELOG.md +23 -0
- package/README.md +3 -3
- package/VERSIONING.md +18 -5
- package/dist/commands/arguments.d.ts.map +1 -1
- package/dist/commands/arguments.js +40 -13
- package/dist/commands/arguments.js.map +1 -1
- package/dist/commands/builders.d.ts +1 -0
- package/dist/commands/builders.d.ts.map +1 -1
- package/dist/commands/builders.js +5 -0
- package/dist/commands/builders.js.map +1 -1
- package/dist/commands/context-like.d.ts +4 -0
- package/dist/commands/context-like.d.ts.map +1 -0
- package/dist/commands/context-like.js +2 -0
- package/dist/commands/context-like.js.map +1 -0
- package/dist/commands/context.d.ts +16 -2
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +53 -11
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/definition.d.ts +1 -0
- package/dist/commands/definition.d.ts.map +1 -1
- package/dist/commands/definition.js.map +1 -1
- package/dist/commands/typed-arguments.js +2 -2
- package/dist/commands/typed-arguments.js.map +1 -1
- package/dist/domain/cdn.d.ts +23 -0
- package/dist/domain/cdn.d.ts.map +1 -0
- package/dist/domain/cdn.js +38 -0
- package/dist/domain/cdn.js.map +1 -0
- package/dist/domain/resolvers.d.ts +60 -0
- package/dist/domain/resolvers.d.ts.map +1 -0
- package/dist/domain/resolvers.js +31 -0
- package/dist/domain/resolvers.js.map +1 -0
- package/dist/domain/values.d.ts +2 -0
- package/dist/domain/values.d.ts.map +1 -1
- package/dist/domain/values.js +26 -1
- package/dist/domain/values.js.map +1 -1
- package/dist/framework/bot.d.ts +5 -0
- package/dist/framework/bot.d.ts.map +1 -1
- package/dist/framework/bot.js +44 -9
- package/dist/framework/bot.js.map +1 -1
- package/dist/framework/logging.d.ts +4 -1
- package/dist/framework/logging.d.ts.map +1 -1
- package/dist/framework/logging.js.map +1 -1
- package/dist/framework/options.d.ts +12 -0
- package/dist/framework/options.d.ts.map +1 -1
- package/dist/framework/options.js.map +1 -1
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/fluxer/resources/channels.d.ts.map +1 -1
- package/dist/infrastructure/fluxer/resources/channels.js +62 -8
- package/dist/infrastructure/fluxer/resources/channels.js.map +1 -1
- package/dist/infrastructure/fluxer/resources/expressions.d.ts.map +1 -1
- package/dist/infrastructure/fluxer/resources/expressions.js +2 -1
- package/dist/infrastructure/fluxer/resources/expressions.js.map +1 -1
- package/dist/infrastructure/fluxer/resources/messages.d.ts +2 -1
- package/dist/infrastructure/fluxer/resources/messages.d.ts.map +1 -1
- package/dist/infrastructure/fluxer/resources/messages.js +16 -7
- package/dist/infrastructure/fluxer/resources/messages.js.map +1 -1
- package/dist/infrastructure/fluxer/resources/users.d.ts +1 -1
- package/dist/infrastructure/fluxer/resources/users.d.ts.map +1 -1
- package/dist/infrastructure/fluxer/resources/users.js +41 -9
- package/dist/infrastructure/fluxer/resources/users.js.map +1 -1
- package/dist/infrastructure/fluxer/resources.d.ts +3 -1
- package/dist/infrastructure/fluxer/resources.d.ts.map +1 -1
- package/dist/infrastructure/fluxer/resources.js +8 -3
- package/dist/infrastructure/fluxer/resources.js.map +1 -1
- package/dist/infrastructure/fluxer/transport.d.ts +4 -1
- package/dist/infrastructure/fluxer/transport.d.ts.map +1 -1
- package/dist/infrastructure/fluxer/transport.js +41 -14
- package/dist/infrastructure/fluxer/transport.js.map +1 -1
- package/dist/ports/resources/channels.d.ts +20 -1
- package/dist/ports/resources/channels.d.ts.map +1 -1
- package/dist/ports/resources/channels.js.map +1 -1
- package/dist/ports/resources/users.d.ts +5 -0
- package/dist/ports/resources/users.d.ts.map +1 -1
- package/dist/ports/resources/users.js.map +1 -1
- package/dist/services/authorization.js +9 -9
- package/dist/services/authorization.js.map +1 -1
- package/dist/services/members.d.ts +5 -0
- package/dist/services/members.d.ts.map +1 -1
- package/dist/services/members.js +75 -5
- package/dist/services/members.js.map +1 -1
- package/dist/services/moderation.js +9 -9
- package/dist/services/moderation.js.map +1 -1
- package/dist/services/resource-authorization.d.ts.map +1 -1
- package/dist/services/resource-authorization.js +31 -17
- package/dist/services/resource-authorization.js.map +1 -1
- package/dist/services/retry.d.ts +17 -0
- package/dist/services/retry.d.ts.map +1 -0
- package/dist/services/retry.js +67 -0
- package/dist/services/retry.js.map +1 -0
- package/dist/shared/errors.d.ts +4 -1
- package/dist/shared/errors.d.ts.map +1 -1
- package/dist/shared/errors.js +8 -1
- package/dist/shared/errors.js.map +1 -1
- package/dist/testing.d.ts +8 -0
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +24 -4
- package/dist/testing.js.map +1 -1
- package/docs/API.md +11 -0
- package/docs/CANVAS.md +1 -1
- package/docs/FRAMEWORK.md +13 -0
- package/docs/IMAGES.md +9 -0
- package/docs/NATIVE.md +49 -1
- package/docs/PARITY-MATRIX.md +31 -32
- package/docs/QUICKSTART.md +2 -2
- package/docs/README.md +1 -1
- package/docs/TESTING.md +16 -0
- package/package.json +1 -1
- package/src/commands/arguments.ts +35 -13
- package/src/commands/builders.ts +4 -0
- package/src/commands/context-like.ts +7 -0
- package/src/commands/context.ts +56 -11
- package/src/commands/definition.ts +1 -0
- package/src/commands/typed-arguments.ts +2 -2
- package/src/domain/cdn.ts +55 -0
- package/src/domain/resolvers.ts +42 -0
- package/src/domain/values.ts +28 -1
- package/src/framework/bot.ts +41 -10
- package/src/framework/logging.ts +5 -1
- package/src/framework/options.ts +4 -0
- package/src/index.ts +13 -0
- package/src/infrastructure/fluxer/resources/channels.ts +53 -8
- package/src/infrastructure/fluxer/resources/expressions.ts +2 -1
- package/src/infrastructure/fluxer/resources/messages.ts +17 -6
- package/src/infrastructure/fluxer/resources/users.ts +38 -9
- package/src/infrastructure/fluxer/resources.ts +4 -3
- package/src/infrastructure/fluxer/transport.ts +42 -13
- package/src/ports/resources/channels.ts +11 -1
- package/src/ports/resources/users.ts +3 -0
- package/src/services/authorization.ts +9 -9
- package/src/services/members.ts +70 -5
- package/src/services/moderation.ts +9 -9
- package/src/services/resource-authorization.ts +31 -17
- package/src/services/retry.ts +74 -0
- package/src/shared/errors.ts +10 -1
- package/src/testing.ts +28 -4
package/dist/commands/context.js
CHANGED
|
@@ -9,6 +9,7 @@ import { VariableService } from '../services/variables.js';
|
|
|
9
9
|
import { NativeModeration } from '../services/native-moderation.js';
|
|
10
10
|
import { ScopedData } from '../services/native-data.js';
|
|
11
11
|
import { bindAuthorizedResources } from '../services/resource-authorization.js';
|
|
12
|
+
import { createCdn } from '../domain/cdn.js';
|
|
12
13
|
import { MemberService } from '../services/members.js';
|
|
13
14
|
import { CanvasService } from '../services/canvas.js';
|
|
14
15
|
import { GuardError, PartialModerationError, YuzuhaError } from '../shared/errors.js';
|
|
@@ -31,6 +32,9 @@ export class CommandContext {
|
|
|
31
32
|
sourceMessage;
|
|
32
33
|
event;
|
|
33
34
|
messageAvailable;
|
|
35
|
+
deleteLaterFn;
|
|
36
|
+
cdnService = createCdn();
|
|
37
|
+
disableResourceAuthorization = false;
|
|
34
38
|
actor;
|
|
35
39
|
transport;
|
|
36
40
|
store;
|
|
@@ -65,6 +69,7 @@ export class CommandContext {
|
|
|
65
69
|
this.scope = { guildID: this.guildID, authorID: this.authorID };
|
|
66
70
|
this.transport = options.transport;
|
|
67
71
|
this.store = options.store;
|
|
72
|
+
this.deleteLaterFn = options.deleteLater;
|
|
68
73
|
this.command = options.command;
|
|
69
74
|
this.lineage = options.lineage ?? [options.command];
|
|
70
75
|
this.prefix = options.prefix ?? '';
|
|
@@ -74,7 +79,7 @@ export class CommandContext {
|
|
|
74
79
|
}
|
|
75
80
|
catch (error) {
|
|
76
81
|
if (error instanceof GuardError)
|
|
77
|
-
throw new GuardError(`${error.message}\nUso: ${commandUsage(this.command, this.prefix)}
|
|
82
|
+
throw new GuardError(`${error.message}\nUso: ${commandUsage(this.command, this.prefix)}`, error.reason);
|
|
78
83
|
throw error;
|
|
79
84
|
}
|
|
80
85
|
this.claimCooldown = options.cooldown;
|
|
@@ -86,6 +91,8 @@ export class CommandContext {
|
|
|
86
91
|
this.httpService = options.http;
|
|
87
92
|
this.musicService = options.music;
|
|
88
93
|
this.voiceService = options.voice;
|
|
94
|
+
this.cdnService = options.cdn ?? createCdn();
|
|
95
|
+
this.disableResourceAuthorization = options.disableResourceAuthorization === true;
|
|
89
96
|
this.canvasRenderer = options.canvas?.renderer;
|
|
90
97
|
this.canvasConfig = options.canvas?.config;
|
|
91
98
|
this.nativeResources = options.resources;
|
|
@@ -110,6 +117,7 @@ export class CommandContext {
|
|
|
110
117
|
throw new YuzuhaError('NATIVE_UNAVAILABLE', 'O recurso de servidor não implementa leaveGuild.');
|
|
111
118
|
await this.resources.users.leaveGuild(guildID);
|
|
112
119
|
}
|
|
120
|
+
get cdn() { return this.cdnService; }
|
|
113
121
|
get mod() {
|
|
114
122
|
return this.nativeMod ??= new NativeModeration((action, target, reason, options) => this.moderate(action, target, reason, options), (action, targetID) => this.moderation.canModerate(action, targetID));
|
|
115
123
|
}
|
|
@@ -123,7 +131,7 @@ export class CommandContext {
|
|
|
123
131
|
}
|
|
124
132
|
get message() {
|
|
125
133
|
if (!this.messageAvailable)
|
|
126
|
-
throw new GuardError('Este evento não fornece uma mensagem completa. Use os campos de evento e um canal explícito.');
|
|
134
|
+
throw new GuardError('Este evento não fornece uma mensagem completa. Use os campos de evento e um canal explícito.', 'GENERIC');
|
|
127
135
|
return this.sourceMessage;
|
|
128
136
|
}
|
|
129
137
|
get authorID() { return this.actor?.authorID ?? this.sourceMessage.authorID; }
|
|
@@ -144,7 +152,9 @@ export class CommandContext {
|
|
|
144
152
|
throw new YuzuhaError('NATIVE_UNAVAILABLE', 'Os recursos nativos não foram fornecidos a este contexto.');
|
|
145
153
|
if (this.scopedResources)
|
|
146
154
|
return this.scopedResources;
|
|
147
|
-
const source =
|
|
155
|
+
const source = this.disableResourceAuthorization ? this.nativeResources
|
|
156
|
+
: bindAuthorizedResources(this.nativeResources, this.transport, { guildID: this.guildID, authorID: this.authorID });
|
|
157
|
+
const collectors = source.collectors;
|
|
148
158
|
return this.scopedResources = { users: source.users, roles: source.roles, channels: source.channels,
|
|
149
159
|
messages: source.messages, webhooks: source.webhooks, expressions: source.expressions,
|
|
150
160
|
threads: source.threads, invites: source.invites, gateway: source.gateway,
|
|
@@ -188,13 +198,39 @@ export class CommandContext {
|
|
|
188
198
|
requireGuild() { return requireGuild(this.guildID); }
|
|
189
199
|
assert(condition, message) {
|
|
190
200
|
if (!condition)
|
|
191
|
-
throw new GuardError(message);
|
|
201
|
+
throw new GuardError(message, 'GENERIC');
|
|
192
202
|
}
|
|
193
|
-
reply(payload) {
|
|
194
|
-
|
|
203
|
+
reply(payload, options) {
|
|
204
|
+
if (this.commandMessageDeleted)
|
|
205
|
+
return this.send(payload, undefined, options);
|
|
206
|
+
validateTtl(options);
|
|
207
|
+
return this.sendVia(this.transport.reply(this.message, typeof payload === 'string' ? { content: payload } : payload), this.message.channelID, options);
|
|
195
208
|
}
|
|
196
|
-
send(payload, channelID = this.message.channelID) {
|
|
197
|
-
|
|
209
|
+
send(payload, channelID = this.message.channelID, options) {
|
|
210
|
+
validateTtl(options);
|
|
211
|
+
return this.sendVia(this.transport.send(channelID, typeof payload === 'string' ? { content: payload } : payload), channelID, options);
|
|
212
|
+
}
|
|
213
|
+
commandMessageDeleted = false;
|
|
214
|
+
async deleteCommandMessage() {
|
|
215
|
+
try {
|
|
216
|
+
await this.transport.delete(this.message.channelID, this.message.id);
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
const candidate = error;
|
|
220
|
+
if (candidate?.status !== 404 && candidate?.code !== 10008 && candidate?.code !== 'NOT_FOUND')
|
|
221
|
+
throw error;
|
|
222
|
+
}
|
|
223
|
+
this.commandMessageDeleted = true;
|
|
224
|
+
}
|
|
225
|
+
async sendVia(pending, channelID, options) {
|
|
226
|
+
const ttlMs = options?.ttlMs;
|
|
227
|
+
const id = await pending;
|
|
228
|
+
if (ttlMs !== undefined)
|
|
229
|
+
this.deleteLater(channelID, id, ttlMs);
|
|
230
|
+
return id;
|
|
231
|
+
}
|
|
232
|
+
deleteLater(channelID, messageID, ttlMs) {
|
|
233
|
+
this.deleteLaterFn?.(channelID, messageID, ttlMs);
|
|
198
234
|
}
|
|
199
235
|
sendStream(source, options, channelID = this.message.channelID) {
|
|
200
236
|
return sendStreamAttachment(this.resources.messages, channelID, source, options, this.signal);
|
|
@@ -216,7 +252,7 @@ export class CommandContext {
|
|
|
216
252
|
const remaining = this.claimCooldown(key, parseDuration(duration));
|
|
217
253
|
if (remaining > 0)
|
|
218
254
|
throw new GuardError((message ?? 'Aguarde {remaining} antes de usar novamente.')
|
|
219
|
-
.replaceAll('{remaining}', `${Math.ceil(remaining / 1000)}s`));
|
|
255
|
+
.replaceAll('{remaining}', `${Math.ceil(remaining / 1000)}s`), 'COOLDOWN');
|
|
220
256
|
}
|
|
221
257
|
async prepare() {
|
|
222
258
|
if (this.command.guildOnly)
|
|
@@ -238,7 +274,7 @@ export class CommandContext {
|
|
|
238
274
|
}
|
|
239
275
|
catch (error) {
|
|
240
276
|
if (error instanceof GuardError)
|
|
241
|
-
throw new GuardError(`${error.message}\nUso: ${commandUsage(this.command, this.prefix)}
|
|
277
|
+
throw new GuardError(`${error.message}\nUso: ${commandUsage(this.command, this.prefix)}`, error.reason);
|
|
242
278
|
throw error;
|
|
243
279
|
}
|
|
244
280
|
for (const command of this.lineage) {
|
|
@@ -247,7 +283,7 @@ export class CommandContext {
|
|
|
247
283
|
const key = JSON.stringify([this.guildID, this.message.channelID, this.authorID, command.name]);
|
|
248
284
|
const remaining = this.claimCooldown(key, parseDuration(command.cooldown));
|
|
249
285
|
if (remaining > 0)
|
|
250
|
-
throw new GuardError(`Aguarde ${Math.ceil(remaining / 1000)}s antes de usar novamente
|
|
286
|
+
throw new GuardError(`Aguarde ${Math.ceil(remaining / 1000)}s antes de usar novamente.`, 'COOLDOWN');
|
|
251
287
|
}
|
|
252
288
|
}
|
|
253
289
|
async moderate(action, target, reason, options = {}) {
|
|
@@ -275,4 +311,10 @@ export class CommandContext {
|
|
|
275
311
|
return this.variables.delete(scope, name);
|
|
276
312
|
}
|
|
277
313
|
}
|
|
314
|
+
function validateTtl(options) {
|
|
315
|
+
const ttlMs = options?.ttlMs;
|
|
316
|
+
if (ttlMs !== undefined && (!Number.isInteger(ttlMs) || ttlMs < 1_000 || ttlMs > 86_400_000)) {
|
|
317
|
+
throw new GuardError('ttlMs deve ser um inteiro entre 1000 e 86400000.', 'INVALID_ARGUMENT');
|
|
318
|
+
}
|
|
319
|
+
}
|
|
278
320
|
//# sourceMappingURL=context.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from 'node:crypto';\nimport type { IncomingMessage, Payload } from '../domain/messages.js';\nimport type { ScriptEventData } from '../domain/events.js';\nimport type { CaseRecord, ModerationAction, ModerationOptions } from '../domain/moderation.js';\nimport type { JsonValue, VariableScope } from '../domain/state.js';\nimport { parseDuration } from '../domain/values.js';\nimport type { Store } from '../ports/store.js';\nimport type { Transport } from '../ports/transport.js';\nimport type { NativeAccess } from '../ports/native.js';\nimport type { Resources } from '../ports/resources.js';\nimport type { Scheduler } from '../services/scheduler.js';\nimport { sendStreamAttachment } from '../services/attachments.js';\nimport type { StreamAttachmentOptions } from '../services/attachments.js';\nimport { bindHttp } from '../services/http.js';\nimport type { HttpService } from '../services/http.js';\nimport { AuthorizationService, requireGuild } from '../services/authorization.js';\nimport { CaseService } from '../services/cases.js';\nimport { ModerationService } from '../services/moderation.js';\nimport { VariableService } from '../services/variables.js';\nimport type { DataTransaction, VariableOptions } from '../services/variables.js';\nimport { NativeModeration } from '../services/native-moderation.js';\nimport { ScopedData } from '../services/native-data.js';\nimport type { NativeData } from '../services/native-data.js';\nimport { bindAuthorizedResources } from '../services/resource-authorization.js';\nimport { MemberService } from '../services/members.js';\nimport type { MusicManager } from '../services/music.js';\nimport type { NativeVoice } from '../ports/voice.js';\nimport type { CanvasConfig } from '../domain/canvas.js';\nimport type { CanvasRenderer } from '../ports/canvas.js';\nimport { CanvasService } from '../services/canvas.js';\nimport { GuardError, PartialModerationError, YuzuhaError } from '../shared/errors.js';\nimport { parseArguments, parseFlags, tokenize } from './arguments.js';\nimport { commandUsage } from './help.js';\nimport { ArgumentBag } from './typed-arguments.js';\nimport type { Command } from './definition.js';\n\nexport interface ContextOptions {\n message: IncomingMessage;\n transport: Transport;\n store: Store;\n command: Command;\n lineage?: readonly Command[];\n prefix?: string;\n input?: string;\n cooldown: (key: string, duration: number) => number;\n now?: () => number;\n help?: () => string;\n native?: NativeAccess;\n resources?: Resources;\n scheduler?: Scheduler;\n http?: HttpService;\n music?: MusicManager;\n voice?: NativeVoice;\n canvas?: { renderer: CanvasRenderer; config?: CanvasConfig };\n signal?: AbortSignal;\n executionID?: string;\n event?: Readonly<ScriptEventData>;\n messageAvailable?: boolean;\n actor?: { guildID: string; authorID: string };\n}\n\nexport class CommandContext {\n private executionKey?: string;\n private localVars?: Map<string, unknown>;\n private argumentsBag?: ArgumentBag;\n private flagsBag?: ArgumentBag;\n private nativeMod?: NativeModeration;\n private nativeData?: NativeData;\n private memberService?: MemberService;\n readonly signal: AbortSignal;\n readonly now: () => number;\n readonly tokens: string[];\n lastCase?: CaseRecord;\n private moderationApplied = false;\n private readonly sourceMessage: IncomingMessage;\n readonly event?: Readonly<ScriptEventData>;\n private readonly messageAvailable: boolean;\n private readonly actor?: { guildID: string; authorID: string };\n readonly transport: Transport;\n readonly store: Store;\n readonly command: Command;\n readonly input: string;\n readonly help: () => string;\n private readonly claimCooldown: ContextOptions['cooldown'];\n private readonly lineage: readonly Command[];\n private readonly prefix: string;\n private authorizationService?: AuthorizationService;\n private moderationService?: ModerationService;\n private caseService?: CaseService;\n private variableService?: VariableService;\n private readonly scope: { guildID: string; authorID: string };\n private readonly native?: NativeAccess;\n private readonly nativeResources?: Resources;\n private readonly schedulerService?: Scheduler;\n private readonly httpService?: HttpService;\n private readonly musicService?: MusicManager;\n private readonly voiceService?: NativeVoice;\n private readonly canvasRenderer?: CanvasRenderer;\n private readonly canvasConfig?: CanvasConfig;\n private canvasService?: CanvasService;\n private scopedHttp?: HttpService;\n private scopedResources?: Resources;\n\n constructor(options: ContextOptions) {\n this.executionKey = options.executionID;\n this.sourceMessage = options.message;\n this.event = options.event ? Object.freeze({ ...options.event }) : undefined;\n this.messageAvailable = options.messageAvailable ?? true;\n this.actor = options.actor;\n this.scope = { guildID: this.guildID, authorID: this.authorID };\n this.transport = options.transport;\n this.store = options.store;\n this.command = options.command;\n this.lineage = options.lineage ?? [options.command];\n this.prefix = options.prefix ?? '';\n this.input = options.input ?? '';\n try { this.tokens = tokenize(this.input); }\n catch (error) {\n if (error instanceof GuardError) throw new GuardError(`${error.message}\\nUso: ${commandUsage(this.command, this.prefix)}`);\n throw error;\n }\n this.claimCooldown = options.cooldown;\n this.help = options.help ?? (() => '');\n this.native = options.native;\n this.schedulerService = options.scheduler;\n this.signal = options.signal ?? new AbortController().signal;\n this.now = options.now ?? Date.now;\n this.httpService = options.http;\n this.musicService = options.music;\n this.voiceService = options.voice;\n this.canvasRenderer = options.canvas?.renderer;\n this.canvasConfig = options.canvas?.config;\n this.nativeResources = options.resources;\n }\n\n private get authorization(): AuthorizationService { return this.authorizationService ??= new AuthorizationService(this.transport, this.scope); }\n private get moderation(): ModerationService { return this.moderationService ??= new ModerationService(this.transport, this.store, this.scope); }\n private get cases(): CaseService { return this.caseService ??= new CaseService(this.store); }\n private get variables(): VariableService { return this.variableService ??= new VariableService(this.store, this.scope, this.now); }\n get members(): MemberService { return this.memberService ??= new MemberService(this.transport, this.scope, () => this.resources.users); }\n get vars(): Map<string, unknown> { return this.localVars ??= new Map(); }\n get args(): ArgumentBag { return this.argumentsBag ??= new ArgumentBag(); }\n get flags(): ArgumentBag { return this.flagsBag ??= new ArgumentBag(); }\n async guildFeatures(): Promise<string[]> {\n const info = await this.resources.users.guild(this.requireGuild());\n if (!info.features) throw new YuzuhaError('NATIVE_UNAVAILABLE', 'O recurso de servidor não fornece features.');\n return [...info.features];\n }\n\n async leaveGuild(): Promise<void> {\n const guildID = await this.authorization.requireGuildDeparture();\n if (!this.resources.users.leaveGuild) throw new YuzuhaError('NATIVE_UNAVAILABLE', 'O recurso de servidor não implementa leaveGuild.');\n await this.resources.users.leaveGuild(guildID);\n }\n get mod(): NativeModeration {\n return this.nativeMod ??= new NativeModeration(\n (action, target, reason, options) => this.moderate(action, target, reason, options),\n (action, targetID) => this.moderation.canModerate(action, targetID));\n }\n get data(): NativeData {\n return this.nativeData ??= Object.freeze({\n guild: new ScopedData(this.variables, 'guild'), user: new ScopedData(this.variables, 'user'),\n global: new ScopedData(this.variables, 'global'),\n userFor: (id: string) => new ScopedData(this.variables.forUser(id), 'user'),\n transaction: <T>(writer: (data: DataTransaction) => T) => this.variables.transaction(writer),\n });\n }\n\n get message(): IncomingMessage {\n if (!this.messageAvailable) throw new GuardError('Este evento não fornece uma mensagem completa. Use os campos de evento e um canal explícito.');\n return this.sourceMessage;\n }\n get authorID(): string { return this.actor?.authorID ?? this.sourceMessage.authorID; }\n get authorName(): string { return this.event?.userName ?? this.sourceMessage.authorName; }\n get channelID(): string { return this.sourceMessage.channelID; }\n get executionID(): string { return this.executionKey ??= randomUUID(); }\n get hasModerationEffect(): boolean { return this.moderationApplied; }\n get guildID(): string { return this.actor?.guildID ?? this.sourceMessage.guildID ?? ''; }\n get client(): NativeAccess['client'] {\n if (!this.native) throw new YuzuhaError('NATIVE_UNAVAILABLE', 'O client nativo não foi fornecido a este contexto.');\n return this.native.client;\n }\n get nativeMessage(): NativeAccess['message'] { return this.native?.message; }\n /** Recursos nativos usados por funções de script e comandos. */\n get resources(): Resources {\n if (!this.nativeResources) throw new YuzuhaError('NATIVE_UNAVAILABLE', 'Os recursos nativos não foram fornecidos a este contexto.');\n if (this.scopedResources) return this.scopedResources;\n const source = bindAuthorizedResources(this.nativeResources, this.transport, { guildID: this.guildID, authorID: this.authorID }), collectors = source.collectors;\n return this.scopedResources = { users: source.users, roles: source.roles, channels: source.channels,\n messages: source.messages, webhooks: source.webhooks, expressions: source.expressions,\n threads: source.threads, invites: source.invites, gateway: source.gateway,\n instance: source.instance, self: source.self, cache: source.cache, collectors: {\n awaitMessage: (channelID, input) => collectors.awaitMessage(channelID, { ...input,\n signal: input.signal ? AbortSignal.any([this.signal, input.signal]) : this.signal }),\n awaitReaction: (channelID, messageID, emojis, timeMs, userID, signal) => collectors.awaitReaction(\n channelID, messageID, emojis, timeMs, userID, signal ? AbortSignal.any([this.signal, signal]) : this.signal),\n collectMessages: (channelID, input) => collectors.collectMessages(channelID, { ...input,\n signal: input.signal ? AbortSignal.any([this.signal, input.signal]) : this.signal }),\n collectReactions: (channelID, input) => collectors.collectReactions(channelID, { ...input,\n signal: input.signal ? AbortSignal.any([this.signal, input.signal]) : this.signal }),\n } };\n }\n get scheduler(): Scheduler {\n if (!this.schedulerService) throw new YuzuhaError('NATIVE_UNAVAILABLE', 'O agendador não foi fornecido a este contexto.');\n return this.schedulerService;\n }\n get music(): MusicManager {\n if (!this.musicService) throw new YuzuhaError('NATIVE_UNAVAILABLE', 'O gerenciador de música não foi fornecido a este contexto.');\n return this.musicService;\n }\n get voice(): NativeVoice {\n if (!this.voiceService) throw new YuzuhaError('NATIVE_UNAVAILABLE', 'O serviço de voz não foi fornecido a este contexto.');\n return this.voiceService;\n }\n get canvas(): CanvasService {\n if (!this.canvasRenderer) throw new YuzuhaError('NATIVE_UNAVAILABLE', 'O renderer de Canvas não foi fornecido a este contexto.');\n return this.canvasService ??= new CanvasService({ renderer: this.canvasRenderer, ...this.canvasConfig,\n signal: this.signal, http: this.httpService ? this.http : undefined,\n channelID: this.channelID, messages: this.resources.messages });\n }\n get http(): HttpService {\n if (!this.httpService) throw new YuzuhaError('NATIVE_UNAVAILABLE', 'O serviço HTTP não foi fornecido a este contexto.');\n return this.scopedHttp ??= bindHttp(this.command.http ? this.httpService.withPolicy(this.command.http) : this.httpService, this.signal);\n }\n requireGuild(): string { return requireGuild(this.guildID); }\n\n assert(condition: unknown, message: string): void {\n if (!condition) throw new GuardError(message);\n }\n\n reply(payload: string | Payload): Promise<string> {\n return this.transport.reply(this.message, typeof payload === 'string' ? { content: payload } : payload);\n }\n\n send(payload: string | Payload, channelID = this.message.channelID): Promise<string> {\n return this.transport.send(channelID, typeof payload === 'string' ? { content: payload } : payload);\n }\n\n sendStream(source: ReadableStream<Uint8Array>, options: StreamAttachmentOptions, channelID = this.message.channelID): Promise<string> {\n return sendStreamAttachment(this.resources.messages, channelID, source, options, this.signal);\n }\n\n edit(messageID: string, payload: string | Payload, channelID = this.message.channelID): Promise<void> {\n return this.transport.edit(channelID, messageID, typeof payload === 'string' ? { content: payload } : payload);\n }\n\n delete(messageID: string, channelID = this.message.channelID): Promise<void> {\n return this.transport.delete(channelID, messageID);\n }\n\n react(emoji: string, messageID = this.message.id, channelID = this.message.channelID): Promise<void> {\n return this.transport.react(channelID, messageID, emoji);\n }\n\n requirePermission(name: string, bot = false, message?: string): Promise<void> {\n return this.authorization.requirePermission(name, bot, message);\n }\n\n cooldown(duration: string | number, message?: string): void {\n const key = JSON.stringify([this.guildID, this.message.channelID, this.authorID, this.command.name]);\n const remaining = this.claimCooldown(key, parseDuration(duration));\n if (remaining > 0) throw new GuardError((message ?? 'Aguarde {remaining} antes de usar novamente.')\n .replaceAll('{remaining}', `${Math.ceil(remaining / 1000)}s`));\n }\n\n async prepare(): Promise<void> {\n if (this.command.guildOnly) this.requireGuild();\n for (const permission of this.command.permissions ?? []) await this.requirePermission(permission);\n for (const permission of this.command.botPermissions ?? []) await this.requirePermission(permission, true);\n try {\n if (this.command.flags !== undefined) {\n const parsed = parseFlags(this.command.flags, this.tokens);\n for (const [name, value] of parsed.flags) this.flags.set(name, value);\n this.tokens.splice(0, this.tokens.length, ...parsed.tokens);\n }\n if (this.command.args?.length) for (const [name, value] of parseArguments(this.command.args, this.tokens)) this.args.set(name, value);\n } catch (error) {\n if (error instanceof GuardError) throw new GuardError(`${error.message}\\nUso: ${commandUsage(this.command, this.prefix)}`);\n throw error;\n }\n for (const command of this.lineage) {\n if (command.cooldown === undefined) continue;\n const key = JSON.stringify([this.guildID, this.message.channelID, this.authorID, command.name]);\n const remaining = this.claimCooldown(key, parseDuration(command.cooldown));\n if (remaining > 0) throw new GuardError(`Aguarde ${Math.ceil(remaining / 1000)}s antes de usar novamente.`);\n }\n }\n\n async moderate(action: ModerationAction, target: string, reason: string, options: ModerationOptions = {}): Promise<CaseRecord | undefined> {\n try {\n const record = await this.moderation.execute(action, target, reason, options);\n this.moderationApplied = true;\n if (record) this.lastCase = record;\n return record;\n } catch (error) {\n if (error instanceof PartialModerationError) this.moderationApplied = true;\n throw error;\n }\n }\n\n case(id: number): Promise<CaseRecord | undefined> { return this.cases.find(this.requireGuild(), id); }\n\n variable(scope: VariableScope, name: string, fallback: JsonValue = null): Promise<JsonValue> {\n return this.variables.get(scope, name, fallback);\n }\n\n setVariable(scope: VariableScope, name: string, value: JsonValue, options?: VariableOptions): Promise<void> {\n return this.variables.set(scope, name, value, options);\n }\n\n deleteVariable(scope: VariableScope, name: string): Promise<void> {\n return this.variables.delete(scope, name);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from 'node:crypto';\nimport type { IncomingMessage, Payload } from '../domain/messages.js';\nimport type { ScriptEventData } from '../domain/events.js';\nimport type { CaseRecord, ModerationAction, ModerationOptions } from '../domain/moderation.js';\nimport type { JsonValue, VariableScope } from '../domain/state.js';\nimport { parseDuration } from '../domain/values.js';\nimport type { Store } from '../ports/store.js';\nimport type { Transport } from '../ports/transport.js';\nimport type { NativeAccess } from '../ports/native.js';\nimport type { Resources } from '../ports/resources.js';\nimport type { Scheduler } from '../services/scheduler.js';\nimport { sendStreamAttachment } from '../services/attachments.js';\nimport type { StreamAttachmentOptions } from '../services/attachments.js';\nimport { bindHttp } from '../services/http.js';\nimport type { HttpService } from '../services/http.js';\nimport { AuthorizationService, requireGuild } from '../services/authorization.js';\nimport { CaseService } from '../services/cases.js';\nimport { ModerationService } from '../services/moderation.js';\nimport { VariableService } from '../services/variables.js';\nimport type { DataTransaction, VariableOptions } from '../services/variables.js';\nimport { NativeModeration } from '../services/native-moderation.js';\nimport { ScopedData } from '../services/native-data.js';\nimport type { NativeData } from '../services/native-data.js';\nimport { bindAuthorizedResources } from '../services/resource-authorization.js';\nimport { createCdn } from '../domain/cdn.js';\nimport { MemberService } from '../services/members.js';\nimport type { MusicManager } from '../services/music.js';\nimport type { NativeVoice } from '../ports/voice.js';\nimport type { CanvasConfig } from '../domain/canvas.js';\nimport type { CanvasRenderer } from '../ports/canvas.js';\nimport { CanvasService } from '../services/canvas.js';\nimport { GuardError, PartialModerationError, YuzuhaError } from '../shared/errors.js';\nimport { parseArguments, parseFlags, tokenize } from './arguments.js';\nimport { commandUsage } from './help.js';\nimport { ArgumentBag } from './typed-arguments.js';\nimport type { Command } from './definition.js';\n\nexport interface SendOptions { ttlMs?: number }\n\nexport interface ContextOptions {\n message: IncomingMessage;\n transport: Transport;\n store: Store;\n command: Command;\n lineage?: readonly Command[];\n prefix?: string;\n input?: string;\n cooldown: (key: string, duration: number) => number;\n now?: () => number;\n help?: () => string;\n native?: NativeAccess;\n resources?: Resources;\n scheduler?: Scheduler;\n http?: HttpService;\n music?: MusicManager;\n voice?: NativeVoice;\n canvas?: { renderer: CanvasRenderer; config?: CanvasConfig };\n signal?: AbortSignal;\n executionID?: string;\n event?: Readonly<ScriptEventData>;\n messageAvailable?: boolean;\n deleteLater?: (channelID: string, messageID: string, ttlMs: number) => void;\n cdn?: import('../domain/cdn.js').Cdn;\n disableResourceAuthorization?: boolean;\n actor?: { guildID: string; authorID: string };\n}\n\nexport class CommandContext {\n private executionKey?: string;\n private localVars?: Map<string, unknown>;\n private argumentsBag?: ArgumentBag;\n private flagsBag?: ArgumentBag;\n private nativeMod?: NativeModeration;\n private nativeData?: NativeData;\n private memberService?: MemberService;\n readonly signal: AbortSignal;\n readonly now: () => number;\n readonly tokens: string[];\n lastCase?: CaseRecord;\n private moderationApplied = false;\n private readonly sourceMessage: IncomingMessage;\n readonly event?: Readonly<ScriptEventData>;\n private readonly messageAvailable: boolean;\n private readonly deleteLaterFn?: (channelID: string, messageID: string, ttlMs: number) => void;\n private cdnService = createCdn();\n private disableResourceAuthorization = false;\n private readonly actor?: { guildID: string; authorID: string };\n readonly transport: Transport;\n readonly store: Store;\n readonly command: Command;\n readonly input: string;\n readonly help: () => string;\n private readonly claimCooldown: ContextOptions['cooldown'];\n private readonly lineage: readonly Command[];\n private readonly prefix: string;\n private authorizationService?: AuthorizationService;\n private moderationService?: ModerationService;\n private caseService?: CaseService;\n private variableService?: VariableService;\n private readonly scope: { guildID: string; authorID: string };\n private readonly native?: NativeAccess;\n private readonly nativeResources?: Resources;\n private readonly schedulerService?: Scheduler;\n private readonly httpService?: HttpService;\n private readonly musicService?: MusicManager;\n private readonly voiceService?: NativeVoice;\n private readonly canvasRenderer?: CanvasRenderer;\n private readonly canvasConfig?: CanvasConfig;\n private canvasService?: CanvasService;\n private scopedHttp?: HttpService;\n private scopedResources?: Resources;\n\n constructor(options: ContextOptions) {\n this.executionKey = options.executionID;\n this.sourceMessage = options.message;\n this.event = options.event ? Object.freeze({ ...options.event }) : undefined;\n this.messageAvailable = options.messageAvailable ?? true;\n this.actor = options.actor;\n this.scope = { guildID: this.guildID, authorID: this.authorID };\n this.transport = options.transport;\n this.store = options.store;\n this.deleteLaterFn = options.deleteLater;\n this.command = options.command;\n this.lineage = options.lineage ?? [options.command];\n this.prefix = options.prefix ?? '';\n this.input = options.input ?? '';\n try { this.tokens = tokenize(this.input); }\n catch (error) {\n if (error instanceof GuardError) throw new GuardError(`${error.message}\\nUso: ${commandUsage(this.command, this.prefix)}`, error.reason);\n throw error;\n }\n this.claimCooldown = options.cooldown;\n this.help = options.help ?? (() => '');\n this.native = options.native;\n this.schedulerService = options.scheduler;\n this.signal = options.signal ?? new AbortController().signal;\n this.now = options.now ?? Date.now;\n this.httpService = options.http;\n this.musicService = options.music;\n this.voiceService = options.voice;\n this.cdnService = options.cdn ?? createCdn();\n this.disableResourceAuthorization = options.disableResourceAuthorization === true;\n this.canvasRenderer = options.canvas?.renderer;\n this.canvasConfig = options.canvas?.config;\n this.nativeResources = options.resources;\n }\n\n private get authorization(): AuthorizationService { return this.authorizationService ??= new AuthorizationService(this.transport, this.scope); }\n private get moderation(): ModerationService { return this.moderationService ??= new ModerationService(this.transport, this.store, this.scope); }\n private get cases(): CaseService { return this.caseService ??= new CaseService(this.store); }\n private get variables(): VariableService { return this.variableService ??= new VariableService(this.store, this.scope, this.now); }\n get members(): MemberService { return this.memberService ??= new MemberService(this.transport, this.scope, () => this.resources.users); }\n get vars(): Map<string, unknown> { return this.localVars ??= new Map(); }\n get args(): ArgumentBag { return this.argumentsBag ??= new ArgumentBag(); }\n get flags(): ArgumentBag { return this.flagsBag ??= new ArgumentBag(); }\n async guildFeatures(): Promise<string[]> {\n const info = await this.resources.users.guild(this.requireGuild());\n if (!info.features) throw new YuzuhaError('NATIVE_UNAVAILABLE', 'O recurso de servidor não fornece features.');\n return [...info.features];\n }\n\n async leaveGuild(): Promise<void> {\n const guildID = await this.authorization.requireGuildDeparture();\n if (!this.resources.users.leaveGuild) throw new YuzuhaError('NATIVE_UNAVAILABLE', 'O recurso de servidor não implementa leaveGuild.');\n await this.resources.users.leaveGuild(guildID);\n }\n get cdn() { return this.cdnService; }\n\n get mod(): NativeModeration {\n return this.nativeMod ??= new NativeModeration(\n (action, target, reason, options) => this.moderate(action, target, reason, options),\n (action, targetID) => this.moderation.canModerate(action, targetID));\n }\n get data(): NativeData {\n return this.nativeData ??= Object.freeze({\n guild: new ScopedData(this.variables, 'guild'), user: new ScopedData(this.variables, 'user'),\n global: new ScopedData(this.variables, 'global'),\n userFor: (id: string) => new ScopedData(this.variables.forUser(id), 'user'),\n transaction: <T>(writer: (data: DataTransaction) => T) => this.variables.transaction(writer),\n });\n }\n\n get message(): IncomingMessage {\n if (!this.messageAvailable) throw new GuardError('Este evento não fornece uma mensagem completa. Use os campos de evento e um canal explícito.', 'GENERIC');\n return this.sourceMessage;\n }\n get authorID(): string { return this.actor?.authorID ?? this.sourceMessage.authorID; }\n get authorName(): string { return this.event?.userName ?? this.sourceMessage.authorName; }\n get channelID(): string { return this.sourceMessage.channelID; }\n get executionID(): string { return this.executionKey ??= randomUUID(); }\n get hasModerationEffect(): boolean { return this.moderationApplied; }\n get guildID(): string { return this.actor?.guildID ?? this.sourceMessage.guildID ?? ''; }\n get client(): NativeAccess['client'] {\n if (!this.native) throw new YuzuhaError('NATIVE_UNAVAILABLE', 'O client nativo não foi fornecido a este contexto.');\n return this.native.client;\n }\n get nativeMessage(): NativeAccess['message'] { return this.native?.message; }\n /** Recursos nativos usados por funções de script e comandos. */\n get resources(): Resources {\n if (!this.nativeResources) throw new YuzuhaError('NATIVE_UNAVAILABLE', 'Os recursos nativos não foram fornecidos a este contexto.');\n if (this.scopedResources) return this.scopedResources;\n const source = this.disableResourceAuthorization ? this.nativeResources\n : bindAuthorizedResources(this.nativeResources, this.transport, { guildID: this.guildID, authorID: this.authorID });\n const collectors = source.collectors;\n return this.scopedResources = { users: source.users, roles: source.roles, channels: source.channels,\n messages: source.messages, webhooks: source.webhooks, expressions: source.expressions,\n threads: source.threads, invites: source.invites, gateway: source.gateway,\n instance: source.instance, self: source.self, cache: source.cache, collectors: {\n awaitMessage: (channelID, input) => collectors.awaitMessage(channelID, { ...input,\n signal: input.signal ? AbortSignal.any([this.signal, input.signal]) : this.signal }),\n awaitReaction: (channelID, messageID, emojis, timeMs, userID, signal) => collectors.awaitReaction(\n channelID, messageID, emojis, timeMs, userID, signal ? AbortSignal.any([this.signal, signal]) : this.signal),\n collectMessages: (channelID, input) => collectors.collectMessages(channelID, { ...input,\n signal: input.signal ? AbortSignal.any([this.signal, input.signal]) : this.signal }),\n collectReactions: (channelID, input) => collectors.collectReactions(channelID, { ...input,\n signal: input.signal ? AbortSignal.any([this.signal, input.signal]) : this.signal }),\n } };\n }\n get scheduler(): Scheduler {\n if (!this.schedulerService) throw new YuzuhaError('NATIVE_UNAVAILABLE', 'O agendador não foi fornecido a este contexto.');\n return this.schedulerService;\n }\n get music(): MusicManager {\n if (!this.musicService) throw new YuzuhaError('NATIVE_UNAVAILABLE', 'O gerenciador de música não foi fornecido a este contexto.');\n return this.musicService;\n }\n get voice(): NativeVoice {\n if (!this.voiceService) throw new YuzuhaError('NATIVE_UNAVAILABLE', 'O serviço de voz não foi fornecido a este contexto.');\n return this.voiceService;\n }\n get canvas(): CanvasService {\n if (!this.canvasRenderer) throw new YuzuhaError('NATIVE_UNAVAILABLE', 'O renderer de Canvas não foi fornecido a este contexto.');\n return this.canvasService ??= new CanvasService({ renderer: this.canvasRenderer, ...this.canvasConfig,\n signal: this.signal, http: this.httpService ? this.http : undefined,\n channelID: this.channelID, messages: this.resources.messages });\n }\n get http(): HttpService {\n if (!this.httpService) throw new YuzuhaError('NATIVE_UNAVAILABLE', 'O serviço HTTP não foi fornecido a este contexto.');\n return this.scopedHttp ??= bindHttp(this.command.http ? this.httpService.withPolicy(this.command.http) : this.httpService, this.signal);\n }\n requireGuild(): string { return requireGuild(this.guildID); }\n\n assert(condition: unknown, message: string): void {\n if (!condition) throw new GuardError(message, 'GENERIC');\n }\n\n reply(payload: string | Payload, options?: SendOptions): Promise<string> {\n if (this.commandMessageDeleted) return this.send(payload, undefined, options);\n validateTtl(options);\n return this.sendVia(this.transport.reply(this.message, typeof payload === 'string' ? { content: payload } : payload),\n this.message.channelID, options);\n }\n\n send(payload: string | Payload, channelID = this.message.channelID, options?: SendOptions): Promise<string> {\n validateTtl(options);\n return this.sendVia(this.transport.send(channelID, typeof payload === 'string' ? { content: payload } : payload), channelID, options);\n }\n private commandMessageDeleted = false;\n async deleteCommandMessage(): Promise<void> {\n try { await this.transport.delete(this.message.channelID, this.message.id); }\n catch (error) {\n const candidate = error as { status?: number; code?: number | string } | null | undefined;\n if (candidate?.status !== 404 && candidate?.code !== 10008 && candidate?.code !== 'NOT_FOUND') throw error;\n }\n this.commandMessageDeleted = true;\n }\n private async sendVia(pending: Promise<string>, channelID: string, options?: SendOptions): Promise<string> {\n const ttlMs = options?.ttlMs;\n const id = await pending;\n if (ttlMs !== undefined) this.deleteLater(channelID, id, ttlMs);\n return id;\n }\n private deleteLater(channelID: string, messageID: string, ttlMs: number): void {\n this.deleteLaterFn?.(channelID, messageID, ttlMs);\n }\n\n sendStream(source: ReadableStream<Uint8Array>, options: StreamAttachmentOptions, channelID = this.message.channelID): Promise<string> {\n return sendStreamAttachment(this.resources.messages, channelID, source, options, this.signal);\n }\n\n edit(messageID: string, payload: string | Payload, channelID = this.message.channelID): Promise<void> {\n return this.transport.edit(channelID, messageID, typeof payload === 'string' ? { content: payload } : payload);\n }\n\n delete(messageID: string, channelID = this.message.channelID): Promise<void> {\n return this.transport.delete(channelID, messageID);\n }\n\n react(emoji: string, messageID = this.message.id, channelID = this.message.channelID): Promise<void> {\n return this.transport.react(channelID, messageID, emoji);\n }\n\n requirePermission(name: string, bot = false, message?: string): Promise<void> {\n return this.authorization.requirePermission(name, bot, message);\n }\n\n cooldown(duration: string | number, message?: string): void {\n const key = JSON.stringify([this.guildID, this.message.channelID, this.authorID, this.command.name]);\n const remaining = this.claimCooldown(key, parseDuration(duration));\n if (remaining > 0) throw new GuardError((message ?? 'Aguarde {remaining} antes de usar novamente.')\n .replaceAll('{remaining}', `${Math.ceil(remaining / 1000)}s`), 'COOLDOWN');\n }\n\n async prepare(): Promise<void> {\n if (this.command.guildOnly) this.requireGuild();\n for (const permission of this.command.permissions ?? []) await this.requirePermission(permission);\n for (const permission of this.command.botPermissions ?? []) await this.requirePermission(permission, true);\n try {\n if (this.command.flags !== undefined) {\n const parsed = parseFlags(this.command.flags, this.tokens);\n for (const [name, value] of parsed.flags) this.flags.set(name, value);\n this.tokens.splice(0, this.tokens.length, ...parsed.tokens);\n }\n if (this.command.args?.length) for (const [name, value] of parseArguments(this.command.args, this.tokens)) this.args.set(name, value);\n } catch (error) {\n if (error instanceof GuardError) throw new GuardError(`${error.message}\\nUso: ${commandUsage(this.command, this.prefix)}`, error.reason);\n throw error;\n }\n for (const command of this.lineage) {\n if (command.cooldown === undefined) continue;\n const key = JSON.stringify([this.guildID, this.message.channelID, this.authorID, command.name]);\n const remaining = this.claimCooldown(key, parseDuration(command.cooldown));\n if (remaining > 0) throw new GuardError(`Aguarde ${Math.ceil(remaining / 1000)}s antes de usar novamente.`, 'COOLDOWN');\n }\n }\n\n async moderate(action: ModerationAction, target: string, reason: string, options: ModerationOptions = {}): Promise<CaseRecord | undefined> {\n try {\n const record = await this.moderation.execute(action, target, reason, options);\n this.moderationApplied = true;\n if (record) this.lastCase = record;\n return record;\n } catch (error) {\n if (error instanceof PartialModerationError) this.moderationApplied = true;\n throw error;\n }\n }\n\n case(id: number): Promise<CaseRecord | undefined> { return this.cases.find(this.requireGuild(), id); }\n\n variable(scope: VariableScope, name: string, fallback: JsonValue = null): Promise<JsonValue> {\n return this.variables.get(scope, name, fallback);\n }\n\n setVariable(scope: VariableScope, name: string, value: JsonValue, options?: VariableOptions): Promise<void> {\n return this.variables.set(scope, name, value, options);\n }\n\n deleteVariable(scope: VariableScope, name: string): Promise<void> {\n return this.variables.delete(scope, name);\n }\n}\n\nfunction validateTtl(options?: SendOptions): void {\n const ttlMs = options?.ttlMs;\n if (ttlMs !== undefined && (!Number.isInteger(ttlMs) || ttlMs < 1_000 || ttlMs > 86_400_000)) {\n throw new GuardError('ttlMs deve ser um inteiro entre 1000 e 86400000.', 'INVALID_ARGUMENT');\n }\n}\n"]}
|
|
@@ -8,6 +8,7 @@ export interface ArgumentDefinition {
|
|
|
8
8
|
type?: 'string' | 'number' | 'integer' | 'user' | 'duration' | 'boolean';
|
|
9
9
|
required?: boolean;
|
|
10
10
|
rest?: boolean;
|
|
11
|
+
anywhere?: boolean;
|
|
11
12
|
choices?: readonly ArgumentValue[];
|
|
12
13
|
defaultValue?: ArgumentValue;
|
|
13
14
|
min?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/commands/definition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IACzE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IACnC,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,SAAS;QAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACxG,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC;AAC/G,MAAM,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAElG,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,IAAI,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACjC,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS,cAAc,EAAE,CAAC,SAAS,cAAc,GAAG,cAAc,IAAI,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,CAAA;CAAE,CAAC;AACzN,MAAM,MAAM,uBAAuB,CAAC,CAAC,SAAS,cAAc,GAAG,EAAE,EAAE,CAAC,SAAS,cAAc,GAAG,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC,GAAG;IAC5I,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,CAAC,CAAC;IACV,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACvE,CAAC;AAEF,wBAAgB,aAAa,CAAC,KAAK,CAAC,CAAC,SAAS,cAAc,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC,SAAS,cAAc,GAAG,EAAE,EAAE,OAAO,EAAE,uBAAuB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC;AACzJ,wBAAgB,aAAa,CAAC,CAAC,SAAS,OAAO,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/commands/definition.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definition.js","sourceRoot":"","sources":["../../src/commands/definition.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"definition.js","sourceRoot":"","sources":["../../src/commands/definition.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAsDpD,MAAM,UAAU,aAAa,CAAC,OAA0E;IACtG,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,OAAkB,CAAC;IAClI,OAAO,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACzH,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAqB,EAAE,CAAC;AACtJ,CAAC","sourcesContent":["import type { CommandContext } from './context.js';\nimport { argumentDefinitions } from './builders.js';\nimport type { ArgumentSchema } from './builders.js';\nimport type { ArgumentValue } from './arguments.js';\nimport type { TypedArguments } from './typed-arguments.js';\nimport type { HttpPolicy } from '../services/http.js';\n\nexport interface ArgumentDefinition {\n name: string;\n type?: 'string' | 'number' | 'integer' | 'user' | 'duration' | 'boolean';\n required?: boolean;\n rest?: boolean;\n anywhere?: boolean;\n choices?: readonly ArgumentValue[];\n defaultValue?: ArgumentValue;\n min?: number;\n max?: number;\n validators?: readonly { readonly check: (value: ArgumentValue) => boolean; readonly message: string }[];\n aliases?: readonly string[];\n description?: string;\n}\n\nexport type CommandCheck = (ctx: CommandContext) => boolean | string | void | Promise<boolean | string | void>;\nexport type CommandMiddleware = (ctx: CommandContext, next: () => Promise<void>) => Promise<void>;\n\nexport interface Command {\n name: string;\n aliases?: string[];\n description?: string;\n code?: string;\n run?: (ctx: CommandContext) => unknown | Promise<unknown>;\n guildOnly?: boolean;\n permissions?: string[];\n botPermissions?: string[];\n cooldown?: string | number;\n args?: ArgumentDefinition[];\n flags?: ArgumentDefinition[];\n subcommands?: Command[];\n examples?: string[];\n file?: string;\n hidden?: boolean;\n checks?: CommandCheck[];\n middleware?: CommandMiddleware[];\n http?: HttpPolicy;\n}\n\nexport type NativeCommandContext<S extends ArgumentSchema, F extends ArgumentSchema = ArgumentSchema> = Omit<CommandContext, 'args' | 'flags'> & { readonly args: TypedArguments<S>; readonly flags: TypedArguments<F> };\nexport type NativeCommandDefinition<S extends ArgumentSchema = {}, F extends ArgumentSchema = {}> = Omit<Command, 'args' | 'flags' | 'run'> & {\n args?: S;\n flags?: F;\n run?: (ctx: NativeCommandContext<S, F>) => unknown | Promise<unknown>;\n};\n\nexport function defineCommand<const S extends ArgumentSchema = {}, const F extends ArgumentSchema = {}>(command: NativeCommandDefinition<S, F>): Command;\nexport function defineCommand<T extends Command>(command: T): T;\nexport function defineCommand(command: Command | NativeCommandDefinition<ArgumentSchema, ArgumentSchema>): Command {\n if ((!command.args || Array.isArray(command.args)) && (!command.flags || Array.isArray(command.flags))) return command as Command;\n return { ...command, args: command.args && (Array.isArray(command.args) ? command.args : argumentDefinitions(command.args)),\n flags: command.flags && (Array.isArray(command.flags) ? command.flags : argumentDefinitions(command.flags)), run: command.run as Command['run'] };\n}\n"]}
|
|
@@ -3,7 +3,7 @@ export class ArgumentBag extends Map {
|
|
|
3
3
|
require(name) {
|
|
4
4
|
const value = this.get(name);
|
|
5
5
|
if (value === undefined)
|
|
6
|
-
throw new GuardError(`Informe o argumento ${name}
|
|
6
|
+
throw new GuardError(`Informe o argumento ${name}.`, 'INVALID_ARGUMENT');
|
|
7
7
|
return value;
|
|
8
8
|
}
|
|
9
9
|
string(name) { return this.typed(name, 'string'); }
|
|
@@ -12,7 +12,7 @@ export class ArgumentBag extends Map {
|
|
|
12
12
|
typed(name, type) {
|
|
13
13
|
const value = this.get(name);
|
|
14
14
|
if (value !== undefined && typeof value !== type)
|
|
15
|
-
throw new GuardError(`O argumento ${name} deve ser ${type}
|
|
15
|
+
throw new GuardError(`O argumento ${name} deve ser ${type}.`, 'INVALID_ARGUMENT');
|
|
16
16
|
return value;
|
|
17
17
|
}
|
|
18
18
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typed-arguments.js","sourceRoot":"","sources":["../../src/commands/typed-arguments.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,OAAO,WAAY,SAAQ,GAA0B;IACzD,OAAO,CAAC,IAAY;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,IAAI,UAAU,CAAC,uBAAuB,IAAI,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"typed-arguments.js","sourceRoot":"","sources":["../../src/commands/typed-arguments.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,OAAO,WAAY,SAAQ,GAA0B;IACzD,OAAO,CAAC,IAAY;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,IAAI,UAAU,CAAC,uBAAuB,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC;QAClG,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,CAAC,IAAY,IAAwB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC/E,MAAM,CAAC,IAAY,IAAwB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC/E,OAAO,CAAC,IAAY,IAAyB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IAE1E,KAAK,CAA4C,IAAY,EAAE,IAAO;QAE5E,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,IAAI;YAAE,MAAM,IAAI,UAAU,CAAC,eAAe,IAAI,aAAa,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC;QACpI,OAAO,KAA0F,CAAC;IACpG,CAAC;CACF","sourcesContent":["import type { ArgumentValue } from './arguments.js';\nimport type { ArgumentSchema, InferArgument } from './builders.js';\nimport { GuardError } from '../shared/errors.js';\n\nexport class ArgumentBag extends Map<string, ArgumentValue> {\n require(name: string): ArgumentValue {\n const value = this.get(name);\n if (value === undefined) throw new GuardError(`Informe o argumento ${name}.`, 'INVALID_ARGUMENT');\n return value;\n }\n\n string(name: string): string | undefined { return this.typed(name, 'string'); }\n number(name: string): number | undefined { return this.typed(name, 'number'); }\n boolean(name: string): boolean | undefined { return this.typed(name, 'boolean'); }\n\n private typed<T extends 'string' | 'number' | 'boolean'>(name: string, type: T):\n (T extends 'string' ? string : T extends 'number' ? number : boolean) | undefined {\n const value = this.get(name);\n if (value !== undefined && typeof value !== type) throw new GuardError(`O argumento ${name} deve ser ${type}.`, 'INVALID_ARGUMENT');\n return value as (T extends 'string' ? string : T extends 'number' ? number : boolean) | undefined;\n }\n}\n\nexport type TypedArguments<S extends ArgumentSchema> = Omit<ArgumentBag, 'get' | 'require'> & {\n get<K extends Extract<keyof S, string>>(name: K): InferArgument<S[K]>;\n require<K extends Extract<keyof S, string>>(name: K): Exclude<InferArgument<S[K]>, undefined>;\n};\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { CdnUrlOptions } from '@fluxerjs/core';
|
|
2
|
+
export declare function fixAnimatedAssetUrl(url: string | null): string | null;
|
|
3
|
+
export interface Cdn {
|
|
4
|
+
avatar(userID: string, hash: string | null, options?: CdnUrlOptions): string | null;
|
|
5
|
+
banner(userID: string, hash: string | null, options?: CdnUrlOptions): string | null;
|
|
6
|
+
guildIcon(guildID: string, hash: string | null, options?: Pick<CdnUrlOptions, 'size' | 'mediaBase'>): string | null;
|
|
7
|
+
guildBanner(guildID: string, hash: string | null, options?: Pick<CdnUrlOptions, 'size' | 'mediaBase'>): string | null;
|
|
8
|
+
guildSplash(guildID: string, hash: string | null, options?: Pick<CdnUrlOptions, 'size' | 'mediaBase'>): string | null;
|
|
9
|
+
memberAvatar(guildID: string, userID: string, hash: string | null, options?: CdnUrlOptions): string | null;
|
|
10
|
+
memberBanner(guildID: string, userID: string, hash: string | null, options?: CdnUrlOptions): string | null;
|
|
11
|
+
emoji(id: string, options?: CdnUrlOptions & {
|
|
12
|
+
animated?: boolean;
|
|
13
|
+
}): string;
|
|
14
|
+
sticker(id: string, options?: CdnUrlOptions & {
|
|
15
|
+
animated?: boolean;
|
|
16
|
+
}): string;
|
|
17
|
+
asset(url: string, options?: {
|
|
18
|
+
size?: number;
|
|
19
|
+
format?: 'png' | 'jpg' | 'jpeg' | 'webp' | 'gif';
|
|
20
|
+
}): string;
|
|
21
|
+
}
|
|
22
|
+
export declare function createCdn(mediaBase?: string): Cdn;
|
|
23
|
+
//# sourceMappingURL=cdn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdn.d.ts","sourceRoot":"","sources":["../../src/domain/cdn.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAErE;AAID,MAAM,WAAW,GAAG;IAClB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAAC;IACpF,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAAC;IACpF,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,WAAW,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;IACpH,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,WAAW,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;IACtH,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,WAAW,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;IACtH,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAAC;IAC3G,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAAC;IAC3G,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,MAAM,CAAC;IAC5E,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,MAAM,CAAC;IAC9E,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAA;KAAE,GAAG,MAAM,CAAC;CAC3G;AAED,wBAAgB,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,GAAG,CA8BjD"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { GuardError, YuzuhaError } from '../shared/errors.js';
|
|
2
|
+
import { cdnAvatarURL, cdnBannerURL, cdnEmojiURL, cdnGuildAssetURL, cdnMemberAvatarURL, cdnMemberBannerURL, cdnStickerURL } from '@fluxerjs/core';
|
|
3
|
+
export function fixAnimatedAssetUrl(url) {
|
|
4
|
+
return url?.replace(/\/(a_[^/.]+)\.png(\?|$)/, '/$1.gif$2') ?? null;
|
|
5
|
+
}
|
|
6
|
+
const VALID_SIZES = new Set([16, 32, 64, 128, 256, 512, 1024, 2048, 4096]);
|
|
7
|
+
export function createCdn(mediaBase) {
|
|
8
|
+
if (mediaBase !== undefined && !/^https:\/\//.test(mediaBase)) {
|
|
9
|
+
throw new YuzuhaError('OPTIONS', 'cdn.mediaBase deve ser uma URL https.');
|
|
10
|
+
}
|
|
11
|
+
const base = (options) => mediaBase === undefined ? options : { ...options, mediaBase };
|
|
12
|
+
return {
|
|
13
|
+
avatar: (userID, hash, options) => fixAnimatedAssetUrl(cdnAvatarURL(userID, hash, base(options))),
|
|
14
|
+
banner: (userID, hash, options) => fixAnimatedAssetUrl(cdnBannerURL(userID, hash, base(options))),
|
|
15
|
+
guildIcon: (guildID, hash, options) => fixAnimatedAssetUrl(cdnGuildAssetURL('icons', guildID, hash, base(options))),
|
|
16
|
+
guildBanner: (guildID, hash, options) => fixAnimatedAssetUrl(cdnGuildAssetURL('banners', guildID, hash, base(options))),
|
|
17
|
+
guildSplash: (guildID, hash, options) => fixAnimatedAssetUrl(cdnGuildAssetURL('splashes', guildID, hash, base(options))),
|
|
18
|
+
memberAvatar: (guildID, userID, hash, options) => fixAnimatedAssetUrl(cdnMemberAvatarURL(guildID, userID, hash, base(options))),
|
|
19
|
+
memberBanner: (guildID, userID, hash, options) => fixAnimatedAssetUrl(cdnMemberBannerURL(guildID, userID, hash, base(options))),
|
|
20
|
+
emoji: (id, options) => cdnEmojiURL(id, options?.animated ?? false, base(options)),
|
|
21
|
+
sticker: (id, options) => cdnStickerURL(id, options?.animated ?? false, base(options)),
|
|
22
|
+
asset: (url, options = {}) => {
|
|
23
|
+
if (options.size !== undefined && !VALID_SIZES.has(options.size))
|
|
24
|
+
throw new GuardError('size deve ser potência de dois entre 16 e 4096.', 'INVALID_ARGUMENT');
|
|
25
|
+
let out = url;
|
|
26
|
+
if (options.format)
|
|
27
|
+
out = out.replace(/\.(png|jpg|jpeg|webp|gif)(\?|$)/, `.${options.format}$2`);
|
|
28
|
+
if (options.size !== undefined) {
|
|
29
|
+
const [main = '', fragment] = out.split('#', 2);
|
|
30
|
+
const sized = /[?&]size=\d+/.test(main) ? main.replace(/([?&]size=)\d+/, `$1${options.size}`)
|
|
31
|
+
: main + (main.includes('?') ? '&' : '?') + `size=${options.size}`;
|
|
32
|
+
out = sized + (fragment !== undefined ? '#' + fragment : '');
|
|
33
|
+
}
|
|
34
|
+
return fixAnimatedAssetUrl(out);
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=cdn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdn.js","sourceRoot":"","sources":["../../src/domain/cdn.ts"],"names":[],"mappings":"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","sourcesContent":["import { GuardError, YuzuhaError } from '../shared/errors.js';\nimport { cdnAvatarURL, cdnBannerURL, cdnEmojiURL, cdnGuildAssetURL,\n cdnMemberAvatarURL, cdnMemberBannerURL, cdnStickerURL } from '@fluxerjs/core';\nimport type { CdnUrlOptions } from '@fluxerjs/core';\n\nexport function fixAnimatedAssetUrl(url: string | null): string | null {\n return url?.replace(/\\/(a_[^/.]+)\\.png(\\?|$)/, '/$1.gif$2') ?? null;\n}\n\nconst VALID_SIZES = new Set([16, 32, 64, 128, 256, 512, 1024, 2048, 4096]);\n\nexport interface Cdn {\n avatar(userID: string, hash: string | null, options?: CdnUrlOptions): string | null;\n banner(userID: string, hash: string | null, options?: CdnUrlOptions): string | null;\n guildIcon(guildID: string, hash: string | null, options?: Pick<CdnUrlOptions, 'size' | 'mediaBase'>): string | null;\n guildBanner(guildID: string, hash: string | null, options?: Pick<CdnUrlOptions, 'size' | 'mediaBase'>): string | null;\n guildSplash(guildID: string, hash: string | null, options?: Pick<CdnUrlOptions, 'size' | 'mediaBase'>): string | null;\n memberAvatar(guildID: string, userID: string, hash: string | null, options?: CdnUrlOptions): string | null;\n memberBanner(guildID: string, userID: string, hash: string | null, options?: CdnUrlOptions): string | null;\n emoji(id: string, options?: CdnUrlOptions & { animated?: boolean }): string;\n sticker(id: string, options?: CdnUrlOptions & { animated?: boolean }): string;\n asset(url: string, options?: { size?: number; format?: 'png' | 'jpg' | 'jpeg' | 'webp' | 'gif' }): string;\n}\n\nexport function createCdn(mediaBase?: string): Cdn {\n if (mediaBase !== undefined && !/^https:\\/\\//.test(mediaBase)) {\n throw new YuzuhaError('OPTIONS', 'cdn.mediaBase deve ser uma URL https.');\n }\n const base = <T extends { mediaBase?: string }>(options: T | undefined): T | undefined =>\n mediaBase === undefined ? options : { ...options, mediaBase } as T;\n return {\n avatar: (userID, hash, options) => fixAnimatedAssetUrl(cdnAvatarURL(userID, hash, base(options))),\n banner: (userID, hash, options) => fixAnimatedAssetUrl(cdnBannerURL(userID, hash, base(options))),\n guildIcon: (guildID, hash, options) => fixAnimatedAssetUrl(cdnGuildAssetURL('icons', guildID, hash, base(options))),\n guildBanner: (guildID, hash, options) => fixAnimatedAssetUrl(cdnGuildAssetURL('banners', guildID, hash, base(options))),\n guildSplash: (guildID, hash, options) => fixAnimatedAssetUrl(cdnGuildAssetURL('splashes', guildID, hash, base(options))),\n memberAvatar: (guildID, userID, hash, options) => fixAnimatedAssetUrl(cdnMemberAvatarURL(guildID, userID, hash, base(options))),\n memberBanner: (guildID, userID, hash, options) => fixAnimatedAssetUrl(cdnMemberBannerURL(guildID, userID, hash, base(options))),\n emoji: (id, options) => cdnEmojiURL(id, options?.animated ?? false, base(options)),\n sticker: (id, options) => cdnStickerURL(id, options?.animated ?? false, base(options)),\n asset: (url, options = {}) => {\n if (options.size !== undefined && !VALID_SIZES.has(options.size))\n throw new GuardError('size deve ser potência de dois entre 16 e 4096.', 'INVALID_ARGUMENT');\n let out = url;\n if (options.format) out = out.replace(/\\.(png|jpg|jpeg|webp|gif)(\\?|$)/, `.${options.format}$2`);\n if (options.size !== undefined) {\n const [main = '', fragment] = out.split('#', 2);\n const sized = /[?&]size=\\d+/.test(main) ? main.replace(/([?&]size=)\\d+/, `$1${options.size}`)\n : main + (main.includes('?') ? '&' : '?') + `size=${options.size}`;\n out = sized + (fragment !== undefined ? '#' + fragment : '');\n }\n return fixAnimatedAssetUrl(out)!;\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export type ResolvedLabel = {
|
|
2
|
+
id: string;
|
|
3
|
+
label: string;
|
|
4
|
+
};
|
|
5
|
+
export type ResolvedMember = {
|
|
6
|
+
status: 'found';
|
|
7
|
+
id: string;
|
|
8
|
+
label: string;
|
|
9
|
+
mention: string;
|
|
10
|
+
via: 'mention' | 'id' | 'exact' | 'prefix';
|
|
11
|
+
} | {
|
|
12
|
+
status: 'ambiguous';
|
|
13
|
+
candidates: ResolvedLabel[];
|
|
14
|
+
} | {
|
|
15
|
+
status: 'missing';
|
|
16
|
+
query: string;
|
|
17
|
+
};
|
|
18
|
+
export type ResolvedBan = {
|
|
19
|
+
status: 'found';
|
|
20
|
+
id: string;
|
|
21
|
+
label: string;
|
|
22
|
+
reason: string | null;
|
|
23
|
+
via: 'mention' | 'id' | 'exact' | 'prefix';
|
|
24
|
+
} | {
|
|
25
|
+
status: 'ambiguous';
|
|
26
|
+
candidates: ResolvedLabel[];
|
|
27
|
+
} | {
|
|
28
|
+
status: 'missing';
|
|
29
|
+
query: string;
|
|
30
|
+
};
|
|
31
|
+
export type ResolvedUser = {
|
|
32
|
+
status: 'found';
|
|
33
|
+
id: string;
|
|
34
|
+
label: string;
|
|
35
|
+
mention: string;
|
|
36
|
+
via: 'mention' | 'id';
|
|
37
|
+
} | {
|
|
38
|
+
status: 'missing';
|
|
39
|
+
query: string;
|
|
40
|
+
};
|
|
41
|
+
export declare function normalize(query: string): string;
|
|
42
|
+
export declare function mentionID(query: string): string | undefined;
|
|
43
|
+
export declare function matchCandidates<T extends {
|
|
44
|
+
id: string;
|
|
45
|
+
names: (string | null | undefined)[];
|
|
46
|
+
}>(query: string, items: T[]): {
|
|
47
|
+
kind: 'exact' | 'prefix';
|
|
48
|
+
items: T[];
|
|
49
|
+
} | undefined;
|
|
50
|
+
export declare function rankCandidates(candidates: {
|
|
51
|
+
id: string;
|
|
52
|
+
label: string;
|
|
53
|
+
}[]): {
|
|
54
|
+
id: string;
|
|
55
|
+
label: string;
|
|
56
|
+
}[];
|
|
57
|
+
export declare function cleanReason(text: string, options?: {
|
|
58
|
+
maxLength?: number;
|
|
59
|
+
}): string;
|
|
60
|
+
//# sourceMappingURL=resolvers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolvers.d.ts","sourceRoot":"","sources":["../../src/domain/resolvers.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAC1D,MAAM,MAAM,cAAc,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,SAAS,GAAG,IAAI,GAAG,OAAO,GAAG,QAAQ,CAAA;CAAE,GACpI;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,aAAa,EAAE,CAAA;CAAE,GACpD;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AACzC,MAAM,MAAM,WAAW,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,GAAG,EAAE,SAAS,GAAG,IAAI,GAAG,OAAO,GAAG,QAAQ,CAAA;CAAE,GACvI;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,aAAa,EAAE,CAAA;CAAE,GACpD;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AACzC,MAAM,MAAM,YAAY,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAAA;CAAE,GAC7G;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG3D;AAED,wBAAgB,eAAe,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,CAAA;CAAE,EAC1F,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG;IAAE,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IAAC,KAAK,EAAE,CAAC,EAAE,CAAA;CAAE,GAAG,SAAS,CAQnF;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,CAE3G;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,CAKtF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { GuardError, YuzuhaError } from '../shared/errors.js';
|
|
2
|
+
export function normalize(query) {
|
|
3
|
+
return query.normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase();
|
|
4
|
+
}
|
|
5
|
+
export function mentionID(query) {
|
|
6
|
+
const match = /^<@!?(\d+)>$/.exec(query.trim()) ?? /^(\d+)$/.exec(query.trim());
|
|
7
|
+
return match?.[1];
|
|
8
|
+
}
|
|
9
|
+
export function matchCandidates(query, items) {
|
|
10
|
+
const wanted = normalize(query);
|
|
11
|
+
if (!wanted)
|
|
12
|
+
return;
|
|
13
|
+
const exact = items.filter(item => item.names.some(name => name && normalize(name) === wanted));
|
|
14
|
+
if (exact.length)
|
|
15
|
+
return { kind: 'exact', items: exact };
|
|
16
|
+
const prefix = items.filter(item => item.names.some(name => name && normalize(name).startsWith(wanted)));
|
|
17
|
+
if (prefix.length)
|
|
18
|
+
return { kind: 'prefix', items: prefix };
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
export function rankCandidates(candidates) {
|
|
22
|
+
return [...candidates].sort((a, b) => a.label.localeCompare(b.label) || (a.id < b.id ? -1 : 1)).slice(0, 5);
|
|
23
|
+
}
|
|
24
|
+
export function cleanReason(text, options = {}) {
|
|
25
|
+
const maxLength = options.maxLength ?? 512;
|
|
26
|
+
if (!Number.isSafeInteger(maxLength) || maxLength < 1)
|
|
27
|
+
throw new YuzuhaError('REASON_LIMIT', 'maxLength deve ser inteiro positivo.');
|
|
28
|
+
const cleaned = text.replace(/<@[!&]?\d+>|<#\d+>/g, ' ').replace(/\s+/g, ' ').trim();
|
|
29
|
+
return cleaned.length > maxLength ? cleaned.slice(0, maxLength) : cleaned;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=resolvers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolvers.js","sourceRoot":"","sources":["../../src/domain/resolvers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAY9D,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAChF,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,eAAe,CAC3B,KAAa,EAAE,KAAU;IAC3B,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC;IAChG,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACzD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACzG,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC5D,OAAO;AACT,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,UAA2C;IACxE,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9G,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,UAAkC,EAAE;IAC5E,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,GAAG,CAAC;IAC3C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC;QAAE,MAAM,IAAI,WAAW,CAAC,cAAc,EAAE,sCAAsC,CAAC,CAAC;IACrI,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACrF,OAAO,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AAC5E,CAAC","sourcesContent":["import { GuardError, YuzuhaError } from '../shared/errors.js';\n\nexport type ResolvedLabel = { id: string; label: string };\nexport type ResolvedMember = { status: 'found'; id: string; label: string; mention: string; via: 'mention' | 'id' | 'exact' | 'prefix' }\n | { status: 'ambiguous'; candidates: ResolvedLabel[] }\n | { status: 'missing'; query: string };\nexport type ResolvedBan = { status: 'found'; id: string; label: string; reason: string | null; via: 'mention' | 'id' | 'exact' | 'prefix' }\n | { status: 'ambiguous'; candidates: ResolvedLabel[] }\n | { status: 'missing'; query: string };\nexport type ResolvedUser = { status: 'found'; id: string; label: string; mention: string; via: 'mention' | 'id' }\n | { status: 'missing'; query: string };\n\nexport function normalize(query: string): string {\n return query.normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase();\n}\n\nexport function mentionID(query: string): string | undefined {\n const match = /^<@!?(\\d+)>$/.exec(query.trim()) ?? /^(\\d+)$/.exec(query.trim());\n return match?.[1];\n}\n\nexport function matchCandidates<T extends { id: string; names: (string | null | undefined)[] }>(\n query: string, items: T[]): { kind: 'exact' | 'prefix'; items: T[] } | undefined {\n const wanted = normalize(query);\n if (!wanted) return;\n const exact = items.filter(item => item.names.some(name => name && normalize(name) === wanted));\n if (exact.length) return { kind: 'exact', items: exact };\n const prefix = items.filter(item => item.names.some(name => name && normalize(name).startsWith(wanted)));\n if (prefix.length) return { kind: 'prefix', items: prefix };\n return;\n}\n\nexport function rankCandidates(candidates: { id: string; label: string }[]): { id: string; label: string }[] {\n return [...candidates].sort((a, b) => a.label.localeCompare(b.label) || (a.id < b.id ? -1 : 1)).slice(0, 5);\n}\n\nexport function cleanReason(text: string, options: { maxLength?: number } = {}): string {\n const maxLength = options.maxLength ?? 512;\n if (!Number.isSafeInteger(maxLength) || maxLength < 1) throw new YuzuhaError('REASON_LIMIT', 'maxLength deve ser inteiro positivo.');\n const cleaned = text.replace(/<@[!&]?\\d+>|<#\\d+>/g, ' ').replace(/\\s+/g, ' ').trim();\n return cleaned.length > maxLength ? cleaned.slice(0, maxLength) : cleaned;\n}\n"]}
|
package/dist/domain/values.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
export declare function userID(value: string): string;
|
|
2
2
|
export declare function parseDuration(value: string | number): number;
|
|
3
|
+
export declare const MAX_TIMEOUT_MS: number;
|
|
4
|
+
export declare function formatDuration(ms: number): string;
|
|
3
5
|
//# sourceMappingURL=values.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"values.d.ts","sourceRoot":"","sources":["../../src/domain/values.ts"],"names":[],"mappings":"AAEA,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAI5C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAW5D"}
|
|
1
|
+
{"version":3,"file":"values.d.ts","sourceRoot":"","sources":["../../src/domain/values.ts"],"names":[],"mappings":"AAEA,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAI5C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAW5D;AAGD,eAAO,MAAM,cAAc,QAA2B,CAAC;AAUvD,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAcjD"}
|