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.
- package/build/bot.d.ts +15 -19
- package/build/bot.js +29 -140
- package/build/commands/command.d.ts +26 -7
- package/build/commands/command.js +71 -37
- package/build/commands/context.d.ts +23 -0
- package/build/commands/context.js +75 -0
- package/build/commands/diff.js +0 -1
- package/build/commands/index.d.ts +3 -1
- package/build/commands/index.js +0 -1
- package/build/commands/manager.d.ts +64 -0
- package/build/commands/manager.js +138 -0
- package/build/commands/registration.js +0 -1
- package/build/context.d.ts +1 -1
- package/build/context.js +2 -3
- package/build/events/index.d.ts +1 -0
- package/build/events/index.js +0 -1
- package/build/events/listener.js +0 -1
- package/build/events/manager.d.ts +40 -0
- package/build/events/manager.js +86 -0
- package/build/index.js +0 -1
- package/build/logger.js +0 -1
- package/build/options/index.js +0 -1
- package/build/options/option.d.ts +12 -30
- package/build/options/option.js +7 -15
- package/build/options/options.d.ts +39 -30
- package/build/options/options.js +59 -36
- package/build/permissions.d.ts +4 -4
- package/build/permissions.js +2 -3
- package/build/plugin.js +0 -1
- package/build/utility-types.js +0 -1
- package/build/utils.js +0 -1
- package/package.json +6 -3
- package/build/bot.js.map +0 -1
- package/build/commands/command.js.map +0 -1
- package/build/commands/diff.js.map +0 -1
- package/build/commands/index.js.map +0 -1
- package/build/commands/registration.js.map +0 -1
- package/build/context.js.map +0 -1
- package/build/events/index.js.map +0 -1
- package/build/events/listener.js.map +0 -1
- package/build/index.js.map +0 -1
- package/build/logger.js.map +0 -1
- package/build/options/index.js.map +0 -1
- package/build/options/option.js.map +0 -1
- package/build/options/options.js.map +0 -1
- package/build/permissions.js.map +0 -1
- package/build/plugin.js.map +0 -1
- package/build/utility-types.js.map +0 -1
- package/build/utils.js.map +0 -1
package/build/options/options.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
package/build/permissions.d.ts
CHANGED
|
@@ -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<
|
|
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
|
-
}
|
|
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
|
-
}
|
|
15
|
+
}>;
|
|
16
16
|
resolveName(permission: SinglePermissionResolvable): PermissionName;
|
|
17
17
|
}
|
package/build/permissions.js
CHANGED
|
@@ -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
|
|
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
package/build/utility-types.js
CHANGED
package/build/utils.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "discordthing",
|
|
3
|
-
"version": "0.1
|
|
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.
|
|
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"]}
|
package/build/context.js.map
DELETED
|
@@ -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"]}
|
package/build/index.js.map
DELETED
|
@@ -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"]}
|
package/build/logger.js.map
DELETED
|
@@ -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"]}
|
package/build/permissions.js.map
DELETED
|
@@ -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"]}
|
package/build/plugin.js.map
DELETED
|
@@ -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"]}
|
package/build/utils.js.map
DELETED
|
@@ -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"]}
|