commandkit 0.0.10 → 0.1.0
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/dist/index.d.mts +62 -34
- package/dist/index.d.ts +62 -34
- package/dist/index.js +185 -85
- package/dist/index.mjs +183 -84
- package/package.json +10 -3
package/dist/index.d.mts
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { Client } from 'discord.js';
|
|
3
|
-
import * as _discordjs_builders from '@discordjs/builders';
|
|
1
|
+
import { Client, Interaction, CommandInteraction, ChatInputCommandInteraction, ContextMenuCommandInteraction, PermissionResolvable, APIApplicationCommandSubcommandOption, APIApplicationCommandSubcommandGroupOption } from 'discord.js';
|
|
4
2
|
|
|
5
3
|
interface CommandKitOptions {
|
|
6
4
|
client: Client;
|
|
@@ -13,39 +11,69 @@ interface CommandKitOptions {
|
|
|
13
11
|
skipBuiltInValidations?: boolean;
|
|
14
12
|
}
|
|
15
13
|
|
|
14
|
+
interface CommandFileObject {
|
|
15
|
+
data: CommandData;
|
|
16
|
+
options?: CommandOptions;
|
|
17
|
+
run: ({}: { interaction: Interaction; client: Client; handler: CommandKit }) => void;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
interface CommandProps {
|
|
21
|
+
interaction: CommandInteraction;
|
|
22
|
+
client: Client<true>;
|
|
23
|
+
handler: CommandKit;
|
|
24
|
+
}
|
|
25
|
+
interface SlashCommandProps {
|
|
26
|
+
interaction: ChatInputCommandInteraction;
|
|
27
|
+
client: Client<true>;
|
|
28
|
+
handler: CommandKit;
|
|
29
|
+
}
|
|
30
|
+
interface ContextMenuCommandProps {
|
|
31
|
+
interaction: ContextMenuCommandInteraction;
|
|
32
|
+
client: Client<true>;
|
|
33
|
+
handler: CommandKit;
|
|
34
|
+
}
|
|
35
|
+
interface ValidationFunctionProps {
|
|
36
|
+
interaction: ChatInputCommandInteraction | ContextMenuCommandInteraction;
|
|
37
|
+
client: Client<true>;
|
|
38
|
+
commandObj: CommandObject;
|
|
39
|
+
handler: CommandKit;
|
|
40
|
+
}
|
|
41
|
+
interface CommandOptions {
|
|
42
|
+
guildOnly?: boolean;
|
|
43
|
+
devOnly?: boolean;
|
|
44
|
+
deleted?: boolean;
|
|
45
|
+
userPermissions?: PermissionResolvable;
|
|
46
|
+
botPermissions?: PermissionResolvable;
|
|
47
|
+
[key: string]: any;
|
|
48
|
+
}
|
|
49
|
+
declare enum CommandType {
|
|
50
|
+
'ChatInput' = 1,
|
|
51
|
+
'Message' = 3,
|
|
52
|
+
'User' = 2
|
|
53
|
+
}
|
|
54
|
+
type LocaleString = 'id' | 'en-US' | 'en-GB' | 'bg' | 'zh-CN' | 'zh-TW' | 'hr' | 'cs' | 'da' | 'nl' | 'fi' | 'fr' | 'de' | 'el' | 'hi' | 'hu' | 'it' | 'ja' | 'ko' | 'lt' | 'no' | 'pl' | 'pt-BR' | 'ro' | 'ru' | 'es-ES' | 'sv-SE' | 'th' | 'tr' | 'uk' | 'vi';
|
|
55
|
+
type CommandData = {
|
|
56
|
+
name: string;
|
|
57
|
+
description: string;
|
|
58
|
+
type?: CommandType;
|
|
59
|
+
name_localizations?: Partial<Record<LocaleString, string | null>>;
|
|
60
|
+
description_localizations?: Partial<Record<LocaleString, string | null>>;
|
|
61
|
+
dm_permission?: boolean;
|
|
62
|
+
default_member_permissions?: string;
|
|
63
|
+
nsfw?: boolean;
|
|
64
|
+
options?: Array<APIApplicationCommandSubcommandOption | APIApplicationCommandSubcommandGroupOption>;
|
|
65
|
+
};
|
|
66
|
+
type CommandObject = Omit<CommandFileObject, 'run'>;
|
|
67
|
+
|
|
16
68
|
declare class CommandKit {
|
|
17
69
|
#private;
|
|
18
70
|
constructor({ ...options }: CommandKitOptions);
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
options?: discord_js.APIApplicationCommandOption[] | undefined;
|
|
26
|
-
};
|
|
27
|
-
options?: {
|
|
28
|
-
guildOnly?: boolean | undefined;
|
|
29
|
-
devOnly?: boolean | undefined;
|
|
30
|
-
deleted?: boolean | undefined;
|
|
31
|
-
userPermissions?: discord_js.PermissionResolvable[] | undefined;
|
|
32
|
-
botPermissions?: discord_js.PermissionResolvable[] | undefined;
|
|
33
|
-
} | undefined;
|
|
34
|
-
} | {
|
|
35
|
-
data: _discordjs_builders.ContextMenuCommandBuilder | {
|
|
36
|
-
name: string;
|
|
37
|
-
name_localizations?: any;
|
|
38
|
-
type: _discordjs_builders.ContextMenuCommandType;
|
|
39
|
-
dm_permission?: boolean | undefined;
|
|
40
|
-
};
|
|
41
|
-
options?: {
|
|
42
|
-
guildOnly?: boolean | undefined;
|
|
43
|
-
devOnly?: boolean | undefined;
|
|
44
|
-
deleted?: boolean | undefined;
|
|
45
|
-
userPermissions?: discord_js.PermissionResolvable[] | undefined;
|
|
46
|
-
botPermissions?: discord_js.PermissionResolvable[] | undefined;
|
|
47
|
-
} | undefined;
|
|
48
|
-
})[];
|
|
71
|
+
/**
|
|
72
|
+
* Returns all the commands that CommandKit is handling.
|
|
73
|
+
*
|
|
74
|
+
* @returns An array of command objects
|
|
75
|
+
*/
|
|
76
|
+
get commands(): CommandObject[];
|
|
49
77
|
}
|
|
50
78
|
|
|
51
|
-
export { CommandKit };
|
|
79
|
+
export { CommandData, CommandKit, CommandObject, CommandOptions, CommandProps, CommandType, ContextMenuCommandProps, SlashCommandProps, ValidationFunctionProps };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { Client } from 'discord.js';
|
|
3
|
-
import * as _discordjs_builders from '@discordjs/builders';
|
|
1
|
+
import { Client, Interaction, CommandInteraction, ChatInputCommandInteraction, ContextMenuCommandInteraction, PermissionResolvable, APIApplicationCommandSubcommandOption, APIApplicationCommandSubcommandGroupOption } from 'discord.js';
|
|
4
2
|
|
|
5
3
|
interface CommandKitOptions {
|
|
6
4
|
client: Client;
|
|
@@ -13,39 +11,69 @@ interface CommandKitOptions {
|
|
|
13
11
|
skipBuiltInValidations?: boolean;
|
|
14
12
|
}
|
|
15
13
|
|
|
14
|
+
interface CommandFileObject {
|
|
15
|
+
data: CommandData;
|
|
16
|
+
options?: CommandOptions;
|
|
17
|
+
run: ({}: { interaction: Interaction; client: Client; handler: CommandKit }) => void;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
interface CommandProps {
|
|
21
|
+
interaction: CommandInteraction;
|
|
22
|
+
client: Client<true>;
|
|
23
|
+
handler: CommandKit;
|
|
24
|
+
}
|
|
25
|
+
interface SlashCommandProps {
|
|
26
|
+
interaction: ChatInputCommandInteraction;
|
|
27
|
+
client: Client<true>;
|
|
28
|
+
handler: CommandKit;
|
|
29
|
+
}
|
|
30
|
+
interface ContextMenuCommandProps {
|
|
31
|
+
interaction: ContextMenuCommandInteraction;
|
|
32
|
+
client: Client<true>;
|
|
33
|
+
handler: CommandKit;
|
|
34
|
+
}
|
|
35
|
+
interface ValidationFunctionProps {
|
|
36
|
+
interaction: ChatInputCommandInteraction | ContextMenuCommandInteraction;
|
|
37
|
+
client: Client<true>;
|
|
38
|
+
commandObj: CommandObject;
|
|
39
|
+
handler: CommandKit;
|
|
40
|
+
}
|
|
41
|
+
interface CommandOptions {
|
|
42
|
+
guildOnly?: boolean;
|
|
43
|
+
devOnly?: boolean;
|
|
44
|
+
deleted?: boolean;
|
|
45
|
+
userPermissions?: PermissionResolvable;
|
|
46
|
+
botPermissions?: PermissionResolvable;
|
|
47
|
+
[key: string]: any;
|
|
48
|
+
}
|
|
49
|
+
declare enum CommandType {
|
|
50
|
+
'ChatInput' = 1,
|
|
51
|
+
'Message' = 3,
|
|
52
|
+
'User' = 2
|
|
53
|
+
}
|
|
54
|
+
type LocaleString = 'id' | 'en-US' | 'en-GB' | 'bg' | 'zh-CN' | 'zh-TW' | 'hr' | 'cs' | 'da' | 'nl' | 'fi' | 'fr' | 'de' | 'el' | 'hi' | 'hu' | 'it' | 'ja' | 'ko' | 'lt' | 'no' | 'pl' | 'pt-BR' | 'ro' | 'ru' | 'es-ES' | 'sv-SE' | 'th' | 'tr' | 'uk' | 'vi';
|
|
55
|
+
type CommandData = {
|
|
56
|
+
name: string;
|
|
57
|
+
description: string;
|
|
58
|
+
type?: CommandType;
|
|
59
|
+
name_localizations?: Partial<Record<LocaleString, string | null>>;
|
|
60
|
+
description_localizations?: Partial<Record<LocaleString, string | null>>;
|
|
61
|
+
dm_permission?: boolean;
|
|
62
|
+
default_member_permissions?: string;
|
|
63
|
+
nsfw?: boolean;
|
|
64
|
+
options?: Array<APIApplicationCommandSubcommandOption | APIApplicationCommandSubcommandGroupOption>;
|
|
65
|
+
};
|
|
66
|
+
type CommandObject = Omit<CommandFileObject, 'run'>;
|
|
67
|
+
|
|
16
68
|
declare class CommandKit {
|
|
17
69
|
#private;
|
|
18
70
|
constructor({ ...options }: CommandKitOptions);
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
options?: discord_js.APIApplicationCommandOption[] | undefined;
|
|
26
|
-
};
|
|
27
|
-
options?: {
|
|
28
|
-
guildOnly?: boolean | undefined;
|
|
29
|
-
devOnly?: boolean | undefined;
|
|
30
|
-
deleted?: boolean | undefined;
|
|
31
|
-
userPermissions?: discord_js.PermissionResolvable[] | undefined;
|
|
32
|
-
botPermissions?: discord_js.PermissionResolvable[] | undefined;
|
|
33
|
-
} | undefined;
|
|
34
|
-
} | {
|
|
35
|
-
data: _discordjs_builders.ContextMenuCommandBuilder | {
|
|
36
|
-
name: string;
|
|
37
|
-
name_localizations?: any;
|
|
38
|
-
type: _discordjs_builders.ContextMenuCommandType;
|
|
39
|
-
dm_permission?: boolean | undefined;
|
|
40
|
-
};
|
|
41
|
-
options?: {
|
|
42
|
-
guildOnly?: boolean | undefined;
|
|
43
|
-
devOnly?: boolean | undefined;
|
|
44
|
-
deleted?: boolean | undefined;
|
|
45
|
-
userPermissions?: discord_js.PermissionResolvable[] | undefined;
|
|
46
|
-
botPermissions?: discord_js.PermissionResolvable[] | undefined;
|
|
47
|
-
} | undefined;
|
|
48
|
-
})[];
|
|
71
|
+
/**
|
|
72
|
+
* Returns all the commands that CommandKit is handling.
|
|
73
|
+
*
|
|
74
|
+
* @returns An array of command objects
|
|
75
|
+
*/
|
|
76
|
+
get commands(): CommandObject[];
|
|
49
77
|
}
|
|
50
78
|
|
|
51
|
-
export { CommandKit };
|
|
79
|
+
export { CommandData, CommandKit, CommandObject, CommandOptions, CommandProps, CommandType, ContextMenuCommandProps, SlashCommandProps, ValidationFunctionProps };
|
package/dist/index.js
CHANGED
|
@@ -30,7 +30,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
30
30
|
// src/index.ts
|
|
31
31
|
var src_exports = {};
|
|
32
32
|
__export(src_exports, {
|
|
33
|
-
CommandKit: () => CommandKit
|
|
33
|
+
CommandKit: () => CommandKit,
|
|
34
|
+
CommandType: () => CommandType
|
|
34
35
|
});
|
|
35
36
|
module.exports = __toCommonJS(src_exports);
|
|
36
37
|
|
|
@@ -78,31 +79,34 @@ function toFileURL(filePath) {
|
|
|
78
79
|
}
|
|
79
80
|
|
|
80
81
|
// src/handlers/command-handler/validations/botPermissions.ts
|
|
81
|
-
function botPermissions_default({
|
|
82
|
-
interaction,
|
|
83
|
-
targetCommand
|
|
84
|
-
}) {
|
|
82
|
+
function botPermissions_default({ interaction, targetCommand }) {
|
|
85
83
|
const botMember = interaction.guild?.members.me;
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
84
|
+
let commandPermissions = targetCommand.options?.botPermissions;
|
|
85
|
+
if (!botMember || !commandPermissions)
|
|
86
|
+
return;
|
|
87
|
+
if (!Array.isArray(commandPermissions)) {
|
|
88
|
+
commandPermissions = [commandPermissions];
|
|
89
|
+
}
|
|
90
|
+
const missingPermissions = [];
|
|
91
|
+
for (const permission of commandPermissions) {
|
|
92
|
+
const hasPermission = botMember.permissions.has(permission);
|
|
93
|
+
if (!hasPermission) {
|
|
94
|
+
missingPermissions.push(`\`${permission.toString()}\``);
|
|
96
95
|
}
|
|
97
96
|
}
|
|
97
|
+
if (missingPermissions.length) {
|
|
98
|
+
interaction.reply({
|
|
99
|
+
content: `\u274C I do not have enough permissions to execute this command. Missing: ${missingPermissions.join(
|
|
100
|
+
", "
|
|
101
|
+
)}`,
|
|
102
|
+
ephemeral: true
|
|
103
|
+
});
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
98
106
|
}
|
|
99
107
|
|
|
100
108
|
// src/handlers/command-handler/validations/devOnly.ts
|
|
101
|
-
function devOnly_default({
|
|
102
|
-
interaction,
|
|
103
|
-
targetCommand,
|
|
104
|
-
handlerData
|
|
105
|
-
}) {
|
|
109
|
+
function devOnly_default({ interaction, targetCommand, handlerData }) {
|
|
106
110
|
if (targetCommand.options?.devOnly) {
|
|
107
111
|
if (interaction.inGuild() && !handlerData.devGuildIds.includes(interaction.guildId)) {
|
|
108
112
|
interaction.reply({
|
|
@@ -111,9 +115,7 @@ function devOnly_default({
|
|
|
111
115
|
});
|
|
112
116
|
return true;
|
|
113
117
|
}
|
|
114
|
-
const guildMember = interaction.guild?.members.cache.get(
|
|
115
|
-
interaction.user.id
|
|
116
|
-
);
|
|
118
|
+
const guildMember = interaction.guild?.members.cache.get(interaction.user.id);
|
|
117
119
|
const memberRoles = guildMember?.roles.cache;
|
|
118
120
|
let hasDevRole = false;
|
|
119
121
|
memberRoles?.forEach((role) => {
|
|
@@ -133,10 +135,7 @@ function devOnly_default({
|
|
|
133
135
|
}
|
|
134
136
|
|
|
135
137
|
// src/handlers/command-handler/validations/guildOnly.ts
|
|
136
|
-
function guildOnly_default({
|
|
137
|
-
interaction,
|
|
138
|
-
targetCommand
|
|
139
|
-
}) {
|
|
138
|
+
function guildOnly_default({ interaction, targetCommand }) {
|
|
140
139
|
if (targetCommand.options?.guildOnly && !interaction.inGuild()) {
|
|
141
140
|
interaction.reply({
|
|
142
141
|
content: "\u274C This command can only be used inside a server.",
|
|
@@ -147,23 +146,30 @@ function guildOnly_default({
|
|
|
147
146
|
}
|
|
148
147
|
|
|
149
148
|
// src/handlers/command-handler/validations/userPermissions.ts
|
|
150
|
-
function userPermissions_default({
|
|
151
|
-
interaction,
|
|
152
|
-
targetCommand
|
|
153
|
-
}) {
|
|
149
|
+
function userPermissions_default({ interaction, targetCommand }) {
|
|
154
150
|
const memberPermissions = interaction.memberPermissions;
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
151
|
+
let commandPermissions = targetCommand.options?.userPermissions;
|
|
152
|
+
if (!memberPermissions || !commandPermissions)
|
|
153
|
+
return;
|
|
154
|
+
if (!Array.isArray(commandPermissions)) {
|
|
155
|
+
commandPermissions = [commandPermissions];
|
|
156
|
+
}
|
|
157
|
+
const missingPermissions = [];
|
|
158
|
+
for (const permission of commandPermissions) {
|
|
159
|
+
const hasPermission = memberPermissions.has(permission);
|
|
160
|
+
if (!hasPermission) {
|
|
161
|
+
missingPermissions.push(`\`${permission.toString()}\``);
|
|
165
162
|
}
|
|
166
163
|
}
|
|
164
|
+
if (missingPermissions.length) {
|
|
165
|
+
interaction.reply({
|
|
166
|
+
content: `\u274C You do not have enough permissions to run this command. Missing: ${missingPermissions.join(
|
|
167
|
+
", "
|
|
168
|
+
)}`,
|
|
169
|
+
ephemeral: true
|
|
170
|
+
});
|
|
171
|
+
return true;
|
|
172
|
+
}
|
|
167
173
|
}
|
|
168
174
|
|
|
169
175
|
// src/handlers/command-handler/validations/index.ts
|
|
@@ -185,7 +191,7 @@ function areSlashCommandsDifferent(appCommand, localCommand) {
|
|
|
185
191
|
}
|
|
186
192
|
|
|
187
193
|
// src/handlers/command-handler/functions/registerCommands.ts
|
|
188
|
-
var
|
|
194
|
+
var import_safe = __toESM(require("colors/safe"));
|
|
189
195
|
async function registerCommands(commandHandler) {
|
|
190
196
|
const client = commandHandler._data.client;
|
|
191
197
|
const devGuildIds = commandHandler._data.devGuildIds;
|
|
@@ -195,7 +201,11 @@ async function registerCommands(commandHandler) {
|
|
|
195
201
|
for (const devGuildId of devGuildIds) {
|
|
196
202
|
const guild = client.guilds.cache.get(devGuildId);
|
|
197
203
|
if (!guild) {
|
|
198
|
-
console.log(
|
|
204
|
+
console.log(
|
|
205
|
+
import_safe.default.yellow(
|
|
206
|
+
`\u23E9 Ignoring: Guild ${devGuildId} does not exist or client isn't in this guild.`
|
|
207
|
+
)
|
|
208
|
+
);
|
|
199
209
|
continue;
|
|
200
210
|
}
|
|
201
211
|
devGuilds.push(guild);
|
|
@@ -209,58 +219,92 @@ async function registerCommands(commandHandler) {
|
|
|
209
219
|
devGuildCommands.push(guildCommands);
|
|
210
220
|
}
|
|
211
221
|
for (const command of commands) {
|
|
222
|
+
let commandData = command.data;
|
|
212
223
|
if (command.options?.deleted) {
|
|
213
|
-
const targetCommand = appCommands?.cache.find(
|
|
224
|
+
const targetCommand = appCommands?.cache.find(
|
|
225
|
+
(cmd) => cmd.name === commandData.name
|
|
226
|
+
);
|
|
214
227
|
if (!targetCommand) {
|
|
215
|
-
console.log(
|
|
228
|
+
console.log(
|
|
229
|
+
import_safe.default.yellow(
|
|
230
|
+
`\u23E9 Ignoring: Command "${commandData.name}" is globally marked as deleted.`
|
|
231
|
+
)
|
|
232
|
+
);
|
|
216
233
|
} else {
|
|
217
234
|
targetCommand.delete().then(() => {
|
|
218
|
-
console.log(
|
|
235
|
+
console.log(
|
|
236
|
+
import_safe.default.green(`\u{1F6AE} Deleted command "${commandData.name}" globally.`)
|
|
237
|
+
);
|
|
219
238
|
});
|
|
220
239
|
}
|
|
221
240
|
for (const guildCommands of devGuildCommands) {
|
|
222
|
-
const targetCommand2 = guildCommands.cache.find(
|
|
241
|
+
const targetCommand2 = guildCommands.cache.find(
|
|
242
|
+
(cmd) => cmd.name === commandData.name
|
|
243
|
+
);
|
|
223
244
|
if (!targetCommand2) {
|
|
224
245
|
console.log(
|
|
225
|
-
|
|
246
|
+
import_safe.default.yellow(
|
|
247
|
+
`\u23E9 Ignoring: Command "${commandData.name}" is marked as deleted for ${guildCommands.guild.name}.`
|
|
248
|
+
)
|
|
226
249
|
);
|
|
227
250
|
} else {
|
|
228
251
|
targetCommand2.delete().then(() => {
|
|
229
252
|
console.log(
|
|
230
|
-
|
|
253
|
+
import_safe.default.green(
|
|
254
|
+
`\u{1F6AE} Deleted command "${commandData.name}" in ${guildCommands.guild.name}.`
|
|
255
|
+
)
|
|
231
256
|
);
|
|
232
257
|
});
|
|
233
258
|
}
|
|
234
259
|
}
|
|
235
260
|
continue;
|
|
236
261
|
}
|
|
237
|
-
let commandData = command.data;
|
|
238
262
|
let editedCommand = false;
|
|
239
|
-
const appGlobalCommand = appCommands?.cache.find(
|
|
263
|
+
const appGlobalCommand = appCommands?.cache.find(
|
|
264
|
+
(cmd) => cmd.name === commandData.name
|
|
265
|
+
);
|
|
240
266
|
if (appGlobalCommand) {
|
|
241
|
-
const commandsAreDifferent = areSlashCommandsDifferent(
|
|
267
|
+
const commandsAreDifferent = areSlashCommandsDifferent(
|
|
268
|
+
appGlobalCommand,
|
|
269
|
+
commandData
|
|
270
|
+
);
|
|
242
271
|
if (commandsAreDifferent) {
|
|
243
272
|
appGlobalCommand.edit(commandData).then(() => {
|
|
244
|
-
console.log(
|
|
273
|
+
console.log(
|
|
274
|
+
import_safe.default.green(`\u2705 Edited command "${commandData.name}" globally.`)
|
|
275
|
+
);
|
|
245
276
|
}).catch((error) => {
|
|
246
|
-
console.log(
|
|
277
|
+
console.log(
|
|
278
|
+
import_safe.default.red(
|
|
279
|
+
`\u274C Failed to edit command "${commandData.name}" globally.`
|
|
280
|
+
)
|
|
281
|
+
);
|
|
247
282
|
console.error(error);
|
|
248
283
|
});
|
|
249
284
|
editedCommand = true;
|
|
250
285
|
}
|
|
251
286
|
}
|
|
252
287
|
for (const guildCommands of devGuildCommands) {
|
|
253
|
-
const appGuildCommand = guildCommands.cache.find(
|
|
288
|
+
const appGuildCommand = guildCommands.cache.find(
|
|
289
|
+
(cmd) => cmd.name === commandData.name
|
|
290
|
+
);
|
|
254
291
|
if (appGuildCommand) {
|
|
255
|
-
const commandsAreDifferent = areSlashCommandsDifferent(
|
|
292
|
+
const commandsAreDifferent = areSlashCommandsDifferent(
|
|
293
|
+
appGuildCommand,
|
|
294
|
+
commandData
|
|
295
|
+
);
|
|
256
296
|
if (commandsAreDifferent) {
|
|
257
297
|
appGuildCommand.edit(commandData).then(() => {
|
|
258
298
|
console.log(
|
|
259
|
-
|
|
299
|
+
import_safe.default.green(
|
|
300
|
+
`\u2705 Edited command "${commandData.name}" in ${guildCommands.guild.name}.`
|
|
301
|
+
)
|
|
260
302
|
);
|
|
261
303
|
}).catch((error) => {
|
|
262
304
|
console.log(
|
|
263
|
-
|
|
305
|
+
import_safe.default.red(
|
|
306
|
+
`\u274C Failed to edit command "${commandData.name}" in ${guildCommands.guild.name}.`
|
|
307
|
+
)
|
|
264
308
|
);
|
|
265
309
|
console.error(error);
|
|
266
310
|
});
|
|
@@ -273,29 +317,47 @@ async function registerCommands(commandHandler) {
|
|
|
273
317
|
if (command.options?.devOnly) {
|
|
274
318
|
if (!devGuilds.length) {
|
|
275
319
|
console.log(
|
|
276
|
-
|
|
320
|
+
import_safe.default.yellow(
|
|
321
|
+
`\u23E9 Ignoring: Cannot register command "${commandData.name}" as no valid "devGuildIds" were provided.`
|
|
322
|
+
)
|
|
277
323
|
);
|
|
278
324
|
continue;
|
|
279
325
|
}
|
|
280
326
|
for (const guild of devGuilds) {
|
|
281
|
-
const cmdExists = guild.commands.cache.some(
|
|
327
|
+
const cmdExists = guild.commands.cache.some(
|
|
328
|
+
(cmd) => cmd.name === commandData.name
|
|
329
|
+
);
|
|
282
330
|
if (cmdExists)
|
|
283
331
|
continue;
|
|
284
|
-
guild?.commands.create(
|
|
285
|
-
console.log(
|
|
332
|
+
guild?.commands.create(commandData).then(() => {
|
|
333
|
+
console.log(
|
|
334
|
+
import_safe.default.green(
|
|
335
|
+
`\u2705 Registered command "${commandData.name}" in ${guild.name}.`
|
|
336
|
+
)
|
|
337
|
+
);
|
|
286
338
|
}).catch((error) => {
|
|
287
|
-
console.log(
|
|
339
|
+
console.log(
|
|
340
|
+
import_safe.default.red(
|
|
341
|
+
`\u274C Failed to register command "${commandData.name}" in ${guild.name}.`
|
|
342
|
+
)
|
|
343
|
+
);
|
|
288
344
|
console.error(error);
|
|
289
345
|
});
|
|
290
346
|
}
|
|
291
347
|
} else {
|
|
292
|
-
const cmdExists = appCommands?.cache.some((cmd) => cmd.name ===
|
|
348
|
+
const cmdExists = appCommands?.cache.some((cmd) => cmd.name === commandData.name);
|
|
293
349
|
if (cmdExists)
|
|
294
350
|
continue;
|
|
295
|
-
appCommands?.create(
|
|
296
|
-
console.log(
|
|
351
|
+
appCommands?.create(commandData).then(() => {
|
|
352
|
+
console.log(
|
|
353
|
+
import_safe.default.green(`\u2705 Registered command "${commandData.name}" globally.`)
|
|
354
|
+
);
|
|
297
355
|
}).catch((error) => {
|
|
298
|
-
console.log(
|
|
356
|
+
console.log(
|
|
357
|
+
import_safe.default.red(
|
|
358
|
+
`\u274C Failed to register command "${commandData.name}" globally.`
|
|
359
|
+
)
|
|
360
|
+
);
|
|
299
361
|
console.error(error);
|
|
300
362
|
});
|
|
301
363
|
}
|
|
@@ -306,10 +368,13 @@ async function registerCommands(commandHandler) {
|
|
|
306
368
|
// src/handlers/command-handler/functions/handleCommands.ts
|
|
307
369
|
function handleCommands(commandHandler) {
|
|
308
370
|
const client = commandHandler._data.client;
|
|
371
|
+
const handler = commandHandler._data.commandKitInstance;
|
|
309
372
|
client.on("interactionCreate", async (interaction) => {
|
|
310
373
|
if (!interaction.isChatInputCommand() && !interaction.isContextMenuCommand())
|
|
311
374
|
return;
|
|
312
|
-
const targetCommand = commandHandler._data.commands.find(
|
|
375
|
+
const targetCommand = commandHandler._data.commands.find(
|
|
376
|
+
(cmd) => cmd.data.name === interaction.commandName
|
|
377
|
+
);
|
|
313
378
|
if (!targetCommand)
|
|
314
379
|
return;
|
|
315
380
|
const { data, options, run, ...rest } = targetCommand;
|
|
@@ -323,7 +388,8 @@ function handleCommands(commandHandler) {
|
|
|
323
388
|
const stopValidationLoop = await validationFunction({
|
|
324
389
|
interaction,
|
|
325
390
|
client,
|
|
326
|
-
commandObj
|
|
391
|
+
commandObj,
|
|
392
|
+
handler
|
|
327
393
|
});
|
|
328
394
|
if (stopValidationLoop) {
|
|
329
395
|
canRun = false;
|
|
@@ -347,12 +413,12 @@ function handleCommands(commandHandler) {
|
|
|
347
413
|
}
|
|
348
414
|
if (!canRun)
|
|
349
415
|
return;
|
|
350
|
-
targetCommand.run({ interaction, client });
|
|
416
|
+
targetCommand.run({ interaction, client, handler });
|
|
351
417
|
});
|
|
352
418
|
}
|
|
353
419
|
|
|
354
420
|
// src/handlers/command-handler/CommandHandler.ts
|
|
355
|
-
var
|
|
421
|
+
var import_safe2 = __toESM(require("colors/safe"));
|
|
356
422
|
var CommandHandler = class {
|
|
357
423
|
_data;
|
|
358
424
|
constructor({ ...options }) {
|
|
@@ -379,11 +445,17 @@ var CommandHandler = class {
|
|
|
379
445
|
if (commandObj.default)
|
|
380
446
|
commandObj = commandObj.default;
|
|
381
447
|
if (!commandObj.data) {
|
|
382
|
-
console.log(
|
|
448
|
+
console.log(
|
|
449
|
+
import_safe2.default.yellow(
|
|
450
|
+
`\u23E9 Ignoring: Command ${compactFilePath} does not export "data".`
|
|
451
|
+
)
|
|
452
|
+
);
|
|
383
453
|
continue;
|
|
384
454
|
}
|
|
385
455
|
if (!commandObj.run) {
|
|
386
|
-
console.log(
|
|
456
|
+
console.log(
|
|
457
|
+
import_safe2.default.yellow(`\u23E9 Ignoring: Command ${compactFilePath} does not export "run".`)
|
|
458
|
+
);
|
|
387
459
|
continue;
|
|
388
460
|
}
|
|
389
461
|
this._data.commands.push(commandObj);
|
|
@@ -406,7 +478,7 @@ var CommandHandler = class {
|
|
|
406
478
|
};
|
|
407
479
|
|
|
408
480
|
// src/handlers/event-handler/EventHandler.ts
|
|
409
|
-
var
|
|
481
|
+
var import_safe3 = __toESM(require("colors/safe"));
|
|
410
482
|
var EventHandler = class {
|
|
411
483
|
#data;
|
|
412
484
|
constructor({ ...options }) {
|
|
@@ -436,7 +508,11 @@ var EventHandler = class {
|
|
|
436
508
|
let eventFunction = (await import(modulePath)).default;
|
|
437
509
|
const compactFilePath = eventFilePath.split(process.cwd())[1] || eventFilePath;
|
|
438
510
|
if (typeof eventFunction !== "function") {
|
|
439
|
-
console.log(
|
|
511
|
+
console.log(
|
|
512
|
+
import_safe3.default.yellow(
|
|
513
|
+
`\u23E9 Ignoring: Event ${compactFilePath} does not export a function.`
|
|
514
|
+
)
|
|
515
|
+
);
|
|
440
516
|
continue;
|
|
441
517
|
}
|
|
442
518
|
eventObj.functions.push(eventFunction);
|
|
@@ -445,10 +521,11 @@ var EventHandler = class {
|
|
|
445
521
|
}
|
|
446
522
|
#registerEvents() {
|
|
447
523
|
const client = this.#data.client;
|
|
524
|
+
const handler = this.#data.commandKitInstance;
|
|
448
525
|
for (const eventObj of this.#data.events) {
|
|
449
526
|
client.on(eventObj.name, async (...params) => {
|
|
450
527
|
for (const eventFunction of eventObj.functions) {
|
|
451
|
-
const stopEventLoop = await eventFunction(...params, client);
|
|
528
|
+
const stopEventLoop = await eventFunction(...params, client, handler);
|
|
452
529
|
if (stopEventLoop) {
|
|
453
530
|
break;
|
|
454
531
|
}
|
|
@@ -462,7 +539,7 @@ var EventHandler = class {
|
|
|
462
539
|
};
|
|
463
540
|
|
|
464
541
|
// src/handlers/validation-handler/ValidationHandler.ts
|
|
465
|
-
var
|
|
542
|
+
var import_safe4 = __toESM(require("colors/safe"));
|
|
466
543
|
var ValidationHandler = class {
|
|
467
544
|
#data;
|
|
468
545
|
constructor({ ...options }) {
|
|
@@ -483,7 +560,11 @@ var ValidationHandler = class {
|
|
|
483
560
|
let validationFunction = (await import(modulePath)).default;
|
|
484
561
|
const compactFilePath = validationFilePath.split(process.cwd())[1] || validationFilePath;
|
|
485
562
|
if (typeof validationFunction !== "function") {
|
|
486
|
-
console.log(
|
|
563
|
+
console.log(
|
|
564
|
+
import_safe4.default.yellow(
|
|
565
|
+
`\u23E9 Ignoring: Validation ${compactFilePath} does not export a function.`
|
|
566
|
+
)
|
|
567
|
+
);
|
|
487
568
|
continue;
|
|
488
569
|
}
|
|
489
570
|
this.#data.validations.push(validationFunction);
|
|
@@ -495,15 +576,17 @@ var ValidationHandler = class {
|
|
|
495
576
|
};
|
|
496
577
|
|
|
497
578
|
// src/CommandKit.ts
|
|
498
|
-
var
|
|
579
|
+
var import_safe5 = __toESM(require("colors/safe"));
|
|
499
580
|
var CommandKit = class {
|
|
500
581
|
#data;
|
|
501
582
|
constructor({ ...options }) {
|
|
502
583
|
if (!options.client) {
|
|
503
|
-
throw new Error('"client" is required when instantiating CommandKit.'
|
|
584
|
+
throw new Error(import_safe5.default.red('"client" is required when instantiating CommandKit.'));
|
|
504
585
|
}
|
|
505
586
|
if (options.validationsPath && !options.commandsPath) {
|
|
506
|
-
throw new Error(
|
|
587
|
+
throw new Error(
|
|
588
|
+
import_safe5.default.red('"commandsPath" is required when "validationsPath" is set.')
|
|
589
|
+
);
|
|
507
590
|
}
|
|
508
591
|
this.#data = {
|
|
509
592
|
...options,
|
|
@@ -515,7 +598,8 @@ var CommandKit = class {
|
|
|
515
598
|
if (this.#data.eventsPath) {
|
|
516
599
|
const eventHandler = new EventHandler({
|
|
517
600
|
client: this.#data.client,
|
|
518
|
-
eventsPath: this.#data.eventsPath
|
|
601
|
+
eventsPath: this.#data.eventsPath,
|
|
602
|
+
commandKitInstance: this
|
|
519
603
|
});
|
|
520
604
|
await eventHandler.init();
|
|
521
605
|
}
|
|
@@ -535,20 +619,36 @@ var CommandKit = class {
|
|
|
535
619
|
devUserIds: this.#data.devUserIds || [],
|
|
536
620
|
devRoleIds: this.#data.devRoleIds || [],
|
|
537
621
|
customValidations: validationFunctions,
|
|
538
|
-
skipBuiltInValidations: this.#data.skipBuiltInValidations || false
|
|
622
|
+
skipBuiltInValidations: this.#data.skipBuiltInValidations || false,
|
|
623
|
+
commandKitInstance: this
|
|
539
624
|
});
|
|
540
625
|
await commandHandler.init();
|
|
541
626
|
this.#data.commands = commandHandler.commands;
|
|
542
627
|
}
|
|
543
628
|
}
|
|
629
|
+
/**
|
|
630
|
+
* Returns all the commands that CommandKit is handling.
|
|
631
|
+
*
|
|
632
|
+
* @returns An array of command objects
|
|
633
|
+
*/
|
|
544
634
|
get commands() {
|
|
545
|
-
|
|
635
|
+
const commands = this.#data.commands.map((cmd) => {
|
|
546
636
|
const { run, ...command } = cmd;
|
|
547
637
|
return command;
|
|
548
638
|
});
|
|
639
|
+
return commands;
|
|
549
640
|
}
|
|
550
641
|
};
|
|
642
|
+
|
|
643
|
+
// src/types/index.ts
|
|
644
|
+
var CommandType = /* @__PURE__ */ ((CommandType2) => {
|
|
645
|
+
CommandType2[CommandType2["ChatInput"] = 1] = "ChatInput";
|
|
646
|
+
CommandType2[CommandType2["Message"] = 3] = "Message";
|
|
647
|
+
CommandType2[CommandType2["User"] = 2] = "User";
|
|
648
|
+
return CommandType2;
|
|
649
|
+
})(CommandType || {});
|
|
551
650
|
// Annotate the CommonJS export names for ESM import in node:
|
|
552
651
|
0 && (module.exports = {
|
|
553
|
-
CommandKit
|
|
652
|
+
CommandKit,
|
|
653
|
+
CommandType
|
|
554
654
|
});
|
package/dist/index.mjs
CHANGED
|
@@ -42,31 +42,34 @@ function toFileURL(filePath) {
|
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
// src/handlers/command-handler/validations/botPermissions.ts
|
|
45
|
-
function botPermissions_default({
|
|
46
|
-
interaction,
|
|
47
|
-
targetCommand
|
|
48
|
-
}) {
|
|
45
|
+
function botPermissions_default({ interaction, targetCommand }) {
|
|
49
46
|
const botMember = interaction.guild?.members.me;
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
47
|
+
let commandPermissions = targetCommand.options?.botPermissions;
|
|
48
|
+
if (!botMember || !commandPermissions)
|
|
49
|
+
return;
|
|
50
|
+
if (!Array.isArray(commandPermissions)) {
|
|
51
|
+
commandPermissions = [commandPermissions];
|
|
52
|
+
}
|
|
53
|
+
const missingPermissions = [];
|
|
54
|
+
for (const permission of commandPermissions) {
|
|
55
|
+
const hasPermission = botMember.permissions.has(permission);
|
|
56
|
+
if (!hasPermission) {
|
|
57
|
+
missingPermissions.push(`\`${permission.toString()}\``);
|
|
60
58
|
}
|
|
61
59
|
}
|
|
60
|
+
if (missingPermissions.length) {
|
|
61
|
+
interaction.reply({
|
|
62
|
+
content: `\u274C I do not have enough permissions to execute this command. Missing: ${missingPermissions.join(
|
|
63
|
+
", "
|
|
64
|
+
)}`,
|
|
65
|
+
ephemeral: true
|
|
66
|
+
});
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
62
69
|
}
|
|
63
70
|
|
|
64
71
|
// src/handlers/command-handler/validations/devOnly.ts
|
|
65
|
-
function devOnly_default({
|
|
66
|
-
interaction,
|
|
67
|
-
targetCommand,
|
|
68
|
-
handlerData
|
|
69
|
-
}) {
|
|
72
|
+
function devOnly_default({ interaction, targetCommand, handlerData }) {
|
|
70
73
|
if (targetCommand.options?.devOnly) {
|
|
71
74
|
if (interaction.inGuild() && !handlerData.devGuildIds.includes(interaction.guildId)) {
|
|
72
75
|
interaction.reply({
|
|
@@ -75,9 +78,7 @@ function devOnly_default({
|
|
|
75
78
|
});
|
|
76
79
|
return true;
|
|
77
80
|
}
|
|
78
|
-
const guildMember = interaction.guild?.members.cache.get(
|
|
79
|
-
interaction.user.id
|
|
80
|
-
);
|
|
81
|
+
const guildMember = interaction.guild?.members.cache.get(interaction.user.id);
|
|
81
82
|
const memberRoles = guildMember?.roles.cache;
|
|
82
83
|
let hasDevRole = false;
|
|
83
84
|
memberRoles?.forEach((role) => {
|
|
@@ -97,10 +98,7 @@ function devOnly_default({
|
|
|
97
98
|
}
|
|
98
99
|
|
|
99
100
|
// src/handlers/command-handler/validations/guildOnly.ts
|
|
100
|
-
function guildOnly_default({
|
|
101
|
-
interaction,
|
|
102
|
-
targetCommand
|
|
103
|
-
}) {
|
|
101
|
+
function guildOnly_default({ interaction, targetCommand }) {
|
|
104
102
|
if (targetCommand.options?.guildOnly && !interaction.inGuild()) {
|
|
105
103
|
interaction.reply({
|
|
106
104
|
content: "\u274C This command can only be used inside a server.",
|
|
@@ -111,23 +109,30 @@ function guildOnly_default({
|
|
|
111
109
|
}
|
|
112
110
|
|
|
113
111
|
// src/handlers/command-handler/validations/userPermissions.ts
|
|
114
|
-
function userPermissions_default({
|
|
115
|
-
interaction,
|
|
116
|
-
targetCommand
|
|
117
|
-
}) {
|
|
112
|
+
function userPermissions_default({ interaction, targetCommand }) {
|
|
118
113
|
const memberPermissions = interaction.memberPermissions;
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
114
|
+
let commandPermissions = targetCommand.options?.userPermissions;
|
|
115
|
+
if (!memberPermissions || !commandPermissions)
|
|
116
|
+
return;
|
|
117
|
+
if (!Array.isArray(commandPermissions)) {
|
|
118
|
+
commandPermissions = [commandPermissions];
|
|
119
|
+
}
|
|
120
|
+
const missingPermissions = [];
|
|
121
|
+
for (const permission of commandPermissions) {
|
|
122
|
+
const hasPermission = memberPermissions.has(permission);
|
|
123
|
+
if (!hasPermission) {
|
|
124
|
+
missingPermissions.push(`\`${permission.toString()}\``);
|
|
129
125
|
}
|
|
130
126
|
}
|
|
127
|
+
if (missingPermissions.length) {
|
|
128
|
+
interaction.reply({
|
|
129
|
+
content: `\u274C You do not have enough permissions to run this command. Missing: ${missingPermissions.join(
|
|
130
|
+
", "
|
|
131
|
+
)}`,
|
|
132
|
+
ephemeral: true
|
|
133
|
+
});
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
131
136
|
}
|
|
132
137
|
|
|
133
138
|
// src/handlers/command-handler/validations/index.ts
|
|
@@ -149,7 +154,7 @@ function areSlashCommandsDifferent(appCommand, localCommand) {
|
|
|
149
154
|
}
|
|
150
155
|
|
|
151
156
|
// src/handlers/command-handler/functions/registerCommands.ts
|
|
152
|
-
import "colors";
|
|
157
|
+
import colors from "colors/safe";
|
|
153
158
|
async function registerCommands(commandHandler) {
|
|
154
159
|
const client = commandHandler._data.client;
|
|
155
160
|
const devGuildIds = commandHandler._data.devGuildIds;
|
|
@@ -159,7 +164,11 @@ async function registerCommands(commandHandler) {
|
|
|
159
164
|
for (const devGuildId of devGuildIds) {
|
|
160
165
|
const guild = client.guilds.cache.get(devGuildId);
|
|
161
166
|
if (!guild) {
|
|
162
|
-
console.log(
|
|
167
|
+
console.log(
|
|
168
|
+
colors.yellow(
|
|
169
|
+
`\u23E9 Ignoring: Guild ${devGuildId} does not exist or client isn't in this guild.`
|
|
170
|
+
)
|
|
171
|
+
);
|
|
163
172
|
continue;
|
|
164
173
|
}
|
|
165
174
|
devGuilds.push(guild);
|
|
@@ -173,58 +182,92 @@ async function registerCommands(commandHandler) {
|
|
|
173
182
|
devGuildCommands.push(guildCommands);
|
|
174
183
|
}
|
|
175
184
|
for (const command of commands) {
|
|
185
|
+
let commandData = command.data;
|
|
176
186
|
if (command.options?.deleted) {
|
|
177
|
-
const targetCommand = appCommands?.cache.find(
|
|
187
|
+
const targetCommand = appCommands?.cache.find(
|
|
188
|
+
(cmd) => cmd.name === commandData.name
|
|
189
|
+
);
|
|
178
190
|
if (!targetCommand) {
|
|
179
|
-
console.log(
|
|
191
|
+
console.log(
|
|
192
|
+
colors.yellow(
|
|
193
|
+
`\u23E9 Ignoring: Command "${commandData.name}" is globally marked as deleted.`
|
|
194
|
+
)
|
|
195
|
+
);
|
|
180
196
|
} else {
|
|
181
197
|
targetCommand.delete().then(() => {
|
|
182
|
-
console.log(
|
|
198
|
+
console.log(
|
|
199
|
+
colors.green(`\u{1F6AE} Deleted command "${commandData.name}" globally.`)
|
|
200
|
+
);
|
|
183
201
|
});
|
|
184
202
|
}
|
|
185
203
|
for (const guildCommands of devGuildCommands) {
|
|
186
|
-
const targetCommand2 = guildCommands.cache.find(
|
|
204
|
+
const targetCommand2 = guildCommands.cache.find(
|
|
205
|
+
(cmd) => cmd.name === commandData.name
|
|
206
|
+
);
|
|
187
207
|
if (!targetCommand2) {
|
|
188
208
|
console.log(
|
|
189
|
-
|
|
209
|
+
colors.yellow(
|
|
210
|
+
`\u23E9 Ignoring: Command "${commandData.name}" is marked as deleted for ${guildCommands.guild.name}.`
|
|
211
|
+
)
|
|
190
212
|
);
|
|
191
213
|
} else {
|
|
192
214
|
targetCommand2.delete().then(() => {
|
|
193
215
|
console.log(
|
|
194
|
-
|
|
216
|
+
colors.green(
|
|
217
|
+
`\u{1F6AE} Deleted command "${commandData.name}" in ${guildCommands.guild.name}.`
|
|
218
|
+
)
|
|
195
219
|
);
|
|
196
220
|
});
|
|
197
221
|
}
|
|
198
222
|
}
|
|
199
223
|
continue;
|
|
200
224
|
}
|
|
201
|
-
let commandData = command.data;
|
|
202
225
|
let editedCommand = false;
|
|
203
|
-
const appGlobalCommand = appCommands?.cache.find(
|
|
226
|
+
const appGlobalCommand = appCommands?.cache.find(
|
|
227
|
+
(cmd) => cmd.name === commandData.name
|
|
228
|
+
);
|
|
204
229
|
if (appGlobalCommand) {
|
|
205
|
-
const commandsAreDifferent = areSlashCommandsDifferent(
|
|
230
|
+
const commandsAreDifferent = areSlashCommandsDifferent(
|
|
231
|
+
appGlobalCommand,
|
|
232
|
+
commandData
|
|
233
|
+
);
|
|
206
234
|
if (commandsAreDifferent) {
|
|
207
235
|
appGlobalCommand.edit(commandData).then(() => {
|
|
208
|
-
console.log(
|
|
236
|
+
console.log(
|
|
237
|
+
colors.green(`\u2705 Edited command "${commandData.name}" globally.`)
|
|
238
|
+
);
|
|
209
239
|
}).catch((error) => {
|
|
210
|
-
console.log(
|
|
240
|
+
console.log(
|
|
241
|
+
colors.red(
|
|
242
|
+
`\u274C Failed to edit command "${commandData.name}" globally.`
|
|
243
|
+
)
|
|
244
|
+
);
|
|
211
245
|
console.error(error);
|
|
212
246
|
});
|
|
213
247
|
editedCommand = true;
|
|
214
248
|
}
|
|
215
249
|
}
|
|
216
250
|
for (const guildCommands of devGuildCommands) {
|
|
217
|
-
const appGuildCommand = guildCommands.cache.find(
|
|
251
|
+
const appGuildCommand = guildCommands.cache.find(
|
|
252
|
+
(cmd) => cmd.name === commandData.name
|
|
253
|
+
);
|
|
218
254
|
if (appGuildCommand) {
|
|
219
|
-
const commandsAreDifferent = areSlashCommandsDifferent(
|
|
255
|
+
const commandsAreDifferent = areSlashCommandsDifferent(
|
|
256
|
+
appGuildCommand,
|
|
257
|
+
commandData
|
|
258
|
+
);
|
|
220
259
|
if (commandsAreDifferent) {
|
|
221
260
|
appGuildCommand.edit(commandData).then(() => {
|
|
222
261
|
console.log(
|
|
223
|
-
|
|
262
|
+
colors.green(
|
|
263
|
+
`\u2705 Edited command "${commandData.name}" in ${guildCommands.guild.name}.`
|
|
264
|
+
)
|
|
224
265
|
);
|
|
225
266
|
}).catch((error) => {
|
|
226
267
|
console.log(
|
|
227
|
-
|
|
268
|
+
colors.red(
|
|
269
|
+
`\u274C Failed to edit command "${commandData.name}" in ${guildCommands.guild.name}.`
|
|
270
|
+
)
|
|
228
271
|
);
|
|
229
272
|
console.error(error);
|
|
230
273
|
});
|
|
@@ -237,29 +280,47 @@ async function registerCommands(commandHandler) {
|
|
|
237
280
|
if (command.options?.devOnly) {
|
|
238
281
|
if (!devGuilds.length) {
|
|
239
282
|
console.log(
|
|
240
|
-
|
|
283
|
+
colors.yellow(
|
|
284
|
+
`\u23E9 Ignoring: Cannot register command "${commandData.name}" as no valid "devGuildIds" were provided.`
|
|
285
|
+
)
|
|
241
286
|
);
|
|
242
287
|
continue;
|
|
243
288
|
}
|
|
244
289
|
for (const guild of devGuilds) {
|
|
245
|
-
const cmdExists = guild.commands.cache.some(
|
|
290
|
+
const cmdExists = guild.commands.cache.some(
|
|
291
|
+
(cmd) => cmd.name === commandData.name
|
|
292
|
+
);
|
|
246
293
|
if (cmdExists)
|
|
247
294
|
continue;
|
|
248
|
-
guild?.commands.create(
|
|
249
|
-
console.log(
|
|
295
|
+
guild?.commands.create(commandData).then(() => {
|
|
296
|
+
console.log(
|
|
297
|
+
colors.green(
|
|
298
|
+
`\u2705 Registered command "${commandData.name}" in ${guild.name}.`
|
|
299
|
+
)
|
|
300
|
+
);
|
|
250
301
|
}).catch((error) => {
|
|
251
|
-
console.log(
|
|
302
|
+
console.log(
|
|
303
|
+
colors.red(
|
|
304
|
+
`\u274C Failed to register command "${commandData.name}" in ${guild.name}.`
|
|
305
|
+
)
|
|
306
|
+
);
|
|
252
307
|
console.error(error);
|
|
253
308
|
});
|
|
254
309
|
}
|
|
255
310
|
} else {
|
|
256
|
-
const cmdExists = appCommands?.cache.some((cmd) => cmd.name ===
|
|
311
|
+
const cmdExists = appCommands?.cache.some((cmd) => cmd.name === commandData.name);
|
|
257
312
|
if (cmdExists)
|
|
258
313
|
continue;
|
|
259
|
-
appCommands?.create(
|
|
260
|
-
console.log(
|
|
314
|
+
appCommands?.create(commandData).then(() => {
|
|
315
|
+
console.log(
|
|
316
|
+
colors.green(`\u2705 Registered command "${commandData.name}" globally.`)
|
|
317
|
+
);
|
|
261
318
|
}).catch((error) => {
|
|
262
|
-
console.log(
|
|
319
|
+
console.log(
|
|
320
|
+
colors.red(
|
|
321
|
+
`\u274C Failed to register command "${commandData.name}" globally.`
|
|
322
|
+
)
|
|
323
|
+
);
|
|
263
324
|
console.error(error);
|
|
264
325
|
});
|
|
265
326
|
}
|
|
@@ -270,10 +331,13 @@ async function registerCommands(commandHandler) {
|
|
|
270
331
|
// src/handlers/command-handler/functions/handleCommands.ts
|
|
271
332
|
function handleCommands(commandHandler) {
|
|
272
333
|
const client = commandHandler._data.client;
|
|
334
|
+
const handler = commandHandler._data.commandKitInstance;
|
|
273
335
|
client.on("interactionCreate", async (interaction) => {
|
|
274
336
|
if (!interaction.isChatInputCommand() && !interaction.isContextMenuCommand())
|
|
275
337
|
return;
|
|
276
|
-
const targetCommand = commandHandler._data.commands.find(
|
|
338
|
+
const targetCommand = commandHandler._data.commands.find(
|
|
339
|
+
(cmd) => cmd.data.name === interaction.commandName
|
|
340
|
+
);
|
|
277
341
|
if (!targetCommand)
|
|
278
342
|
return;
|
|
279
343
|
const { data, options, run, ...rest } = targetCommand;
|
|
@@ -287,7 +351,8 @@ function handleCommands(commandHandler) {
|
|
|
287
351
|
const stopValidationLoop = await validationFunction({
|
|
288
352
|
interaction,
|
|
289
353
|
client,
|
|
290
|
-
commandObj
|
|
354
|
+
commandObj,
|
|
355
|
+
handler
|
|
291
356
|
});
|
|
292
357
|
if (stopValidationLoop) {
|
|
293
358
|
canRun = false;
|
|
@@ -311,12 +376,12 @@ function handleCommands(commandHandler) {
|
|
|
311
376
|
}
|
|
312
377
|
if (!canRun)
|
|
313
378
|
return;
|
|
314
|
-
targetCommand.run({ interaction, client });
|
|
379
|
+
targetCommand.run({ interaction, client, handler });
|
|
315
380
|
});
|
|
316
381
|
}
|
|
317
382
|
|
|
318
383
|
// src/handlers/command-handler/CommandHandler.ts
|
|
319
|
-
import "colors";
|
|
384
|
+
import colors2 from "colors/safe";
|
|
320
385
|
var CommandHandler = class {
|
|
321
386
|
_data;
|
|
322
387
|
constructor({ ...options }) {
|
|
@@ -343,11 +408,17 @@ var CommandHandler = class {
|
|
|
343
408
|
if (commandObj.default)
|
|
344
409
|
commandObj = commandObj.default;
|
|
345
410
|
if (!commandObj.data) {
|
|
346
|
-
console.log(
|
|
411
|
+
console.log(
|
|
412
|
+
colors2.yellow(
|
|
413
|
+
`\u23E9 Ignoring: Command ${compactFilePath} does not export "data".`
|
|
414
|
+
)
|
|
415
|
+
);
|
|
347
416
|
continue;
|
|
348
417
|
}
|
|
349
418
|
if (!commandObj.run) {
|
|
350
|
-
console.log(
|
|
419
|
+
console.log(
|
|
420
|
+
colors2.yellow(`\u23E9 Ignoring: Command ${compactFilePath} does not export "run".`)
|
|
421
|
+
);
|
|
351
422
|
continue;
|
|
352
423
|
}
|
|
353
424
|
this._data.commands.push(commandObj);
|
|
@@ -370,7 +441,7 @@ var CommandHandler = class {
|
|
|
370
441
|
};
|
|
371
442
|
|
|
372
443
|
// src/handlers/event-handler/EventHandler.ts
|
|
373
|
-
import "colors";
|
|
444
|
+
import colors3 from "colors/safe";
|
|
374
445
|
var EventHandler = class {
|
|
375
446
|
#data;
|
|
376
447
|
constructor({ ...options }) {
|
|
@@ -400,7 +471,11 @@ var EventHandler = class {
|
|
|
400
471
|
let eventFunction = (await import(modulePath)).default;
|
|
401
472
|
const compactFilePath = eventFilePath.split(process.cwd())[1] || eventFilePath;
|
|
402
473
|
if (typeof eventFunction !== "function") {
|
|
403
|
-
console.log(
|
|
474
|
+
console.log(
|
|
475
|
+
colors3.yellow(
|
|
476
|
+
`\u23E9 Ignoring: Event ${compactFilePath} does not export a function.`
|
|
477
|
+
)
|
|
478
|
+
);
|
|
404
479
|
continue;
|
|
405
480
|
}
|
|
406
481
|
eventObj.functions.push(eventFunction);
|
|
@@ -409,10 +484,11 @@ var EventHandler = class {
|
|
|
409
484
|
}
|
|
410
485
|
#registerEvents() {
|
|
411
486
|
const client = this.#data.client;
|
|
487
|
+
const handler = this.#data.commandKitInstance;
|
|
412
488
|
for (const eventObj of this.#data.events) {
|
|
413
489
|
client.on(eventObj.name, async (...params) => {
|
|
414
490
|
for (const eventFunction of eventObj.functions) {
|
|
415
|
-
const stopEventLoop = await eventFunction(...params, client);
|
|
491
|
+
const stopEventLoop = await eventFunction(...params, client, handler);
|
|
416
492
|
if (stopEventLoop) {
|
|
417
493
|
break;
|
|
418
494
|
}
|
|
@@ -426,7 +502,7 @@ var EventHandler = class {
|
|
|
426
502
|
};
|
|
427
503
|
|
|
428
504
|
// src/handlers/validation-handler/ValidationHandler.ts
|
|
429
|
-
import "colors";
|
|
505
|
+
import colors4 from "colors/safe";
|
|
430
506
|
var ValidationHandler = class {
|
|
431
507
|
#data;
|
|
432
508
|
constructor({ ...options }) {
|
|
@@ -447,7 +523,11 @@ var ValidationHandler = class {
|
|
|
447
523
|
let validationFunction = (await import(modulePath)).default;
|
|
448
524
|
const compactFilePath = validationFilePath.split(process.cwd())[1] || validationFilePath;
|
|
449
525
|
if (typeof validationFunction !== "function") {
|
|
450
|
-
console.log(
|
|
526
|
+
console.log(
|
|
527
|
+
colors4.yellow(
|
|
528
|
+
`\u23E9 Ignoring: Validation ${compactFilePath} does not export a function.`
|
|
529
|
+
)
|
|
530
|
+
);
|
|
451
531
|
continue;
|
|
452
532
|
}
|
|
453
533
|
this.#data.validations.push(validationFunction);
|
|
@@ -459,15 +539,17 @@ var ValidationHandler = class {
|
|
|
459
539
|
};
|
|
460
540
|
|
|
461
541
|
// src/CommandKit.ts
|
|
462
|
-
import "colors";
|
|
542
|
+
import colors5 from "colors/safe";
|
|
463
543
|
var CommandKit = class {
|
|
464
544
|
#data;
|
|
465
545
|
constructor({ ...options }) {
|
|
466
546
|
if (!options.client) {
|
|
467
|
-
throw new Error('"client" is required when instantiating CommandKit.'
|
|
547
|
+
throw new Error(colors5.red('"client" is required when instantiating CommandKit.'));
|
|
468
548
|
}
|
|
469
549
|
if (options.validationsPath && !options.commandsPath) {
|
|
470
|
-
throw new Error(
|
|
550
|
+
throw new Error(
|
|
551
|
+
colors5.red('"commandsPath" is required when "validationsPath" is set.')
|
|
552
|
+
);
|
|
471
553
|
}
|
|
472
554
|
this.#data = {
|
|
473
555
|
...options,
|
|
@@ -479,7 +561,8 @@ var CommandKit = class {
|
|
|
479
561
|
if (this.#data.eventsPath) {
|
|
480
562
|
const eventHandler = new EventHandler({
|
|
481
563
|
client: this.#data.client,
|
|
482
|
-
eventsPath: this.#data.eventsPath
|
|
564
|
+
eventsPath: this.#data.eventsPath,
|
|
565
|
+
commandKitInstance: this
|
|
483
566
|
});
|
|
484
567
|
await eventHandler.init();
|
|
485
568
|
}
|
|
@@ -499,19 +582,35 @@ var CommandKit = class {
|
|
|
499
582
|
devUserIds: this.#data.devUserIds || [],
|
|
500
583
|
devRoleIds: this.#data.devRoleIds || [],
|
|
501
584
|
customValidations: validationFunctions,
|
|
502
|
-
skipBuiltInValidations: this.#data.skipBuiltInValidations || false
|
|
585
|
+
skipBuiltInValidations: this.#data.skipBuiltInValidations || false,
|
|
586
|
+
commandKitInstance: this
|
|
503
587
|
});
|
|
504
588
|
await commandHandler.init();
|
|
505
589
|
this.#data.commands = commandHandler.commands;
|
|
506
590
|
}
|
|
507
591
|
}
|
|
592
|
+
/**
|
|
593
|
+
* Returns all the commands that CommandKit is handling.
|
|
594
|
+
*
|
|
595
|
+
* @returns An array of command objects
|
|
596
|
+
*/
|
|
508
597
|
get commands() {
|
|
509
|
-
|
|
598
|
+
const commands = this.#data.commands.map((cmd) => {
|
|
510
599
|
const { run, ...command } = cmd;
|
|
511
600
|
return command;
|
|
512
601
|
});
|
|
602
|
+
return commands;
|
|
513
603
|
}
|
|
514
604
|
};
|
|
605
|
+
|
|
606
|
+
// src/types/index.ts
|
|
607
|
+
var CommandType = /* @__PURE__ */ ((CommandType2) => {
|
|
608
|
+
CommandType2[CommandType2["ChatInput"] = 1] = "ChatInput";
|
|
609
|
+
CommandType2[CommandType2["Message"] = 3] = "Message";
|
|
610
|
+
CommandType2[CommandType2["User"] = 2] = "User";
|
|
611
|
+
return CommandType2;
|
|
612
|
+
})(CommandType || {});
|
|
515
613
|
export {
|
|
516
|
-
CommandKit
|
|
614
|
+
CommandKit,
|
|
615
|
+
CommandType
|
|
517
616
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "commandkit",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -14,7 +14,10 @@
|
|
|
14
14
|
},
|
|
15
15
|
"scripts": {
|
|
16
16
|
"lint": "tsc",
|
|
17
|
-
"
|
|
17
|
+
"dev": "tsup --watch",
|
|
18
|
+
"build": "tsup",
|
|
19
|
+
"deploy": "npm publish",
|
|
20
|
+
"test": "tsx tests/index.ts"
|
|
18
21
|
},
|
|
19
22
|
"repository": {
|
|
20
23
|
"type": "git",
|
|
@@ -31,8 +34,12 @@
|
|
|
31
34
|
"colors": "^1.4.0"
|
|
32
35
|
},
|
|
33
36
|
"devDependencies": {
|
|
34
|
-
"
|
|
37
|
+
"@types/node": "^20.5.9",
|
|
38
|
+
"discord.js": "^14.13.0",
|
|
39
|
+
"dotenv": "^16.3.1",
|
|
40
|
+
"tsconfig": "workspace:*",
|
|
35
41
|
"tsup": "^7.2.0",
|
|
42
|
+
"tsx": "^3.12.8",
|
|
36
43
|
"typescript": "^5.1.6"
|
|
37
44
|
},
|
|
38
45
|
"peerDependencies": {
|