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.
Files changed (138) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +3 -3
  3. package/VERSIONING.md +18 -5
  4. package/dist/commands/arguments.d.ts.map +1 -1
  5. package/dist/commands/arguments.js +40 -13
  6. package/dist/commands/arguments.js.map +1 -1
  7. package/dist/commands/builders.d.ts +1 -0
  8. package/dist/commands/builders.d.ts.map +1 -1
  9. package/dist/commands/builders.js +5 -0
  10. package/dist/commands/builders.js.map +1 -1
  11. package/dist/commands/context-like.d.ts +4 -0
  12. package/dist/commands/context-like.d.ts.map +1 -0
  13. package/dist/commands/context-like.js +2 -0
  14. package/dist/commands/context-like.js.map +1 -0
  15. package/dist/commands/context.d.ts +16 -2
  16. package/dist/commands/context.d.ts.map +1 -1
  17. package/dist/commands/context.js +53 -11
  18. package/dist/commands/context.js.map +1 -1
  19. package/dist/commands/definition.d.ts +1 -0
  20. package/dist/commands/definition.d.ts.map +1 -1
  21. package/dist/commands/definition.js.map +1 -1
  22. package/dist/commands/typed-arguments.js +2 -2
  23. package/dist/commands/typed-arguments.js.map +1 -1
  24. package/dist/domain/cdn.d.ts +23 -0
  25. package/dist/domain/cdn.d.ts.map +1 -0
  26. package/dist/domain/cdn.js +38 -0
  27. package/dist/domain/cdn.js.map +1 -0
  28. package/dist/domain/resolvers.d.ts +60 -0
  29. package/dist/domain/resolvers.d.ts.map +1 -0
  30. package/dist/domain/resolvers.js +31 -0
  31. package/dist/domain/resolvers.js.map +1 -0
  32. package/dist/domain/values.d.ts +2 -0
  33. package/dist/domain/values.d.ts.map +1 -1
  34. package/dist/domain/values.js +26 -1
  35. package/dist/domain/values.js.map +1 -1
  36. package/dist/framework/bot.d.ts +5 -0
  37. package/dist/framework/bot.d.ts.map +1 -1
  38. package/dist/framework/bot.js +44 -9
  39. package/dist/framework/bot.js.map +1 -1
  40. package/dist/framework/logging.d.ts +4 -1
  41. package/dist/framework/logging.d.ts.map +1 -1
  42. package/dist/framework/logging.js.map +1 -1
  43. package/dist/framework/options.d.ts +12 -0
  44. package/dist/framework/options.d.ts.map +1 -1
  45. package/dist/framework/options.js.map +1 -1
  46. package/dist/index.d.ts +11 -0
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +7 -0
  49. package/dist/index.js.map +1 -1
  50. package/dist/infrastructure/fluxer/resources/channels.d.ts.map +1 -1
  51. package/dist/infrastructure/fluxer/resources/channels.js +62 -8
  52. package/dist/infrastructure/fluxer/resources/channels.js.map +1 -1
  53. package/dist/infrastructure/fluxer/resources/expressions.d.ts.map +1 -1
  54. package/dist/infrastructure/fluxer/resources/expressions.js +2 -1
  55. package/dist/infrastructure/fluxer/resources/expressions.js.map +1 -1
  56. package/dist/infrastructure/fluxer/resources/messages.d.ts +2 -1
  57. package/dist/infrastructure/fluxer/resources/messages.d.ts.map +1 -1
  58. package/dist/infrastructure/fluxer/resources/messages.js +16 -7
  59. package/dist/infrastructure/fluxer/resources/messages.js.map +1 -1
  60. package/dist/infrastructure/fluxer/resources/users.d.ts +1 -1
  61. package/dist/infrastructure/fluxer/resources/users.d.ts.map +1 -1
  62. package/dist/infrastructure/fluxer/resources/users.js +41 -9
  63. package/dist/infrastructure/fluxer/resources/users.js.map +1 -1
  64. package/dist/infrastructure/fluxer/resources.d.ts +3 -1
  65. package/dist/infrastructure/fluxer/resources.d.ts.map +1 -1
  66. package/dist/infrastructure/fluxer/resources.js +8 -3
  67. package/dist/infrastructure/fluxer/resources.js.map +1 -1
  68. package/dist/infrastructure/fluxer/transport.d.ts +4 -1
  69. package/dist/infrastructure/fluxer/transport.d.ts.map +1 -1
  70. package/dist/infrastructure/fluxer/transport.js +41 -14
  71. package/dist/infrastructure/fluxer/transport.js.map +1 -1
  72. package/dist/ports/resources/channels.d.ts +20 -1
  73. package/dist/ports/resources/channels.d.ts.map +1 -1
  74. package/dist/ports/resources/channels.js.map +1 -1
  75. package/dist/ports/resources/users.d.ts +5 -0
  76. package/dist/ports/resources/users.d.ts.map +1 -1
  77. package/dist/ports/resources/users.js.map +1 -1
  78. package/dist/services/authorization.js +9 -9
  79. package/dist/services/authorization.js.map +1 -1
  80. package/dist/services/members.d.ts +5 -0
  81. package/dist/services/members.d.ts.map +1 -1
  82. package/dist/services/members.js +75 -5
  83. package/dist/services/members.js.map +1 -1
  84. package/dist/services/moderation.js +9 -9
  85. package/dist/services/moderation.js.map +1 -1
  86. package/dist/services/resource-authorization.d.ts.map +1 -1
  87. package/dist/services/resource-authorization.js +31 -17
  88. package/dist/services/resource-authorization.js.map +1 -1
  89. package/dist/services/retry.d.ts +17 -0
  90. package/dist/services/retry.d.ts.map +1 -0
  91. package/dist/services/retry.js +67 -0
  92. package/dist/services/retry.js.map +1 -0
  93. package/dist/shared/errors.d.ts +4 -1
  94. package/dist/shared/errors.d.ts.map +1 -1
  95. package/dist/shared/errors.js +8 -1
  96. package/dist/shared/errors.js.map +1 -1
  97. package/dist/testing.d.ts +8 -0
  98. package/dist/testing.d.ts.map +1 -1
  99. package/dist/testing.js +24 -4
  100. package/dist/testing.js.map +1 -1
  101. package/docs/API.md +11 -0
  102. package/docs/CANVAS.md +1 -1
  103. package/docs/FRAMEWORK.md +13 -0
  104. package/docs/IMAGES.md +9 -0
  105. package/docs/NATIVE.md +49 -1
  106. package/docs/PARITY-MATRIX.md +31 -32
  107. package/docs/QUICKSTART.md +2 -2
  108. package/docs/README.md +1 -1
  109. package/docs/TESTING.md +16 -0
  110. package/package.json +1 -1
  111. package/src/commands/arguments.ts +35 -13
  112. package/src/commands/builders.ts +4 -0
  113. package/src/commands/context-like.ts +7 -0
  114. package/src/commands/context.ts +56 -11
  115. package/src/commands/definition.ts +1 -0
  116. package/src/commands/typed-arguments.ts +2 -2
  117. package/src/domain/cdn.ts +55 -0
  118. package/src/domain/resolvers.ts +42 -0
  119. package/src/domain/values.ts +28 -1
  120. package/src/framework/bot.ts +41 -10
  121. package/src/framework/logging.ts +5 -1
  122. package/src/framework/options.ts +4 -0
  123. package/src/index.ts +13 -0
  124. package/src/infrastructure/fluxer/resources/channels.ts +53 -8
  125. package/src/infrastructure/fluxer/resources/expressions.ts +2 -1
  126. package/src/infrastructure/fluxer/resources/messages.ts +17 -6
  127. package/src/infrastructure/fluxer/resources/users.ts +38 -9
  128. package/src/infrastructure/fluxer/resources.ts +4 -3
  129. package/src/infrastructure/fluxer/transport.ts +42 -13
  130. package/src/ports/resources/channels.ts +11 -1
  131. package/src/ports/resources/users.ts +3 -0
  132. package/src/services/authorization.ts +9 -9
  133. package/src/services/members.ts +70 -5
  134. package/src/services/moderation.ts +9 -9
  135. package/src/services/resource-authorization.ts +31 -17
  136. package/src/services/retry.ts +74 -0
  137. package/src/shared/errors.ts +10 -1
  138. package/src/testing.ts +28 -4
@@ -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 = bindAuthorizedResources(this.nativeResources, this.transport, { guildID: this.guildID, authorID: this.authorID }), collectors = source.collectors;
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
- return this.transport.reply(this.message, typeof payload === 'string' ? { content: payload } : payload);
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
- return this.transport.send(channelID, typeof payload === 'string' ? { content: payload } : payload);
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":"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"}
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;AAqDpD,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 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"]}
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;QAC9E,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,CAAC,CAAC;QAChH,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}.`);\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}.`);\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"]}
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"]}
@@ -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"}