discordthing 0.1.2 → 0.2.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 (49) hide show
  1. package/build/bot.d.ts +15 -19
  2. package/build/bot.js +29 -140
  3. package/build/commands/command.d.ts +26 -7
  4. package/build/commands/command.js +71 -37
  5. package/build/commands/context.d.ts +23 -0
  6. package/build/commands/context.js +75 -0
  7. package/build/commands/diff.js +0 -1
  8. package/build/commands/index.d.ts +3 -1
  9. package/build/commands/index.js +0 -1
  10. package/build/commands/manager.d.ts +64 -0
  11. package/build/commands/manager.js +138 -0
  12. package/build/commands/registration.js +0 -1
  13. package/build/context.d.ts +1 -1
  14. package/build/context.js +2 -3
  15. package/build/events/index.d.ts +1 -0
  16. package/build/events/index.js +0 -1
  17. package/build/events/listener.js +0 -1
  18. package/build/events/manager.d.ts +40 -0
  19. package/build/events/manager.js +86 -0
  20. package/build/index.js +0 -1
  21. package/build/logger.js +0 -1
  22. package/build/options/index.js +0 -1
  23. package/build/options/option.d.ts +12 -30
  24. package/build/options/option.js +7 -15
  25. package/build/options/options.d.ts +39 -30
  26. package/build/options/options.js +59 -36
  27. package/build/permissions.d.ts +4 -4
  28. package/build/permissions.js +2 -3
  29. package/build/plugin.js +0 -1
  30. package/build/utility-types.js +0 -1
  31. package/build/utils.js +0 -1
  32. package/package.json +6 -3
  33. package/build/bot.js.map +0 -1
  34. package/build/commands/command.js.map +0 -1
  35. package/build/commands/diff.js.map +0 -1
  36. package/build/commands/index.js.map +0 -1
  37. package/build/commands/registration.js.map +0 -1
  38. package/build/context.js.map +0 -1
  39. package/build/events/index.js.map +0 -1
  40. package/build/events/listener.js.map +0 -1
  41. package/build/index.js.map +0 -1
  42. package/build/logger.js.map +0 -1
  43. package/build/options/index.js.map +0 -1
  44. package/build/options/option.js.map +0 -1
  45. package/build/options/options.js.map +0 -1
  46. package/build/permissions.js.map +0 -1
  47. package/build/plugin.js.map +0 -1
  48. package/build/utility-types.js.map +0 -1
  49. package/build/utils.js.map +0 -1
@@ -1,18 +1,15 @@
1
1
  import { SlashCommandAttachmentOption, SlashCommandBooleanOption, SlashCommandChannelOption, SlashCommandIntegerOption, SlashCommandMentionableOption, SlashCommandNumberOption, SlashCommandRoleOption, SlashCommandStringOption, SlashCommandUserOption } from "discord.js";
2
- class BaseOption {
2
+ export class BaseOption {
3
+ isOptional;
4
+ validator;
3
5
  /**
4
6
  * Only for Typescript.
5
7
  */
6
8
  type;
7
- isOptional;
8
- constructor(isOptional) {
9
- this.isOptional = isOptional;
10
- }
11
- }
12
- export class BuilderOption extends BaseOption {
13
9
  builder;
14
- constructor(builder, isOptional) {
15
- super(isOptional);
10
+ constructor(builder, isOptional, validator) {
11
+ this.isOptional = isOptional;
12
+ this.validator = validator;
16
13
  this.builder = builder.setRequired(isOptional === "optional" ? false : true);
17
14
  }
18
15
  describe(description) {
@@ -30,38 +27,47 @@ export class BuilderOption extends BaseOption {
30
27
  return this.builder;
31
28
  }
32
29
  }
33
- export class AttachmentOption extends BuilderOption {
34
- constructor(builder, isOptional) {
35
- super(builder, isOptional);
30
+ export class AttachmentOption extends BaseOption {
31
+ constructor(builder, isOptional, validator) {
32
+ super(builder, isOptional, validator);
33
+ }
34
+ validate(validator) {
35
+ return new AttachmentOption(this.builder, this.isOptional, validator);
36
36
  }
37
37
  /** @internal */
38
38
  asOptional() {
39
39
  return new AttachmentOption(this.builder, "optional");
40
40
  }
41
41
  }
42
- export class BooleanOption extends BuilderOption {
43
- constructor(builder, isOptional) {
44
- super(builder, isOptional);
42
+ export class BooleanOption extends BaseOption {
43
+ constructor(builder, isOptional, validator) {
44
+ super(builder, isOptional, validator);
45
+ }
46
+ validate(validator) {
47
+ return new BooleanOption(this.builder, this.isOptional, validator);
45
48
  }
46
49
  /** @internal */
47
50
  asOptional() {
48
51
  return new BooleanOption(this.builder, "optional");
49
52
  }
50
53
  }
51
- export class ChannelOption extends BuilderOption {
52
- constructor(builder, isOptional) {
53
- super(builder, isOptional);
54
+ export class ChannelOption extends BaseOption {
55
+ constructor(builder, isOptional, validator) {
56
+ super(builder, isOptional, validator);
54
57
  }
55
- union(channelTypes) {
58
+ narrow(channelTypes) {
56
59
  this.builder = this.builder.addChannelTypes(channelTypes);
57
60
  return this;
58
61
  }
62
+ validate(validator) {
63
+ return new ChannelOption(this.builder, this.isOptional, validator);
64
+ }
59
65
  /** @internal */
60
66
  asOptional() {
61
67
  return new ChannelOption(this.builder, "optional");
62
68
  }
63
69
  }
64
- class AutocompleteOption extends BuilderOption {
70
+ class AutocompleteOption extends BaseOption {
65
71
  autocomplete(autocomplete = true) {
66
72
  this.builder = this.builder.setAutocomplete(autocomplete);
67
73
  return this;
@@ -93,43 +99,55 @@ class NumbericOption extends ChoicesOption {
93
99
  }
94
100
  }
95
101
  export class IntegerOption extends NumbericOption {
96
- constructor(builder, isOptional) {
97
- super(builder, isOptional);
102
+ constructor(builder, isOptional, validator) {
103
+ super(builder, isOptional, validator);
98
104
  }
99
105
  union(...choices) {
100
106
  this.builder = this.builder.addChoices(choices.flat().map((choice) => choice.choice));
101
107
  return this;
102
108
  }
109
+ validate(validator) {
110
+ return new IntegerOption(this.builder, this.isOptional, validator);
111
+ }
103
112
  /** @internal */
104
113
  asOptional() {
105
114
  return new IntegerOption(this.builder, "optional");
106
115
  }
107
116
  }
108
117
  export class NumberOption extends NumbericOption {
109
- constructor(builder, isOptional) {
110
- super(builder, isOptional);
118
+ constructor(builder, isOptional, validator) {
119
+ super(builder, isOptional, validator);
111
120
  }
112
121
  union(...choices) {
113
122
  this.builder = this.builder.addChoices(choices.flat().map((choice) => choice.choice));
114
123
  return this;
115
124
  }
125
+ validate(validator) {
126
+ return new NumberOption(this.builder, this.isOptional, validator);
127
+ }
116
128
  /** @internal */
117
129
  asOptional() {
118
130
  return new NumberOption(this.builder, "optional");
119
131
  }
120
132
  }
121
- export class MentionableOption extends BuilderOption {
122
- constructor(builder, isOptional) {
123
- super(builder, isOptional);
133
+ export class MentionableOption extends BaseOption {
134
+ constructor(builder, isOptional, validator) {
135
+ super(builder, isOptional, validator);
136
+ }
137
+ validate(validator) {
138
+ return new MentionableOption(this.builder, this.isOptional, validator);
124
139
  }
125
140
  /** @internal */
126
141
  asOptional() {
127
142
  return new MentionableOption(this.builder, "optional");
128
143
  }
129
144
  }
130
- export class RoleOption extends BuilderOption {
131
- constructor(builder, isOptional) {
132
- super(builder, isOptional);
145
+ export class RoleOption extends BaseOption {
146
+ constructor(builder, isOptional, validator) {
147
+ super(builder, isOptional, validator);
148
+ }
149
+ validate(validator) {
150
+ return new RoleOption(this.builder, this.isOptional, validator);
133
151
  }
134
152
  /** @internal */
135
153
  asOptional() {
@@ -137,8 +155,8 @@ export class RoleOption extends BuilderOption {
137
155
  }
138
156
  }
139
157
  export class StringOption extends ChoicesOption {
140
- constructor(builder, isOptional) {
141
- super(builder, isOptional);
158
+ constructor(builder, isOptional, validator) {
159
+ super(builder, isOptional, validator);
142
160
  }
143
161
  min(min) {
144
162
  this.builder = this.builder.setMinLength(min);
@@ -152,18 +170,23 @@ export class StringOption extends ChoicesOption {
152
170
  this.builder = this.builder.addChoices(choices.flat().map((choice) => choice.choice));
153
171
  return this;
154
172
  }
173
+ validate(validator) {
174
+ return new StringOption(this.builder, this.isOptional, validator);
175
+ }
155
176
  /** @internal */
156
177
  asOptional() {
157
178
  return new StringOption(this.builder, "optional");
158
179
  }
159
180
  }
160
- export class UserOption extends BuilderOption {
161
- constructor(builder, isOptional) {
162
- super(builder, isOptional);
181
+ export class UserOption extends BaseOption {
182
+ constructor(builder, isOptional, validator) {
183
+ super(builder, isOptional, validator);
184
+ }
185
+ validate(validator) {
186
+ return new UserOption(this.builder, this.isOptional, validator);
163
187
  }
164
188
  /** @internal */
165
189
  asOptional() {
166
190
  return new UserOption(this.builder, "optional");
167
191
  }
168
192
  }
169
- //# sourceMappingURL=options.js.map
@@ -5,13 +5,13 @@ export type SinglePermissionResolvable = Exclude<PermissionResolvable, any[]>;
5
5
  export declare class PermissionsResolver {
6
6
  private readonly bot;
7
7
  constructor(bot: Bot);
8
- checkSelf(permissions: SinglePermissionResolvable[], guild: Guild, channel?: GuildChannelResolvable): Promise<import("@l3dev/result").Err<"GET_ME", object & {
8
+ checkSelf(permissions: SinglePermissionResolvable[], guild: Guild, channel?: GuildChannelResolvable): Promise<import("@l3dev/result").None | import("@l3dev/result").Err<null, {
9
9
  error: Error;
10
10
  }> | import("@l3dev/result").Err<"MISSING_PERMISSIONS", {
11
11
  missingPermissions: ("CreateInstantInvite" | "KickMembers" | "BanMembers" | "Administrator" | "ManageChannels" | "ManageGuild" | "AddReactions" | "ViewAuditLog" | "PrioritySpeaker" | "Stream" | "ViewChannel" | "SendMessages" | "SendTTSMessages" | "ManageMessages" | "EmbedLinks" | "AttachFiles" | "ReadMessageHistory" | "MentionEveryone" | "UseExternalEmojis" | "ViewGuildInsights" | "Connect" | "Speak" | "MuteMembers" | "DeafenMembers" | "MoveMembers" | "UseVAD" | "ChangeNickname" | "ManageNicknames" | "ManageRoles" | "ManageWebhooks" | "ManageEmojisAndStickers" | "ManageGuildExpressions" | "UseApplicationCommands" | "RequestToSpeak" | "ManageEvents" | "ManageThreads" | "CreatePublicThreads" | "CreatePrivateThreads" | "UseExternalStickers" | "SendMessagesInThreads" | "UseEmbeddedActivities" | "ModerateMembers" | "ViewCreatorMonetizationAnalytics" | "UseSoundboard" | "CreateGuildExpressions" | "CreateEvents" | "UseExternalSounds" | "SendVoiceMessages" | "SendPolls" | "UseExternalApps" | "PinMessages" | "BypassSlowmode")[];
12
- }> | import("@l3dev/result").None>;
13
- check(member: GuildMember, permissions: SinglePermissionResolvable[], channel?: GuildChannelResolvable): import("@l3dev/result").Err<"MISSING_PERMISSIONS", {
12
+ }>>;
13
+ check(member: GuildMember, permissions: SinglePermissionResolvable[], channel?: GuildChannelResolvable): import("@l3dev/result").None | import("@l3dev/result").Err<"MISSING_PERMISSIONS", {
14
14
  missingPermissions: ("CreateInstantInvite" | "KickMembers" | "BanMembers" | "Administrator" | "ManageChannels" | "ManageGuild" | "AddReactions" | "ViewAuditLog" | "PrioritySpeaker" | "Stream" | "ViewChannel" | "SendMessages" | "SendTTSMessages" | "ManageMessages" | "EmbedLinks" | "AttachFiles" | "ReadMessageHistory" | "MentionEveryone" | "UseExternalEmojis" | "ViewGuildInsights" | "Connect" | "Speak" | "MuteMembers" | "DeafenMembers" | "MoveMembers" | "UseVAD" | "ChangeNickname" | "ManageNicknames" | "ManageRoles" | "ManageWebhooks" | "ManageEmojisAndStickers" | "ManageGuildExpressions" | "UseApplicationCommands" | "RequestToSpeak" | "ManageEvents" | "ManageThreads" | "CreatePublicThreads" | "CreatePrivateThreads" | "UseExternalStickers" | "SendMessagesInThreads" | "UseEmbeddedActivities" | "ModerateMembers" | "ViewCreatorMonetizationAnalytics" | "UseSoundboard" | "CreateGuildExpressions" | "CreateEvents" | "UseExternalSounds" | "SendVoiceMessages" | "SendPolls" | "UseExternalApps" | "PinMessages" | "BypassSlowmode")[];
15
- }> | import("@l3dev/result").None;
15
+ }>;
16
16
  resolveName(permission: SinglePermissionResolvable): PermissionName;
17
17
  }
@@ -1,4 +1,4 @@
1
- import { err, NONE } from "@l3dev/result";
1
+ import { err, NONE, Result } from "@l3dev/result";
2
2
  import { BitField, PermissionFlagsBits } from "discord.js";
3
3
  export class PermissionsResolver {
4
4
  bot;
@@ -6,7 +6,7 @@ export class PermissionsResolver {
6
6
  this.bot = bot;
7
7
  }
8
8
  async checkSelf(permissions, guild, channel) {
9
- const member = await this.bot.getMe(guild);
9
+ const member = await Result.fromPromise(guild.members.fetchMe());
10
10
  if (!member.ok)
11
11
  return member;
12
12
  return this.check(member.value, permissions, channel);
@@ -35,4 +35,3 @@ export class PermissionsResolver {
35
35
  return entry[0];
36
36
  }
37
37
  }
38
- //# sourceMappingURL=permissions.js.map
package/build/plugin.js CHANGED
@@ -19,4 +19,3 @@ export function plugin(options) {
19
19
  return new ResolvedPlugin(resolvedOptions);
20
20
  };
21
21
  }
22
- //# sourceMappingURL=plugin.js.map
@@ -1,2 +1 @@
1
1
  export {};
2
- //# sourceMappingURL=utility-types.js.map
package/build/utils.js CHANGED
@@ -16,4 +16,3 @@ export function mergeMessageFlags(...flags) {
16
16
  }
17
17
  return mergedFlags;
18
18
  }
19
- //# sourceMappingURL=utils.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "discordthing",
3
- "version": "0.1.2",
3
+ "version": "0.2.1",
4
4
  "description": "A lightweight framework for building discord bots built on-top of discord.js",
5
5
  "type": "module",
6
6
  "main": "./build/index.js",
@@ -45,11 +45,14 @@
45
45
  "discord.js": "^14.25.0"
46
46
  },
47
47
  "dependencies": {
48
- "@l3dev/result": "^0.6.1",
48
+ "@l3dev/result": "^0.6.2",
49
49
  "tslog": "^4.10.2"
50
50
  },
51
+ "devDependencies": {
52
+ "zod": "^4.0.0"
53
+ },
51
54
  "scripts": {
52
- "build": "tsc",
55
+ "build": "rm -rf build && tsc",
53
56
  "package": "pnpm build",
54
57
  "eslint": "eslint .",
55
58
  "lint": "eslint . && prettier --check .",
package/build/bot.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"bot.js","sourceRoot":"","sources":["../src/bot.ts"],"names":[],"mappings":"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","sourcesContent":["import { err, ok, Result, type ReturnResult } from \"@l3dev/result\";\nimport {\n\tClient,\n\tEvents,\n\tInteractionContextType,\n\tREST,\n\tSlashCommandBuilder,\n\ttype ClientOptions,\n\ttype Guild,\n\ttype Interaction,\n\ttype RestOrArray\n} from \"discord.js\";\nimport { Logger } from \"tslog\";\n\nimport type { Command, CommandCtx, CommandFilter } from \"./commands/command.js\";\nimport { CommandRegistration } from \"./commands/registration.js\";\nimport { createContext } from \"./context.js\";\nimport type { Listener } from \"./events/listener.js\";\nimport type { ILogger } from \"./logger.js\";\nimport type { Plugin, ResolvedPlugin } from \"./plugin.js\";\n\nexport type BotOptions = {\n\tname?: string;\n\tplugins?: Plugin[];\n\tcommands?: Command<string, SlashCommandBuilder>[];\n\tlisteners?: Listener<any>[];\n\tlogger?: ILogger;\n};\n\nexport class Bot {\n\treadonly client: Client<boolean>;\n\tprivate _rest: REST;\n\n\tget rest() {\n\t\treturn this._rest;\n\t}\n\n\tprivate readonly plugins: ResolvedPlugin[];\n\tprivate readonly commands: Record<string, Command<string, SlashCommandBuilder>>;\n\tprivate readonly commandFilters: CommandFilter[] = [];\n\tprivate readonly readyListeners: Listener<\"clientReady\">[] = [];\n\tprivate readonly logger: ILogger;\n\n\tconstructor(options: BotOptions, clientOptions: ClientOptions) {\n\t\tthis._rest = new REST({ version: \"10\" });\n\t\tthis.client = new Client(clientOptions);\n\n\t\tthis.plugins = (options.plugins ?? []).map((plugin) => plugin(options));\n\t\tthis.logger =\n\t\t\toptions.logger ??\n\t\t\tnew Logger({\n\t\t\t\tname: options.name ?? \"discordthing-bot\"\n\t\t\t});\n\n\t\tfor (const plugin of this.plugins) {\n\t\t\tplugin.resolved(this);\n\t\t}\n\n\t\tthis.commands = [\n\t\t\t...(options.commands ?? []),\n\t\t\t...this.plugins.flatMap((plugin) => plugin.commands)\n\t\t].reduce(\n\t\t\t(acc, command) => ({\n\t\t\t\t...acc,\n\t\t\t\t[command.name]: command\n\t\t\t}),\n\t\t\t{}\n\t\t);\n\n\t\tthis.client.on(Events.ClientReady, this.onReady.bind(this));\n\t\tthis.client.on(Events.InteractionCreate, this.onInteraction.bind(this));\n\n\t\tconst allListeners = [\n\t\t\t...(options.listeners ?? []),\n\t\t\t...this.plugins.flatMap((plugin) => plugin.listeners)\n\t\t];\n\t\tfor (const listener of allListeners) {\n\t\t\tif (listener.event === Events.ClientReady) {\n\t\t\t\tthis.readyListeners.push(listener);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthis.client.on(listener.event, this.createListenerFn(listener));\n\t\t}\n\t}\n\n\taddCommands(...commands: RestOrArray<Command<string, SlashCommandBuilder>>) {\n\t\tfor (const command of commands.flat()) {\n\t\t\tthis.addCommand(command);\n\t\t}\n\t}\n\n\taddCommand(command: Command<string, SlashCommandBuilder>) {\n\t\tif (this.client.isReady()) {\n\t\t\tthrow new Error(\"Cannot add command after bot has started\");\n\t\t}\n\n\t\tthis.commands[command.name] = command;\n\t}\n\n\taddCommandFilter(filter: CommandFilter) {\n\t\tthis.commandFilters.push(filter);\n\t}\n\n\taddListeners(...listeners: RestOrArray<Listener<any>>) {\n\t\tfor (const listener of listeners.flat()) {\n\t\t\tthis.addListener(listener);\n\t\t}\n\t}\n\n\taddListener(listener: Listener<any>) {\n\t\tif (this.client.isReady()) {\n\t\t\tthrow new Error(\"Cannot add listener after bot has started\");\n\t\t}\n\n\t\tif (listener.event === Events.ClientReady) {\n\t\t\tthis.readyListeners.push(listener);\n\t\t\treturn;\n\t\t}\n\n\t\t(listener.once ? this.client.once : this.client.on)(\n\t\t\tlistener.event,\n\t\t\tthis.createListenerFn(listener)\n\t\t);\n\t}\n\n\tprivate createListenerFn(listener: Listener<any>) {\n\t\treturn async (...args: any[]) => {\n\t\t\tconst ctx = createContext(this, this.logger);\n\n\t\t\ttry {\n\t\t\t\tawait listener.handler(ctx, ...args);\n\t\t\t} catch (error) {\n\t\t\t\tthis.logger.error(`Error in listener ${listener.event}:`, error);\n\t\t\t}\n\t\t};\n\t}\n\n\tasync start(token: string) {\n\t\tthis._rest = this._rest.setToken(token);\n\t\tawait this.client.login(token);\n\t}\n\n\tasync getMe(guild: Guild) {\n\t\tif (guild.members.me) {\n\t\t\treturn ok(guild.members.me);\n\t\t}\n\n\t\treturn await Result.fromPromise(guild.members.fetchMe(), {\n\t\t\tonError: { type: \"GET_ME\" }\n\t\t});\n\t}\n\n\tprivate async registerCommands(client: Client<true>) {\n\t\tconst commandRegistration = new CommandRegistration(this._rest, client);\n\n\t\tconst globalCommands = Object.values(this.commands).filter((command) => {\n\t\t\tconst contexts = command.getContexts();\n\t\t\treturn (\n\t\t\t\tcontexts.includes(InteractionContextType.BotDM) ||\n\t\t\t\tcontexts.includes(InteractionContextType.PrivateChannel)\n\t\t\t);\n\t\t});\n\n\t\tconst guildCommands = Object.values(this.commands).filter((command) => {\n\t\t\tconst contexts = command.getContexts();\n\t\t\treturn contexts.includes(InteractionContextType.Guild);\n\t\t});\n\n\t\tthis.logger.debug(`Registering global commands...`);\n\t\tawait commandRegistration.registerGlobalCommands(globalCommands);\n\n\t\tconst guilds = await client.guilds.fetch();\n\t\tfor (const guild of guilds.values()) {\n\t\t\tthis.logger.debug(`Registering guild commands for guild ${guild.id}...`);\n\t\t\tawait commandRegistration.registerGuildCommands(guild.id, guildCommands);\n\t\t}\n\t}\n\n\tprivate async onReady(client: Client<true>) {\n\t\tconst startMs = performance.now();\n\n\t\tawait this.registerCommands(client);\n\n\t\t// Make a copy so we can remove _once_ listeners\n\t\tconst listeners = [...this.readyListeners];\n\n\t\tfor (const listener of listeners) {\n\t\t\tconst handler = this.createListenerFn(listener);\n\t\t\thandler(client);\n\n\t\t\tif (listener.once) {\n\t\t\t\tconst index = this.readyListeners.indexOf(listener);\n\t\t\t\tif (index === -1) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.readyListeners.splice(index, 1);\n\t\t\t}\n\t\t}\n\n\t\tconst endMs = performance.now();\n\t\tconst elapsedMs = endMs - startMs;\n\n\t\tthis.logger.info(\n\t\t\t`Ready! (${elapsedMs > 1000 ? `${(elapsedMs / 1000).toFixed(2)}s` : `${elapsedMs}ms`})`\n\t\t);\n\t}\n\n\tprivate async onInteraction(interaction: Interaction) {\n\t\tif (interaction.user.bot || !interaction.isChatInputCommand()) return;\n\n\t\tconst command = this.commands[interaction.commandName];\n\t\tif (!command) {\n\t\t\tthis.logger.error(`Unknown command '${interaction.commandName}'`);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.commandFilters.some((filter) => filter(interaction, command))) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst ctx = createContext(this, this.logger) as CommandCtx;\n\t\tctx.interaction = interaction;\n\n\t\tlet result;\n\t\ttry {\n\t\t\tresult = await command.execute(ctx);\n\t\t} catch (error) {\n\t\t\tresult = err(\"COMMAND_FAILED\", {\n\t\t\t\tcommand: interaction.commandName,\n\t\t\t\tinteractionId: interaction.id,\n\t\t\t\terror\n\t\t\t});\n\t\t}\n\n\t\tconst unwrapped = Result.unwrap(result) as ReturnResult<any, any>;\n\t\tif (!unwrapped.ok) {\n\t\t\tthis.logger.error(`Error while executing command '${interaction.commandName}':`, result);\n\t\t}\n\t}\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/commands/command.ts"],"names":[],"mappings":"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","sourcesContent":["import { err, NONE, type ReturnResult } from \"@l3dev/result\";\nimport {\n\tApplicationCommandOptionType,\n\tInteractionContextType,\n\tSlashCommandBuilder,\n\tSlashCommandSubcommandBuilder,\n\ttype ChatInputCommandInteraction,\n\ttype CommandInteractionOptionResolver,\n\ttype SharedNameAndDescription,\n\ttype SharedSlashCommandOptions\n} from \"discord.js\";\n\nimport type { GenericCtx } from \"../context.js\";\nimport type { Args, OptionDefinitions } from \"../options/index.js\";\nimport {\n\tAttachmentOption,\n\tBooleanOption,\n\tBuilderOption,\n\tChannelOption,\n\tIntegerOption,\n\tMentionableOption,\n\tNumberOption,\n\tRoleOption,\n\tStringOption,\n\tUserOption\n} from \"../options/options.js\";\nimport type { Expand, MaybePromise } from \"../utility-types.js\";\n\nexport type CommandCtx = Expand<\n\tGenericCtx & {\n\t\tinteraction: ChatInputCommandInteraction;\n\t}\n>;\n\nexport type ArgsArrayForOptions<Options extends OptionDefinitions> = [Options] extends [\n\tOptionDefinitions\n]\n\t? [args: Args<Options>]\n\t: [];\n\nexport type CommandMeta<Name extends string> = {\n\t/**\n\t * The name of the command.\n\t */\n\tname: Name;\n\t/**\n\t * The description of the command.\n\t */\n\tdescription?: string;\n\t/**\n\t * Whether the command is NSFW.\n\t */\n\tnsfw?: boolean;\n\t/**\n\t * The contexts in which the command can be used.\n\t *\n\t * @default [InteractionContextType.Guild]\n\t */\n\tcontexts?: InteractionContextType[];\n};\n\nexport type SubcommandMeta<Name extends string> = {\n\t/**\n\t * The name of the command.\n\t */\n\tname: Name;\n\t/**\n\t * The description of the command.\n\t */\n\tdescription?: string;\n};\n\ntype GenericCommandHandler = (\n\tctx: CommandCtx,\n\t...args: any[]\n) => MaybePromise<ReturnResult<any, any>>;\n\nexport class Command<\n\tName extends string,\n\tBuilder extends SharedNameAndDescription & SharedSlashCommandOptions<any>\n> {\n\treadonly name: Name;\n\n\tprivate options: OptionDefinitions | null = null;\n\tprivate subcommands: Record<string, Command<string, SlashCommandSubcommandBuilder>> | null = null;\n\tprivate handler: GenericCommandHandler | null = null;\n\n\tconstructor(\n\t\tprotected builder: Builder,\n\t\tmeta: CommandMeta<Name>\n\t) {\n\t\tthis.name = meta.name;\n\n\t\tbuilder = builder.setName(meta.name);\n\t\tif (meta.description) {\n\t\t\tbuilder = builder.setDescription(meta.description);\n\t\t}\n\t\tif (builder instanceof SlashCommandBuilder) {\n\t\t\tlet commandBuilder = builder as SlashCommandBuilder;\n\t\t\tif (meta.nsfw) {\n\t\t\t\tcommandBuilder = commandBuilder.setNSFW(meta.nsfw);\n\t\t\t}\n\t\t\tcommandBuilder = commandBuilder.setContexts(meta.contexts ?? [InteractionContextType.Guild]);\n\t\t\tbuilder = commandBuilder as Builder & SlashCommandBuilder;\n\t\t}\n\t\tthis.builder = builder;\n\t}\n\n\tasync execute(ctx: CommandCtx): Promise<ReturnResult<any, any>> {\n\t\tif (this.subcommands) {\n\t\t\tconst continueResult = this.handler ? await this.handler(ctx) : NONE;\n\t\t\tif (!continueResult.ok || !continueResult.value) {\n\t\t\t\treturn continueResult;\n\t\t\t}\n\n\t\t\tconst subcommandName = ctx.interaction.options.getSubcommand(true);\n\t\t\tconst subcommand = this.subcommands[subcommandName];\n\t\t\tif (!subcommand) {\n\t\t\t\treturn err(\"UNKNOWN_SUBCOMMAND\", {\n\t\t\t\t\tname: subcommandName\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn await subcommand.execute(ctx);\n\t\t}\n\n\t\tconst args = this.parseOptions(ctx.interaction.options);\n\n\t\treturn await this.handler!(ctx, args);\n\t}\n\n\t/** @internal */\n\tprivate parseOptions(options: Partial<CommandInteractionOptionResolver>) {\n\t\tconst args: Record<string, any> = {};\n\n\t\tfor (const [name, option] of Object.entries(this.options ?? {})) {\n\t\t\tconst required = option.isOptional === \"required\";\n\n\t\t\tlet value: any = null;\n\t\t\tif (options.getAttachment && option instanceof AttachmentOption) {\n\t\t\t\tvalue = options.getAttachment(name, required);\n\t\t\t} else if (options.getBoolean && option instanceof BooleanOption) {\n\t\t\t\tvalue = options.getBoolean(name, required);\n\t\t\t} else if (options.getChannel && option instanceof ChannelOption) {\n\t\t\t\tvalue = options.getChannel(name, required, option.getBuilder().channel_types);\n\t\t\t} else if (options.getInteger && option instanceof IntegerOption) {\n\t\t\t\tvalue = options.getInteger(name, required);\n\t\t\t} else if (options.getMentionable && option instanceof MentionableOption) {\n\t\t\t\tvalue = options.getMentionable(name, required);\n\t\t\t} else if (options.getNumber && option instanceof NumberOption) {\n\t\t\t\tvalue = options.getNumber(name, required);\n\t\t\t} else if (options.getRole && option instanceof RoleOption) {\n\t\t\t\tvalue = options.getRole(name, required);\n\t\t\t} else if (options.getString && option instanceof StringOption) {\n\t\t\t\tvalue = options.getString(name, required);\n\t\t\t} else if (options.getUser && option instanceof UserOption) {\n\t\t\t\tvalue = options.getUser(name, required);\n\t\t\t}\n\n\t\t\tif (value === null || value === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\targs[name] = value;\n\t\t}\n\n\t\treturn args;\n\t}\n\n\t/** @internal */\n\tgetContexts() {\n\t\tif (!(this.builder instanceof SlashCommandBuilder)) {\n\t\t\treturn [];\n\t\t}\n\n\t\treturn this.builder.contexts ?? [InteractionContextType.Guild];\n\t}\n\n\t/** @internal */\n\tgetBuilder() {\n\t\treturn this.builder;\n\t}\n\n\t/** @internal */\n\tsetOptions(options: OptionDefinitions) {\n\t\tthis.options = options;\n\n\t\tfor (const [name, option] of Object.entries(options)) {\n\t\t\tif (option instanceof BuilderOption) {\n\t\t\t\tthis.addOption(name, option);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** @internal */\n\tprivate addOption(name: string, option: BuilderOption<any, any, any>) {\n\t\tlet optionBuilder = option.getBuilder().setName(name);\n\t\tif (!optionBuilder.description) {\n\t\t\toptionBuilder = optionBuilder.setDescription(`${name} option.`);\n\t\t}\n\n\t\tif (optionBuilder.type === ApplicationCommandOptionType.Attachment) {\n\t\t\tthis.builder = this.builder.addAttachmentOption(optionBuilder);\n\t\t} else if (optionBuilder.type === ApplicationCommandOptionType.Boolean) {\n\t\t\tthis.builder = this.builder.addBooleanOption(optionBuilder);\n\t\t} else if (optionBuilder.type === ApplicationCommandOptionType.Channel) {\n\t\t\tthis.builder = this.builder.addChannelOption(optionBuilder);\n\t\t} else if (optionBuilder.type === ApplicationCommandOptionType.Integer) {\n\t\t\tthis.builder = this.builder.addIntegerOption(optionBuilder);\n\t\t} else if (optionBuilder.type === ApplicationCommandOptionType.Mentionable) {\n\t\t\tthis.builder = this.builder.addMentionableOption(optionBuilder);\n\t\t} else if (optionBuilder.type === ApplicationCommandOptionType.Number) {\n\t\t\tthis.builder = this.builder.addNumberOption(optionBuilder);\n\t\t} else if (optionBuilder.type === ApplicationCommandOptionType.Role) {\n\t\t\tthis.builder = this.builder.addRoleOption(optionBuilder);\n\t\t} else if (optionBuilder.type === ApplicationCommandOptionType.String) {\n\t\t\tthis.builder = this.builder.addStringOption(optionBuilder);\n\t\t} else if (optionBuilder.type === ApplicationCommandOptionType.User) {\n\t\t\tthis.builder = this.builder.addUserOption(optionBuilder);\n\t\t}\n\t}\n\n\t/** @internal */\n\tsetSubcommands(subcommands: Command<string, SlashCommandSubcommandBuilder>[]) {\n\t\tif (!(this.builder instanceof SlashCommandBuilder)) {\n\t\t\tthrow new Error(\"Subcommands can only be set on a SlashCommandBuilder\");\n\t\t}\n\n\t\tthis.subcommands = subcommands.reduce(\n\t\t\t(acc, subcommand) => ({\n\t\t\t\t...acc,\n\t\t\t\t[subcommand.name]: subcommand\n\t\t\t}),\n\t\t\t{}\n\t\t);\n\t}\n\n\t/** @internal */\n\tsetHandler(handler: GenericCommandHandler) {\n\t\tthis.handler = handler;\n\t}\n}\n\nexport function command<Name extends string, Options extends OptionDefinitions>(command: {\n\t/**\n\t * Metadata for this command.\n\t */\n\tmeta: CommandMeta<Name>;\n\t/**\n\t * Options for the command.\n\t *\n\t * Examples:\n\t *\n\t * ```\n\t * options: {}\n\t * options: { message: o.string() }\n\t * options: { message: o.string().union(o.choice(\"hello\"), o.choice(\"world\")) }\n\t * options: { message: o.string(), count: o.integer() }\n\t * ```\n\t */\n\toptions?: Options;\n\t/**\n\t * The implementation for this command.\n\t */\n\thandler: (\n\t\tctx: CommandCtx,\n\t\t...args: ArgsArrayForOptions<Options>\n\t) => MaybePromise<ReturnResult<any, any>>;\n}): Command<Name, SlashCommandBuilder>;\nexport function command<Name extends string>(command: {\n\t/**\n\t * Metadata for this command.\n\t */\n\tmeta: CommandMeta<Name>;\n\t/**\n\t * Subcommands for the command.\n\t */\n\tsubcommands: Command<string, SlashCommandSubcommandBuilder>[];\n\t/**\n\t * The middleware for this command with subcommands.\n\t */\n\tmiddleware?: (ctx: CommandCtx) => MaybePromise<ReturnResult<boolean, any>>;\n}): Command<Name, SlashCommandBuilder>;\nexport function command<Name extends string, Options extends OptionDefinitions>(\n\tdata: {\n\t\tmeta: CommandMeta<Name>;\n\t} & (\n\t\t| {\n\t\t\t\toptions?: Options;\n\t\t\t\thandler: (\n\t\t\t\t\tctx: CommandCtx,\n\t\t\t\t\t...args: ArgsArrayForOptions<Options>\n\t\t\t\t) => MaybePromise<ReturnResult<any, any>>;\n\t\t }\n\t\t| {\n\t\t\t\tsubcommands: Command<string, SlashCommandSubcommandBuilder>[];\n\t\t\t\tmiddleware?: (ctx: CommandCtx) => MaybePromise<ReturnResult<boolean, any>>;\n\t\t }\n\t)\n): Command<Name, SlashCommandBuilder> {\n\tconst command = new Command(new SlashCommandBuilder(), data.meta);\n\n\tif (\"options\" in data && data.options) {\n\t\tcommand.setOptions(data.options);\n\t\tcommand.setHandler(data.handler);\n\t} else if (\"subcommands\" in data) {\n\t\tcommand.setSubcommands(data.subcommands);\n\t\tif (data.middleware) {\n\t\t\tcommand.setHandler(data.middleware);\n\t\t}\n\t}\n\n\treturn command;\n}\n\nexport function subcommand<Name extends string, Options extends OptionDefinitions>(command: {\n\t/**\n\t * Metadata for this command.\n\t */\n\tmeta: SubcommandMeta<Name>;\n\t/**\n\t * Options for the command.\n\t *\n\t * Examples:\n\t *\n\t * ```\n\t * options: {}\n\t * options: { message: o.string() }\n\t * options: { message: o.string().union(o.choice(\"hello\"), o.choice(\"world\")) }\n\t * options: { message: o.string(), count: o.integer() }\n\t * ```\n\t */\n\toptions?: Options;\n\t/**\n\t * The implementation for this command.\n\t */\n\thandler: (\n\t\tctx: CommandCtx,\n\t\t...args: ArgsArrayForOptions<Options>\n\t) => MaybePromise<ReturnResult<any, any>>;\n}): Command<Name, SlashCommandSubcommandBuilder> {\n\tconst subcommand = new Command(new SlashCommandSubcommandBuilder(), command.meta);\n\tif (command.options) {\n\t\tsubcommand.setOptions(command.options);\n\t}\n\tsubcommand.setHandler(command.handler);\n\n\treturn subcommand;\n}\n\nexport type CommandFilter = (\n\tinteraction: ChatInputCommandInteraction,\n\tcommand: Command<string, SlashCommandBuilder>\n) => boolean;\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,SAAS,CAAC,EACzB,IAAI,EACJ,IAAI,EAIJ;IACA,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACzC,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IACvD,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE/D,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,CAAC,CAAC;QAC7E,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC;QAE7B,IAAI,UAAU,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACrD,IAAI,UAAU,CAAC,WAAW,KAAK,UAAU,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC;QACnE,IAAI,CAAC,UAAU,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,IAAI,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAEnF,IACC,CAAE,UAAyC,CAAC,YAAY,IAAI,KAAK,CAAC;YAClE,CAAE,UAAyC,CAAC,YAAY,IAAI,KAAK,CAAC,EACjE,CAAC;YACF,OAAO,IAAI,CAAC;QACb,CAAC;QAED,IAAI,CAAC,CAAE,UAA+B,CAAC,OAAO,KAAK,CAAC,CAAE,UAA+B,CAAC,OAAO,EAAE,CAAC;YAC/F,OAAO,IAAI,CAAC;QACb,CAAC;QAED,IACC,SAAS,IAAI,UAAU;YACvB,SAAS,IAAI,UAAU;YACvB,UAAU,CAAC,OAAO;YAClB,UAAU,CAAC,OAAO,EACjB,CAAC;YACF,KAAK,MAAM,UAAU,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBAC7C,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,CAAC,CAAC;gBACxF,IAAI,CAAC,UAAU;oBAAE,OAAO,IAAI,CAAC;gBAE7B,IAAI,UAAU,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI;oBAAE,OAAO,IAAI,CAAC;gBACrD,IAAI,UAAU,CAAC,KAAK,KAAK,UAAU,CAAC,KAAK;oBAAE,OAAO,IAAI,CAAC;YACxD,CAAC;QACF,CAAC;IACF,CAAC;IAED,OAAO,KAAK,CAAC;AACd,CAAC","sourcesContent":["import type {\n\tAPIApplicationCommand,\n\tRESTPostAPIChatInputApplicationCommandsJSONBody\n} from \"discord.js\";\n\nexport function diffCheck({\n\tprev,\n\tnext\n}: {\n\tprev: Omit<APIApplicationCommand, \"dm_permission\">;\n\tnext: RESTPostAPIChatInputApplicationCommandsJSONBody;\n}) {\n\tif (next.name !== prev.name) return true;\n\tif (next.description !== prev.description) return true;\n\tif ((next.nsfw ?? false) !== (prev.nsfw ?? false)) return true;\n\n\tfor (const nextOption of next.options ?? []) {\n\t\tconst prevOption = prev.options?.find((opt) => opt.name === nextOption.name);\n\t\tif (!prevOption) return true;\n\n\t\tif (nextOption.type !== prevOption.type) return true;\n\t\tif (nextOption.description !== prevOption.description) return true;\n\t\tif ((nextOption.required ?? false) !== (prevOption.required ?? false)) return true;\n\n\t\tif (\n\t\t\t((nextOption as { autocomplete?: boolean }).autocomplete ?? false) !==\n\t\t\t((prevOption as { autocomplete?: boolean }).autocomplete ?? false)\n\t\t) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (!!(nextOption as { choices?: [] }).choices !== !!(prevOption as { choices?: [] }).choices) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (\n\t\t\t\"choices\" in nextOption &&\n\t\t\t\"choices\" in prevOption &&\n\t\t\tnextOption.choices &&\n\t\t\tprevOption.choices\n\t\t) {\n\t\t\tfor (const nextChoice of nextOption.choices) {\n\t\t\t\tconst prevChoice = prevOption.choices.find((choice) => choice.name === nextChoice.name);\n\t\t\t\tif (!prevChoice) return true;\n\n\t\t\t\tif (nextChoice.name !== prevChoice.name) return true;\n\t\t\t\tif (nextChoice.value !== prevChoice.value) return true;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC","sourcesContent":["export { command, subcommand } from \"./command.js\";\nexport type { CommandCtx, CommandMeta, SubcommandMeta, Command, CommandFilter } from \"./command.js\";\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"registration.js","sourceRoot":"","sources":["../../src/commands/registration.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,MAAM,EAON,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,OAAO,mBAAmB;IAEtB;IACA;IAFT,YACS,IAAU,EACV,MAAoB;QADpB,SAAI,GAAJ,IAAI,CAAM;QACV,WAAM,GAAN,MAAM,CAAc;IAC1B,CAAC;IAEJ,KAAK,CAAC,sBAAsB,CAAC,QAAgD;QAC5E,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAC7F,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAClD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,qBAAqB,CAC1B,OAAkB,EAClB,QAAgD;QAEhD,MAAM,IAAI,CAAC,gBAAgB,CAC1B,QAAQ,EACR,MAAM,CAAC,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,EAC7D,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,CACxE,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAC7B,QAAgD,EAChD,KAAmB,EACnB,WAAyC;QAEzC,MAAM,kBAAkB,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAGnD,CAAC;QAEJ,MAAM,aAAa,GAAsD,EAAE,CAAC;QAC5E,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,CAAC;YAE3C,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,IAAI,CAChD,CAAC,iBAAiB,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAC9D,CAAC;YACF,IAAI,iBAAiB,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;gBAC9E,SAAS;YACV,CAAC;YAED,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAED,MAAM,gBAAgB,GAAa,EAAE,CAAC;QACtC,KAAK,MAAM,iBAAiB,IAAI,kBAAkB,EAAE,CAAC;YACpD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACpF,IAAI,OAAO,EAAE,CAAC;gBACb,OAAO;YACR,CAAC;YAED,gBAAgB,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACjF,MAAM,cAAc,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAEvF,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,WAAW,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC;IACxD,CAAC;CACD","sourcesContent":["import {\n\tRoutes,\n\ttype APIApplicationCommand,\n\ttype Client,\n\ttype REST,\n\ttype RESTPostAPIChatInputApplicationCommandsJSONBody,\n\ttype SlashCommandBuilder,\n\ttype Snowflake\n} from \"discord.js\";\n\nimport type { Command } from \"./command.js\";\nimport { diffCheck } from \"./diff.js\";\n\nexport class CommandRegistration {\n\tconstructor(\n\t\tprivate rest: REST,\n\t\tprivate client: Client<true>\n\t) {}\n\n\tasync registerGlobalCommands(commands: Command<string, SlashCommandBuilder>[]) {\n\t\tawait this.registerCommands(commands, Routes.applicationCommands(this.client.user.id), (id) =>\n\t\t\tRoutes.applicationCommand(this.client.user.id, id)\n\t\t);\n\t}\n\n\tasync registerGuildCommands(\n\t\tguildId: Snowflake,\n\t\tcommands: Command<string, SlashCommandBuilder>[]\n\t) {\n\t\tawait this.registerCommands(\n\t\t\tcommands,\n\t\t\tRoutes.applicationGuildCommands(this.client.user.id, guildId),\n\t\t\t(id) => Routes.applicationGuildCommand(this.client.user.id, guildId, id)\n\t\t);\n\t}\n\n\tprivate async registerCommands(\n\t\tcommands: Command<string, SlashCommandBuilder>[],\n\t\troute: `/${string}`,\n\t\tdeleteRoute: (id: string) => `/${string}`\n\t) {\n\t\tconst registeredCommands = (await this.rest.get(route)) as Omit<\n\t\t\tAPIApplicationCommand,\n\t\t\t\"dm_permission\"\n\t\t>[];\n\n\t\tconst commandsToAdd: RESTPostAPIChatInputApplicationCommandsJSONBody[] = [];\n\t\tfor (const command of commands) {\n\t\t\tconst body = command.getBuilder().toJSON();\n\n\t\t\tconst registeredCommand = registeredCommands.find(\n\t\t\t\t(registeredCommand) => registeredCommand.name === command.name\n\t\t\t);\n\t\t\tif (registeredCommand && !diffCheck({ prev: registeredCommand, next: body })) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcommandsToAdd.push(body);\n\t\t}\n\n\t\tconst commandsToRemove: string[] = [];\n\t\tfor (const registeredCommand of registeredCommands) {\n\t\t\tconst command = commands.find((command) => command.name === registeredCommand.name);\n\t\t\tif (command) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcommandsToRemove.push(registeredCommand.id);\n\t\t}\n\n\t\tconst addPromises = commandsToAdd.map((body) => this.rest.post(route, { body }));\n\t\tconst removePromises = commandsToRemove.map((id) => this.rest.delete(deleteRoute(id)));\n\n\t\tawait Promise.all([...addPromises, ...removePromises]);\n\t}\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAQvD,MAAM,UAAU,aAAa,CAAC,GAAQ,EAAE,MAAe;IACtD,OAAO;QACN,GAAG;QACH,WAAW,EAAE,IAAI,mBAAmB,CAAC,GAAG,CAAC;QACzC,MAAM;KACN,CAAC;AACH,CAAC","sourcesContent":["import type { Bot } from \"./bot.js\";\nimport type { ILogger } from \"./logger.js\";\nimport { PermissionsResolver } from \"./permissions.js\";\n\nexport type GenericCtx = {\n\tbot: Bot;\n\tpermissions: PermissionsResolver;\n\tlogger: ILogger;\n};\n\nexport function createContext(bot: Bot, logger: ILogger): GenericCtx {\n\treturn {\n\t\tbot,\n\t\tpermissions: new PermissionsResolver(bot),\n\t\tlogger\n\t};\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC","sourcesContent":["export { listen } from \"./listener.js\";\nexport type { Listener } from \"./listener.js\";\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"listener.js","sourceRoot":"","sources":["../../src/events/listener.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,MAAM,YAAY,CAAC;AAS/C,MAAM,OAAO,QAAQ;IAEV;IACA;IACA;IAHV,YACU,KAAY,EACZ,OAA+B,EAC/B,OAAgB,KAAK;QAFrB,UAAK,GAAL,KAAK,CAAO;QACZ,YAAO,GAAP,OAAO,CAAwB;QAC/B,SAAI,GAAJ,IAAI,CAAiB;IAC5B,CAAC;CACJ;AAED,MAAM,UAAU,MAAM,CAAyC,QAa9D;IACA,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;AACtE,CAAC","sourcesContent":["import { type ClientEvents } from \"discord.js\";\n\nimport type { GenericCtx } from \"../context.js\";\n\ntype ListenerHandler<Event extends keyof ClientEvents> = (\n\tctx: GenericCtx,\n\t...args: ClientEvents[Event]\n) => void | Promise<void>;\n\nexport class Listener<Event extends keyof ClientEvents> {\n\tconstructor(\n\t\treadonly event: Event,\n\t\treadonly handler: ListenerHandler<Event>,\n\t\treadonly once: boolean = false\n\t) {}\n}\n\nexport function listen<const Event extends keyof ClientEvents>(listener: {\n\t/**\n\t * The type of discord event to listen to.\n\t */\n\tevent: Event;\n\t/**\n\t * Whether the event should only be handled once.\n\t */\n\tonce?: boolean;\n\t/**\n\t * The handler for the event.\n\t */\n\thandler: (ctx: GenericCtx, ...args: ClientEvents[NoInfer<Event>]) => void | Promise<void>;\n}) {\n\treturn new Listener(listener.event, listener.handler, listener.once);\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAI/B,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAErD,cAAc,oBAAoB,CAAC","sourcesContent":["export { Bot } from \"./bot.js\";\nexport type { BotOptions } from \"./bot.js\";\nexport type { GenericCtx } from \"./context.js\";\nexport type { PermissionName, SinglePermissionResolvable } from \"./permissions.js\";\nexport { plugin, ResolvedPlugin } from \"./plugin.js\";\nexport type { Plugin, PluginOptions } from \"./plugin.js\";\nexport * from \"./utility-types.js\";\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"","sourcesContent":["export interface ILogger {\n\ttrace(...args: unknown[]): any;\n\tdebug(...args: unknown[]): any;\n\tinfo(...args: unknown[]): any;\n\twarn(...args: unknown[]): any;\n\terror(...args: unknown[]): any;\n\tfatal(...args: unknown[]): any;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/options/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC","sourcesContent":["export { o, optionsToJson } from \"./option.js\";\nexport type { GenericOption, OptionDefinitions, Args, Infer } from \"./option.js\";\nexport type {\n\tOptionalType,\n\tChoice,\n\tAttachmentOption,\n\tBooleanOption,\n\tChannelOption,\n\tIntegerOption,\n\tNumberOption,\n\tMentionableOption,\n\tRoleOption,\n\tStringOption,\n\tUserOption,\n\tAsOptional\n} from \"./options.js\";\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"option.js","sourceRoot":"","sources":["../../src/options/option.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tSlashCommandAttachmentOption,\n\tSlashCommandBooleanOption,\n\tSlashCommandChannelOption,\n\tSlashCommandIntegerOption,\n\tSlashCommandMentionableOption,\n\tSlashCommandNumberOption,\n\tSlashCommandRoleOption,\n\tSlashCommandStringOption,\n\tSlashCommandUserOption,\n\ttype APIApplicationCommandOption,\n\ttype ApplicationCommandOptionAllowedChannelTypes,\n\ttype RestOrArray\n} from \"discord.js\";\n\nimport {\n\tAttachmentOption,\n\tBooleanOption,\n\tBuilderOption,\n\tChannelOption,\n\tChoice,\n\tIntegerOption,\n\tMentionableOption,\n\tNumberOption,\n\tRoleOption,\n\tStringOption,\n\tUserOption,\n\ttype AsOptional,\n\ttype Option,\n\ttype OptionalType\n} from \"./options.js\";\nimport type { Expand } from \"../utility-types.js\";\n\nexport type GenericOption = Option<any, any>;\n\nexport function optionsToJson(options: OptionDefinitions): APIApplicationCommandOption[] {\n\treturn Object.entries(options)\n\t\t.map(([name, option]) => {\n\t\t\tif (option instanceof BuilderOption) {\n\t\t\t\tconst builder = option.getBuilder();\n\t\t\t\treturn builder.setName(name).toJSON();\n\t\t\t}\n\t\t\treturn null;\n\t\t})\n\t\t.filter((json) => json !== null);\n}\n\n/**\n * The option builder.\n *\n * This builder allows you to build options for Discord commands.\n *\n * @public\n */\nexport const o = {\n\t/**\n\t * A command attachment option.\n\t */\n\tattachment: () => {\n\t\treturn new AttachmentOption(new SlashCommandAttachmentOption(), \"required\");\n\t},\n\n\t/**\n\t * A command boolean option.\n\t */\n\tboolean: () => {\n\t\treturn new BooleanOption(new SlashCommandBooleanOption(), \"required\");\n\t},\n\n\t/**\n\t * A command channel option.\n\t * @param channelTypes The channel types.\n\t */\n\tchannel: <T extends ApplicationCommandOptionAllowedChannelTypes>(\n\t\t...channelTypes: RestOrArray<T>\n\t) => {\n\t\tconst option = new ChannelOption(new SlashCommandChannelOption(), \"required\");\n\t\treturn option.union(channelTypes.flat());\n\t},\n\n\t/**\n\t * A choice for a command option.\n\t * @param name The name of the choice.\n\t * @param value The value of the choice.\n\t */\n\tchoice: <T extends number | string>(value: T, name?: string) => {\n\t\treturn new Choice(value, name);\n\t},\n\n\t/**\n\t * A command integer option.\n\t */\n\tinteger: () => {\n\t\treturn new IntegerOption(new SlashCommandIntegerOption(), \"required\");\n\t},\n\n\t/**\n\t * A command number option.\n\t */\n\tnumber: () => {\n\t\treturn new NumberOption(new SlashCommandNumberOption(), \"required\");\n\t},\n\n\t/**\n\t * A command mentionable option.\n\t */\n\tmentionable: () => {\n\t\treturn new MentionableOption(new SlashCommandMentionableOption(), \"required\");\n\t},\n\n\t/**\n\t * A command role option.\n\t */\n\trole: () => {\n\t\treturn new RoleOption(new SlashCommandRoleOption(), \"required\");\n\t},\n\n\t/**\n\t * A command string option.\n\t */\n\tstring: () => {\n\t\treturn new StringOption(new SlashCommandStringOption(), \"required\");\n\t},\n\n\t/**\n\t * A command user option.\n\t */\n\tuser: () => {\n\t\treturn new UserOption(new SlashCommandUserOption(), \"required\");\n\t},\n\n\t/**\n\t * Allows not specifying an option for a command.\n\t * @param option The option to make optional.\n\t *\n\t * ```ts\n\t * {\n\t * requiredOption: o.string(),\n\t * optionalOption: o.optional(o.string())\n\t * }\n\t * ```\n\t */\n\toptional: <T extends GenericOption>(option: T) => {\n\t\treturn option.asOptional() as AsOptional<T>;\n\t}\n};\n\nexport type OptionDefinitions = Record<string, Option<any, OptionalType>>;\n\n/**\n * Compute the args object type from {@link OptionDefinitions}.\n *\n * @public\n */\nexport type Args<Options extends OptionDefinitions> = Expand<\n\t{\n\t\t// This `Exclude<..., undefined>` does nothing unless\n\t\t// the tsconfig.json option `\"exactOptionalPropertyTypes\": true,`\n\t\t// is used. When it is set it results in a more accurate type.\n\t\t// When it is not the `Exclude` removes `undefined` but it is\n\t\t// added again by the optional property.\n\t\t[Name in OptionalKeys<Options>]?: Exclude<Infer<Options[Name]>, undefined>;\n\t} & {\n\t\t[Name in RequiredKeys<Options>]: Infer<Options[Name]>;\n\t}\n>;\n\ntype OptionalKeys<Options extends Record<string, GenericOption>> = {\n\t[Name in keyof Options]: Options[Name][\"isOptional\"] extends \"optional\" ? Name : never;\n}[keyof Options];\n\ntype RequiredKeys<Options extends Record<string, GenericOption>> = Exclude<\n\tkeyof Options,\n\tOptionalKeys<Options>\n>;\n\n/**\n * Extract the TypeScript type from an option.\n *\n * Example usage:\n * ```ts\n * const option = o.string().union(o.choice(\"hello\"), o.choice(\"world\"));\n * type MyOption = Infer<typeof option>; // \"hello\" | \"world\"\n * ```\n * @typeParam T - The type of a {@link Option} constructed with {@link o}.\n *\n * @public\n */\nexport type Infer<T extends Option<any, OptionalType>> = T[\"type\"];\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/options/options.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tSlashCommandAttachmentOption,\n\tSlashCommandBooleanOption,\n\tSlashCommandChannelOption,\n\tSlashCommandIntegerOption,\n\tSlashCommandMentionableOption,\n\tSlashCommandNumberOption,\n\tSlashCommandRoleOption,\n\tSlashCommandStringOption,\n\tSlashCommandUserOption,\n\ttype APIApplicationCommandOptionChoice,\n\ttype ApplicationCommandNumericOptionMinMaxValueMixin,\n\ttype ApplicationCommandOptionAllowedChannelTypes,\n\ttype ApplicationCommandOptionBase,\n\ttype ApplicationCommandOptionWithAutocompleteMixin,\n\ttype ApplicationCommandOptionWithChoicesMixin,\n\ttype Attachment,\n\ttype GuildBasedChannel,\n\ttype GuildMember,\n\ttype LocalizationMap,\n\ttype RestOrArray,\n\ttype Role,\n\ttype User\n} from \"discord.js\";\n\nabstract class BaseOption<Type, IsOptional extends OptionalType = \"required\"> {\n\t/**\n\t * Only for Typescript.\n\t */\n\treadonly type!: Type;\n\n\treadonly isOptional: IsOptional;\n\n\tconstructor(isOptional: IsOptional) {\n\t\tthis.isOptional = isOptional;\n\t}\n\n\t/** @internal */\n\tabstract asOptional(): Option<Type, \"optional\">;\n}\n\nexport abstract class BuilderOption<\n\tBuilder extends ApplicationCommandOptionBase,\n\tType,\n\tIsOptional extends OptionalType = \"required\"\n> extends BaseOption<Type, IsOptional> {\n\tprotected builder: Builder;\n\n\tconstructor(builder: Builder, isOptional: IsOptional) {\n\t\tsuper(isOptional);\n\t\tthis.builder = builder.setRequired(isOptional === \"optional\" ? false : true);\n\t}\n\n\tdescribe(description: string) {\n\t\tthis.builder = this.builder.setDescription(description);\n\t\treturn this;\n\t}\n\n\tlocalize({ name, description }: { name?: LocalizationMap; description?: LocalizationMap }) {\n\t\tthis.builder = this.builder\n\t\t\t.setNameLocalizations(name ?? null)\n\t\t\t.setDescriptionLocalizations(description ?? null);\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tgetBuilder() {\n\t\treturn this.builder;\n\t}\n}\n\nexport class AttachmentOption<\n\tType = Attachment,\n\tIsOptional extends OptionalType = \"required\"\n> extends BuilderOption<SlashCommandAttachmentOption, Type, IsOptional> {\n\tconstructor(builder: SlashCommandAttachmentOption, isOptional: IsOptional) {\n\t\tsuper(builder, isOptional);\n\t}\n\n\t/** @internal */\n\tasOptional() {\n\t\treturn new AttachmentOption<Type, \"optional\">(this.builder, \"optional\");\n\t}\n}\n\nexport class BooleanOption<\n\tType = boolean,\n\tIsOptional extends OptionalType = \"required\"\n> extends BuilderOption<SlashCommandBooleanOption, Type, IsOptional> {\n\tconstructor(builder: SlashCommandBooleanOption, isOptional: IsOptional) {\n\t\tsuper(builder, isOptional);\n\t}\n\n\t/** @internal */\n\tasOptional() {\n\t\treturn new BooleanOption<Type, \"optional\">(this.builder, \"optional\");\n\t}\n}\n\nexport class ChannelOption<\n\tType = GuildBasedChannel,\n\tIsOptional extends OptionalType = \"required\"\n> extends BuilderOption<SlashCommandChannelOption, Type, IsOptional> {\n\tconstructor(builder: SlashCommandChannelOption, isOptional: IsOptional) {\n\t\tsuper(builder, isOptional);\n\t}\n\n\tunion<T extends ApplicationCommandOptionAllowedChannelTypes>(channelTypes: T[]) {\n\t\tthis.builder = this.builder.addChannelTypes(channelTypes);\n\t\treturn this as ChannelOption<\n\t\t\tExtract<\n\t\t\t\tGuildBasedChannel,\n\t\t\t\t{\n\t\t\t\t\ttype: T;\n\t\t\t\t}\n\t\t\t>,\n\t\t\tIsOptional\n\t\t>;\n\t}\n\n\t/** @internal */\n\tasOptional() {\n\t\treturn new ChannelOption<Type, \"optional\">(this.builder, \"optional\");\n\t}\n}\n\nabstract class AutocompleteOption<\n\tBuilder extends ApplicationCommandOptionBase & ApplicationCommandOptionWithAutocompleteMixin,\n\tType,\n\tIsOptional extends OptionalType = \"required\"\n> extends BuilderOption<Builder, Type, IsOptional> {\n\tautocomplete(autocomplete = true) {\n\t\tthis.builder = this.builder.setAutocomplete(autocomplete);\n\t\treturn this;\n\t}\n}\n\nexport class Choice<Type extends number | string> {\n\treadonly choice: APIApplicationCommandOptionChoice<Type>;\n\n\tconstructor(value: Type, name?: string) {\n\t\tthis.choice = {\n\t\t\tname: name ?? value.toString(),\n\t\t\tvalue\n\t\t};\n\t}\n\n\tlocalize({ name }: { name?: LocalizationMap }) {\n\t\tthis.choice.name_localizations = name ?? null;\n\t\treturn this;\n\t}\n}\n\ntype InferChoiceType<T extends ApplicationCommandOptionWithChoicesMixin<any>> =\n\tT extends ApplicationCommandOptionWithChoicesMixin<infer Type> ? Type : never;\n\nabstract class ChoicesOption<\n\tBuilder extends ApplicationCommandOptionBase &\n\t\tApplicationCommandOptionWithAutocompleteMixin &\n\t\tApplicationCommandOptionWithChoicesMixin<any>,\n\tType,\n\tIsOptional extends OptionalType = \"required\"\n> extends AutocompleteOption<Builder, Type, IsOptional> {\n\tabstract union<UnionType extends InferChoiceType<Builder>>(\n\t\t...choices: RestOrArray<Choice<UnionType>>\n\t): Option<UnionType, IsOptional>;\n}\n\nabstract class NumbericOption<\n\tBuilder extends ApplicationCommandOptionBase &\n\t\tApplicationCommandNumericOptionMinMaxValueMixin &\n\t\tApplicationCommandOptionWithAutocompleteMixin &\n\t\tApplicationCommandOptionWithChoicesMixin<number>,\n\tType = number,\n\tIsOptional extends OptionalType = \"required\"\n> extends ChoicesOption<Builder, Type, IsOptional> {\n\tmin(min: number) {\n\t\tthis.builder = this.builder.setMinValue(min);\n\t\treturn this;\n\t}\n\n\tmax(max: number) {\n\t\tthis.builder = this.builder.setMaxValue(max);\n\t\treturn this;\n\t}\n}\n\nexport class IntegerOption<\n\tType = number,\n\tIsOptional extends OptionalType = \"required\"\n> extends NumbericOption<SlashCommandIntegerOption, Type, IsOptional> {\n\tconstructor(builder: SlashCommandIntegerOption, isOptional: IsOptional) {\n\t\tsuper(builder, isOptional);\n\t}\n\n\tunion<UnionType extends number>(...choices: RestOrArray<Choice<UnionType>>) {\n\t\tthis.builder = this.builder.addChoices(choices.flat().map((choice) => choice.choice));\n\t\treturn this as unknown as IntegerOption<UnionType, IsOptional>;\n\t}\n\n\t/** @internal */\n\tasOptional() {\n\t\treturn new IntegerOption<Type, \"optional\">(this.builder, \"optional\");\n\t}\n}\n\nexport class NumberOption<\n\tType = number,\n\tIsOptional extends OptionalType = \"required\"\n> extends NumbericOption<SlashCommandNumberOption, Type, IsOptional> {\n\tconstructor(builder: SlashCommandNumberOption, isOptional: IsOptional) {\n\t\tsuper(builder, isOptional);\n\t}\n\n\tunion<UnionType extends number>(...choices: RestOrArray<Choice<UnionType>>) {\n\t\tthis.builder = this.builder.addChoices(choices.flat().map((choice) => choice.choice));\n\t\treturn this as unknown as NumberOption<UnionType, IsOptional>;\n\t}\n\n\t/** @internal */\n\tasOptional() {\n\t\treturn new NumberOption<Type, \"optional\">(this.builder, \"optional\");\n\t}\n}\n\nexport class MentionableOption<\n\tType = User | GuildMember | Role,\n\tIsOptional extends OptionalType = \"required\"\n> extends BuilderOption<SlashCommandMentionableOption, Type, IsOptional> {\n\tconstructor(builder: SlashCommandMentionableOption, isOptional: IsOptional) {\n\t\tsuper(builder, isOptional);\n\t}\n\n\t/** @internal */\n\tasOptional() {\n\t\treturn new MentionableOption<Type, \"optional\">(this.builder, \"optional\");\n\t}\n}\n\nexport class RoleOption<\n\tType = Role,\n\tIsOptional extends OptionalType = \"required\"\n> extends BuilderOption<SlashCommandRoleOption, Type, IsOptional> {\n\tconstructor(builder: SlashCommandRoleOption, isOptional: IsOptional) {\n\t\tsuper(builder, isOptional);\n\t}\n\n\t/** @internal */\n\tasOptional() {\n\t\treturn new RoleOption<Type, \"optional\">(this.builder, \"optional\");\n\t}\n}\n\nexport class StringOption<\n\tType = string,\n\tIsOptional extends OptionalType = \"required\"\n> extends ChoicesOption<SlashCommandStringOption, Type, IsOptional> {\n\tconstructor(builder: SlashCommandStringOption, isOptional: IsOptional) {\n\t\tsuper(builder, isOptional);\n\t}\n\n\tmin(min: number) {\n\t\tthis.builder = this.builder.setMinLength(min);\n\t\treturn this;\n\t}\n\n\tmax(max: number) {\n\t\tthis.builder = this.builder.setMaxLength(max);\n\t\treturn this;\n\t}\n\n\tunion<UnionType extends string>(...choices: RestOrArray<Choice<UnionType>>) {\n\t\tthis.builder = this.builder.addChoices(choices.flat().map((choice) => choice.choice));\n\t\treturn this as unknown as StringOption<UnionType, IsOptional>;\n\t}\n\n\t/** @internal */\n\tasOptional() {\n\t\treturn new StringOption<Type, \"optional\">(this.builder, \"optional\");\n\t}\n}\n\nexport class UserOption<\n\tType = User,\n\tIsOptional extends OptionalType = \"required\"\n> extends BuilderOption<SlashCommandUserOption, Type, IsOptional> {\n\tconstructor(builder: SlashCommandUserOption, isOptional: IsOptional) {\n\t\tsuper(builder, isOptional);\n\t}\n\n\t/** @internal */\n\tasOptional() {\n\t\treturn new UserOption<Type, \"optional\">(this.builder, \"optional\");\n\t}\n}\n\n/**\n * A type representing whether an option is optional or not.\n */\nexport type OptionalType = \"required\" | \"optional\";\n\n// prettier-ignore\nexport type AsOptional<T extends Option<any, OptionalType>> =\n\tT extends AttachmentOption<infer Type, OptionalType>\n\t\t? AttachmentOption<Type, \"optional\">\n\t: T extends BooleanOption<infer Type, OptionalType>\n\t\t? BooleanOption<Type, \"optional\">\n\t: T extends ChannelOption<infer Type, OptionalType>\n\t\t? ChannelOption<Type, \"optional\">\n\t: T extends IntegerOption<infer Type, OptionalType>\n\t\t? IntegerOption<Type, \"optional\">\n\t: T extends NumberOption<infer Type, OptionalType>\n\t\t? NumberOption<Type, \"optional\">\n\t: T extends MentionableOption<infer Type, OptionalType>\n\t\t? MentionableOption<Type, \"optional\">\n\t: T extends RoleOption<infer Type, OptionalType>\n\t\t? RoleOption<Type, \"optional\">\n\t: T extends StringOption<infer Type, OptionalType>\n\t\t? StringOption<Type, \"optional\">\n\t: T extends UserOption<infer Type, OptionalType>\n\t\t? UserOption<Type, \"optional\">\n\t: never;\n\nexport type Option<Type, IsOptional extends OptionalType = \"required\"> =\n\t| AttachmentOption<Type, IsOptional>\n\t| BooleanOption<Type, IsOptional>\n\t| ChannelOption<Type, IsOptional>\n\t| IntegerOption<Type, IsOptional>\n\t| NumberOption<Type, IsOptional>\n\t| MentionableOption<Type, IsOptional>\n\t| RoleOption<Type, IsOptional>\n\t| StringOption<Type, IsOptional>\n\t| UserOption<Type, IsOptional>;\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EACN,QAAQ,EACR,mBAAmB,EAKnB,MAAM,YAAY,CAAC;AAQpB,MAAM,OAAO,mBAAmB;IACF;IAA7B,YAA6B,GAAQ;QAAR,QAAG,GAAH,GAAG,CAAK;IAAG,CAAC;IAEzC,KAAK,CAAC,SAAS,CACd,WAAyC,EACzC,KAAY,EACZ,OAAgC;QAEhC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,MAAM,CAAC;QAE9B,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CACJ,MAAmB,EACnB,WAAyC,EACzC,OAAgC;QAEhC,MAAM,iBAAiB,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC;QAEvF,MAAM,kBAAkB,GAAqB,EAAE,CAAC;QAChD,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACtC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC;gBAC9C,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC;YACvD,CAAC;QACF,CAAC;QAED,IAAI,kBAAkB,CAAC,MAAM,EAAE,CAAC;YAC/B,OAAO,GAAG,CAAC,qBAAqB,EAAE;gBACjC,kBAAkB;aAClB,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC;IACb,CAAC;IAED,WAAW,CAAC,UAAsC;QACjD,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAEzC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC;QACtF,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,OAAO,KAAK,CAAC,CAAC,CAAmB,CAAC;IACnC,CAAC;CACD","sourcesContent":["import { err, NONE } from \"@l3dev/result\";\nimport {\n\tBitField,\n\tPermissionFlagsBits,\n\ttype Guild,\n\ttype GuildChannelResolvable,\n\ttype GuildMember,\n\ttype PermissionResolvable\n} from \"discord.js\";\n\nimport type { Bot } from \"./bot.js\";\n\nexport type PermissionName = keyof typeof PermissionFlagsBits;\n\nexport type SinglePermissionResolvable = Exclude<PermissionResolvable, any[]>;\n\nexport class PermissionsResolver {\n\tconstructor(private readonly bot: Bot) {}\n\n\tasync checkSelf(\n\t\tpermissions: SinglePermissionResolvable[],\n\t\tguild: Guild,\n\t\tchannel?: GuildChannelResolvable\n\t) {\n\t\tconst member = await this.bot.getMe(guild);\n\t\tif (!member.ok) return member;\n\n\t\treturn this.check(member.value, permissions, channel);\n\t}\n\n\tcheck(\n\t\tmember: GuildMember,\n\t\tpermissions: SinglePermissionResolvable[],\n\t\tchannel?: GuildChannelResolvable\n\t) {\n\t\tconst memberPermissions = channel ? member.permissionsIn(channel) : member.permissions;\n\n\t\tconst missingPermissions: PermissionName[] = [];\n\t\tfor (const permission of permissions) {\n\t\t\tif (!memberPermissions.has(permission, true)) {\n\t\t\t\tmissingPermissions.push(this.resolveName(permission));\n\t\t\t}\n\t\t}\n\n\t\tif (missingPermissions.length) {\n\t\t\treturn err(\"MISSING_PERMISSIONS\", {\n\t\t\t\tmissingPermissions\n\t\t\t});\n\t\t}\n\n\t\treturn NONE;\n\t}\n\n\tresolveName(permission: SinglePermissionResolvable): PermissionName {\n\t\tconst bit = BitField.resolve(permission);\n\n\t\tconst entry = Object.entries(PermissionFlagsBits).find(([_, value]) => value === bit);\n\t\tif (!entry) {\n\t\t\tthrow new Error(`Unknown permission: ${bit}`);\n\t\t}\n\n\t\treturn entry[0] as PermissionName;\n\t}\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAaA,MAAM,OAAO,cAAc;IAKG;IAJpB,IAAI,CAAS;IACb,QAAQ,CAAyC;IACjD,SAAS,CAAkB;IAEpC,YAA6B,OAAsB;QAAtB,YAAO,GAAP,OAAO,CAAe;QAClD,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;QACvC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IAC1C,CAAC;IAED,QAAQ,CAAC,GAAQ;QAChB,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACpC,CAAC;CACD;AAID,MAAM,UAAU,MAAM,CACrB,OAAoE;IAEpE,OAAO,CAAC,UAAU,EAAE,EAAE;QACrB,MAAM,eAAe,GAAG,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACtF,OAAO,IAAI,cAAc,CAAC,eAAe,CAAC,CAAC;IAC5C,CAAC,CAAC;AACH,CAAC","sourcesContent":["import type { SlashCommandBuilder } from \"discord.js\";\n\nimport type { Bot, BotOptions } from \"./bot.js\";\nimport type { Command } from \"./commands/command.js\";\nimport type { Listener } from \"./events/listener.js\";\n\nexport type PluginOptions = {\n\tname: string;\n\tcommands?: Command<string, SlashCommandBuilder>[];\n\tlisteners?: Listener<any>[];\n\tresolved?: (plugin: ResolvedPlugin, bot: Bot) => void;\n};\n\nexport class ResolvedPlugin {\n\treadonly name: string;\n\treadonly commands: Command<string, SlashCommandBuilder>[];\n\treadonly listeners: Listener<any>[];\n\n\tconstructor(private readonly options: PluginOptions) {\n\t\tthis.name = options.name;\n\t\tthis.commands = options.commands ?? [];\n\t\tthis.listeners = options.listeners ?? [];\n\t}\n\n\tresolved(bot: Bot) {\n\t\tthis.options.resolved?.(this, bot);\n\t}\n}\n\nexport type Plugin = (botOptions: BotOptions) => ResolvedPlugin;\n\nexport function plugin(\n\toptions: PluginOptions | ((botOptions: BotOptions) => PluginOptions)\n): Plugin {\n\treturn (botOptions) => {\n\t\tconst resolvedOptions = typeof options === \"function\" ? options(botOptions) : options;\n\t\treturn new ResolvedPlugin(resolvedOptions);\n\t};\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"utility-types.js","sourceRoot":"","sources":["../src/utility-types.ts"],"names":[],"mappings":"","sourcesContent":["export type MaybePromise<T> = T | Promise<T>;\n\n/**\n * Hack! This type causes TypeScript to simplify how it renders object types.\n *\n * It is functionally the identity for object types, but in practice it can\n * simplify expressions like `A & B`.\n */\nexport type Expand<ObjectType extends Record<any, any>> =\n\tObjectType extends Record<any, any>\n\t\t? {\n\t\t\t\t[Key in keyof ObjectType]: ObjectType[Key];\n\t\t\t}\n\t\t: never;\n\n/**\n * Convert a union type like `A | B | C` into an intersection type like\n * `A & B & C`.\n */\nexport type UnionToIntersection<UnionType> = (\n\tUnionType extends any ? (k: UnionType) => void : never\n) extends (k: infer I) => void\n\t? I\n\t: never;\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,QAAQ,EAIR,MAAM,YAAY,CAAC;AAEpB,MAAM,UAAU,iBAAiB,CAChC,GAAG,KAA8D;IAEjE,MAAM,WAAW,GAAoC,EAAE,CAAC;IAExD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI;YAAE,SAAS;QAEpB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAC3B,CAAC;aAAM,IAAI,IAAI,YAAY,QAAQ,EAAE,CAAC;YACrC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACP,WAAW,CAAC,IAAI,CAAC,IAAmC,CAAC,CAAC;QACvD,CAAC;IACF,CAAC;IAED,OAAO,WAAW,CAAC;AACpB,CAAC","sourcesContent":["import {\n\tBitField,\n\ttype BitFieldResolvable,\n\ttype MessageFlags,\n\ttype MessageFlagsString\n} from \"discord.js\";\n\nexport function mergeMessageFlags<TFlag extends MessageFlagsString, TType extends MessageFlags>(\n\t...flags: (BitFieldResolvable<TFlag, TType> | null | undefined)[]\n) {\n\tconst mergedFlags: (TFlag | TType | `${bigint}`)[] = [];\n\n\tfor (const flag of flags) {\n\t\tif (!flag) continue;\n\n\t\tif (Array.isArray(flag)) {\n\t\t\tmergedFlags.push(...flag);\n\t\t} else if (flag instanceof BitField) {\n\t\t\tmergedFlags.push(flag.bitfield);\n\t\t} else {\n\t\t\tmergedFlags.push(flag as TFlag | TType | `${bigint}`);\n\t\t}\n\t}\n\n\treturn mergedFlags;\n}\n"]}