djs-builder 0.4.85 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/.tsbuildinfo +1 -1
  2. package/dist/discord/events-handler/eventLoader.d.ts +7 -0
  3. package/dist/discord/events-handler/eventLoader.d.ts.map +1 -0
  4. package/dist/discord/events-handler/eventLoader.js +144 -0
  5. package/dist/discord/events-handler/eventLoader.js.map +1 -0
  6. package/dist/discord/events-handler/events.d.ts +5 -0
  7. package/dist/discord/events-handler/events.d.ts.map +1 -1
  8. package/dist/discord/events-handler/events.js +11 -7
  9. package/dist/discord/events-handler/events.js.map +1 -1
  10. package/dist/discord/events-handler/login.d.ts.map +1 -1
  11. package/dist/discord/events-handler/login.js +6 -1
  12. package/dist/discord/events-handler/login.js.map +1 -1
  13. package/dist/discord/events-handler/prefix-register.d.ts +5 -0
  14. package/dist/discord/events-handler/prefix-register.d.ts.map +1 -1
  15. package/dist/discord/events-handler/prefix-register.js +15 -4
  16. package/dist/discord/events-handler/prefix-register.js.map +1 -1
  17. package/dist/discord/events-handler/prefix-responder.d.ts +2 -1
  18. package/dist/discord/events-handler/prefix-responder.d.ts.map +1 -1
  19. package/dist/discord/events-handler/prefix-responder.js +130 -59
  20. package/dist/discord/events-handler/prefix-responder.js.map +1 -1
  21. package/dist/discord/events-handler/prefixLoader.d.ts +5 -1
  22. package/dist/discord/events-handler/prefixLoader.d.ts.map +1 -1
  23. package/dist/discord/events-handler/prefixLoader.js +38 -24
  24. package/dist/discord/events-handler/prefixLoader.js.map +1 -1
  25. package/dist/discord/events-handler/slash-register.d.ts.map +1 -1
  26. package/dist/discord/events-handler/slash-register.js +1 -5
  27. package/dist/discord/events-handler/slash-register.js.map +1 -1
  28. package/dist/discord/events-handler/slash-responder.d.ts.map +1 -1
  29. package/dist/discord/events-handler/slash-responder.js +1 -0
  30. package/dist/discord/events-handler/slash-responder.js.map +1 -1
  31. package/dist/discord/events-handler/slashLoader.d.ts +5 -1
  32. package/dist/discord/events-handler/slashLoader.d.ts.map +1 -1
  33. package/dist/discord/events-handler/slashLoader.js +57 -11
  34. package/dist/discord/events-handler/slashLoader.js.map +1 -1
  35. package/dist/discord/events-handler/starter.d.ts.map +1 -1
  36. package/dist/discord/events-handler/starter.js +2 -6
  37. package/dist/discord/events-handler/starter.js.map +1 -1
  38. package/dist/discord/functions/logger.d.ts +1 -1
  39. package/dist/discord/functions/logger.d.ts.map +1 -1
  40. package/dist/discord/functions/logger.js +9 -2
  41. package/dist/discord/functions/logger.js.map +1 -1
  42. package/dist/discord/types/starter.d.ts +8 -1
  43. package/dist/discord/types/starter.d.ts.map +1 -1
  44. package/dist/discord/utils.d.ts +9 -2
  45. package/dist/discord/utils.d.ts.map +1 -1
  46. package/dist/discord/utils.js +26 -3
  47. package/dist/discord/utils.js.map +1 -1
  48. package/dist/index.d.ts +20 -3
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +35 -2
  51. package/dist/index.js.map +1 -1
  52. package/lib/discord/events-handler/eventLoader.ts +130 -0
  53. package/lib/discord/events-handler/events.ts +11 -12
  54. package/lib/discord/events-handler/login.ts +7 -1
  55. package/lib/discord/events-handler/prefix-register.ts +43 -6
  56. package/lib/discord/events-handler/prefix-responder.ts +141 -61
  57. package/lib/discord/events-handler/prefixLoader.ts +43 -29
  58. package/lib/discord/events-handler/slash-register.ts +3 -6
  59. package/lib/discord/events-handler/slash-responder.ts +1 -0
  60. package/lib/discord/events-handler/slashLoader.ts +64 -12
  61. package/lib/discord/events-handler/starter.ts +4 -8
  62. package/lib/discord/functions/logger.ts +10 -2
  63. package/lib/discord/types/starter.ts +8 -1
  64. package/lib/discord/utils.ts +11 -2
  65. package/lib/index.ts +10 -3
  66. package/package.json +2 -1
  67. package/lib/discord/events-handler/events loader.ts +0 -21
@@ -1,40 +1,54 @@
1
- import { logSuccess, logError, logInfo, logWarning } from '../functions/logger';
2
- import { commands, aliases, commandNames, readCommands } from './prefix-register';
1
+ import { Collection } from 'discord.js';
2
+ import { readdir } from 'fs/promises';
3
+ import { join, resolve, extname } from 'path';
4
+ import { commands, aliases, commandNames } from './prefix-register';
5
+ import { readCommands } from './prefix-register';
6
+ import { logError } from '../functions/logger';
3
7
  import { botData } from './login';
8
+ const validExtensions = ['.js', '.ts'];
4
9
 
5
- export async function prefixLoader(client: any): Promise<boolean> {
6
- const currentCommandNames = new Set(commands.keys());
7
- console.log('Before clearing:');
8
- console.log('Commands size:', commands.size);
9
- console.log('Aliases size:', aliases.size);
10
- console.log('Command names size:', commandNames.size);
11
-
12
-
13
- commands.clear();
14
- aliases.clear();
15
- commandNames.clear();
10
+ export async function prefixLoader(client: any): Promise<{ commands: Collection<string, any>; success: boolean }> {
11
+ try {
16
12
 
17
- console.log('After clearing:');
18
- console.log('Commands size:', commands.size);
19
- console.log('Aliases size:', aliases.size);
20
- console.log('Command names size:', commandNames.size);
21
- const prefixPath = botData.get('prefixPath') as string;
13
+ const prefixPath = botData.get('prefixPath') as string;
22
14
 
23
- logInfo(`Reloading prefix commands from ${prefixPath}`);
15
+ commands.clear();
16
+ aliases.clear();
17
+ commandNames.clear();
18
+ client.prefixCommands = [];
19
+ client.prefixSize = 0;
24
20
 
25
- try {
26
- await readCommands(client, { path: prefixPath });
21
+ const resolvedPath = resolve(process.cwd(), prefixPath);
22
+ const dirents = await readdir(resolvedPath, { withFileTypes: true });
27
23
 
28
- commands.forEach((_, name) => {
29
- if (!currentCommandNames.has(name)) {
30
- logWarning(`Removed old command: ${name}`);
24
+ const filePaths: string[] = [];
25
+ for (const dirent of dirents) {
26
+ if (dirent.isDirectory()) {
27
+ const folderPath = join(resolvedPath, dirent.name);
28
+ const files = await readdir(folderPath);
29
+ for (const file of files) {
30
+ if (validExtensions.includes(extname(file))) {
31
+ filePaths.push(join(folderPath, file));
32
+ }
33
+ }
34
+ } else if (validExtensions.includes(extname(dirent.name))) {
35
+ filePaths.push(join(resolvedPath, dirent.name));
31
36
  }
32
- });
37
+ }
33
38
 
34
- logSuccess(`Successfully reloaded prefix commands.`);
35
- return true;
39
+ for (const filePath of filePaths) {
40
+ delete require.cache[require.resolve(filePath)];
41
+ }
42
+
43
+ const commandDetails = await readCommands(client, { path: prefixPath });
44
+ client.prefixCommands = commandDetails;
45
+ client.prefixSize = commandDetails.length;
46
+
47
+ return { commands: commands, success: true };
36
48
  } catch (error: any) {
37
- logError(`Error reloading prefix commands: ${error.message}`);
38
- return false;
49
+ logError('Error reloading commands:');
50
+ logError(error.message);
51
+
52
+ return { commands: new Collection(), success: false };
39
53
  }
40
54
  }
@@ -4,7 +4,7 @@ import { Routes } from 'discord-api-types/v10';
4
4
  import { readdir } from 'fs/promises';
5
5
  import path from 'path';
6
6
  import { SlashOptions } from '../types/starter';
7
- import { logSuccess, logError, logInfo } from '../functions/logger';
7
+ import { logError } from '../functions/logger';
8
8
 
9
9
  export async function registerSlashCommands(client: any, token: string, slash: SlashOptions): Promise<Collection<string, any>> {
10
10
  if (!token) {
@@ -31,7 +31,6 @@ export async function registerSlashCommands(client: any, token: string, slash: S
31
31
  command.data.cooldown = command.cooldown || 0;
32
32
  }
33
33
  slashCommands.set(command.data.name, command);
34
- logInfo(`Loaded command: ${command.data.name}`);
35
34
  }
36
35
  } catch (error: any) {
37
36
  logError(`Error in file: ${path.join(folderPath, file)}`);
@@ -46,7 +45,6 @@ export async function registerSlashCommands(client: any, token: string, slash: S
46
45
  command.data.cooldown = command.cooldown || 0;
47
46
  }
48
47
  slashCommands.set(command.data.name, command);
49
- logInfo(`Loaded command: ${command.data.name}`);
50
48
  }
51
49
  } catch (error: any) {
52
50
  logError(`Error in file: ${path.join(resolvedPath, dirent.name)}`);
@@ -58,24 +56,23 @@ export async function registerSlashCommands(client: any, token: string, slash: S
58
56
  if (slash.global && !slash.serverId) {
59
57
  const slashCommandArray = Array.from(slashCommands.values()).map(command => command.data.toJSON());
60
58
  await rest.put(Routes.applicationCommands((client.user?.id || '')), { body: slashCommandArray, headers: { Authorization: `Bot ${token}` } });
61
- logSuccess('Successfully registered global slash commands.');
62
59
  } else if (!slash.global && slash.serverId) {
63
60
  const guild = client.guilds.cache.get(slash.serverId) as Guild | undefined;
64
61
  if (guild) {
65
62
  const slashCommandArray = Array.from(slashCommands.values()).map(command => command.data.toJSON());
66
63
  await rest.put(Routes.applicationGuildCommands((client.user?.id || ''), guild.id), { body: slashCommandArray, headers: { Authorization: `Bot ${token}` } });
67
- logSuccess(`Successfully registered guild slash commands for server ID: ${slash.serverId}`);
68
64
  } else {
69
65
  logError(`Guild with ID ${slash.serverId} not found.`);
70
66
  }
71
67
  } else {
72
68
  const slashCommandArray = Array.from(slashCommands.values()).map(command => command.data.toJSON());
73
69
  await rest.put(Routes.applicationCommands((client.user?.id || '')), { body: slashCommandArray, headers: { Authorization: `Bot ${token}` } });
74
- logSuccess('Successfully registered global slash commands.');
75
70
  }
76
71
  } catch (error: any) {
77
72
  logError('Error registering slash commands:');
78
73
  logError(error.message);
74
+ console.error(error);
75
+
79
76
  }
80
77
 
81
78
  client.slashCommands = slashCommands;
@@ -118,6 +118,7 @@ export async function loadSlash(client: Client, token: string, options: SlashOpt
118
118
  } catch (error: any) {
119
119
  logError(`Error executing command "${command.data.name}":`);
120
120
  logError(error.message);
121
+ console.error(error);
121
122
  if (interaction.channel) {
122
123
  await interaction.channel.send({ content: 'An error occurred while executing the command.' });
123
124
  }
@@ -1,19 +1,71 @@
1
- import { logSuccess, logError, logInfo } from '../functions/logger';
2
- import { registerSlashCommands } from './slash-register';
1
+ import { Collection } from 'discord.js';
2
+ import { REST } from '@discordjs/rest';
3
+ import { Routes } from 'discord-api-types/v10';
4
+ import { readdir } from 'fs/promises';
5
+ import { resolve, extname } from 'path';
3
6
  import { botData } from './login';
7
+ import { logError, logInfo } from '../functions/logger';
4
8
 
5
- export async function slashLoader(client: any, token: string, global: boolean, serverId?: string) {
6
- client.slashCommands.clear();
7
- const slashPath = botData.get('slashCommands') as string;
8
-
9
- logInfo(`Reloading slash commands from ${slashPath}`);
9
+ const validExtensions = ['.js', '.ts'];
10
10
 
11
+ export async function slashLoader(client: any): Promise<{ commands: Collection<string, any>; success: boolean }> {
11
12
  try {
12
- const newSlashCommands = await registerSlashCommands(client, token, { path: slashPath, global, serverId });
13
- logSuccess(`Successfully reloaded ${newSlashCommands.size} slash commands.`);
14
- return true
13
+ const slashPath = botData.get('slashCommandPath') as string;
14
+ const token = botData.get('botToken') as string;
15
+
16
+ const commandPath = resolve(process.cwd(), slashPath);
17
+
18
+ const getAllFiles = async (dirPath: string): Promise<string[]> => {
19
+ let files: string[] = [];
20
+ const dirents = await readdir(dirPath, { withFileTypes: true });
21
+
22
+ for (const dirent of dirents) {
23
+ const res = resolve(dirPath, dirent.name);
24
+ if (dirent.isDirectory()) {
25
+ files = files.concat(await getAllFiles(res));
26
+ } else if (validExtensions.includes(extname(dirent.name))) {
27
+ files.push(res);
28
+ }
29
+ }
30
+ return files;
31
+ };
32
+
33
+ const files = await getAllFiles(commandPath);
34
+ if (files.length === 0) {
35
+ logInfo(`No command files found in directory \`${commandPath}\`.`);
36
+ return { commands: new Collection<string, any>(), success: false };
37
+ }
38
+
39
+ for (const file of files) {
40
+ delete require.cache[require.resolve(file)];
41
+ logInfo(`Unlinked cached module: ${file}`);
42
+ }
43
+
44
+ const newCommands = new Collection<string, any>();
45
+ for (const file of files) {
46
+ try {
47
+ const command = require(file);
48
+ if (command.data) {
49
+ client.slashCommands.set(command.data.name, command);
50
+ newCommands.set(command.data.name, command);
51
+ }
52
+ } catch (error: any) {
53
+ logError(`Error re-importing file: ${file}`);
54
+ logError(error.message);
55
+ }
56
+ }
57
+
58
+ const rest = new REST({ version: '10' }).setToken(token);
59
+ const slashCommandArray = Array.from(newCommands.values()).map((command: any) => command.data.toJSON());
60
+
61
+ await rest.put(Routes.applicationCommands(client.user?.id || ''), { body: [] });
62
+ await rest.put(Routes.applicationCommands(client.user?.id || ''), { body: slashCommandArray });
63
+
64
+ return { commands: newCommands, success: true };
15
65
  } catch (error: any) {
16
- logError(`Error reloading slash commands: ${error.message}`);
17
- return false
66
+ logError('Error reloading slash commands:');
67
+ logError(error.message);
68
+ console.error(error);
69
+ return { commands: new Collection<string, any>(), success: false };
18
70
  }
19
71
  }
@@ -1,6 +1,5 @@
1
1
  import { StarterOptions, StarterInterface } from '../types/utils';
2
2
  import { mongoConnect, getDb, verseConnect } from '../functions/utils';
3
- import { loadEvents } from './events';
4
3
  const wait = require('node:timers/promises').setTimeout;
5
4
  import { login } from './login';
6
5
  import { AntiCrash } from '../functions/anticrash';
@@ -17,16 +16,13 @@ export class Starter implements StarterInterface {
17
16
  }
18
17
  if (options.bot?.Database?.verse) {
19
18
  verseDb = await verseConnect(options.bot.Database.verse);
20
- }
21
- if (options.events) {
22
- await loadEvents(djs, options.events);
23
- }
24
- if (options.anticrash?.enable) {
25
- await AntiCrash(djs, options)
26
- }
19
+ }
27
20
  if (options.bot) {
28
21
  await login(djs, options);
29
22
  }
23
+ if (options.anticrash?.enable) {
24
+ await AntiCrash(djs, options)
25
+ }
30
26
  } catch (error: any) {
31
27
  console.error('An error occurred during bot startup:', error.message);
32
28
  await this.handleStartupError(error, djs, options);
@@ -25,10 +25,18 @@ export function logSuccess(message: string) {
25
25
  console.log(`${getTimestamp()} ${green}${successEmoji}${reset} ${green}${message}${reset}`);
26
26
  }
27
27
 
28
- export function logError(message: string) {
29
- console.error(`${getTimestamp()} ${red}${errorEmoji}${reset} ${red}${message}${reset}`);
28
+ export function logError(message: string, error?: Error) {
29
+ const timestamp = getTimestamp();
30
+ const baseMessage = `${timestamp} ${red}${errorEmoji}${reset} ${red}${message}${reset}`;
31
+
32
+ if (error && error.stack) {
33
+ console.error(`${baseMessage}\n${error.stack}`);
34
+ } else {
35
+ console.error(baseMessage);
36
+ }
30
37
  }
31
38
 
39
+
32
40
  export function logInfo(message: string) {
33
41
  console.log(`${getTimestamp()} ${cyan}${infoEmoji}${reset} ${cyan}${message}${reset}`);
34
42
  }
@@ -47,6 +47,10 @@ export interface PrefixOptions {
47
47
  prefix: string;
48
48
  global?: boolean;
49
49
  serverIds?: string[];
50
+ customPrefix?: {
51
+ serverId: string;
52
+ prefix: string;
53
+ }[];
50
54
  logsId?: string;
51
55
  }
52
56
 
@@ -102,9 +106,12 @@ export interface Command {
102
106
  cooldown?: number;
103
107
  usage?: string;
104
108
  developer?: boolean;
105
- prefix?: boolean;
106
109
  category?: string;
110
+ fastUse?: boolean;
111
+ botPerms?: string[];
112
+ userPerms?: string[];
107
113
  owner?: boolean;
114
+ accessLevel?: string;
108
115
  }
109
116
 
110
117
  export interface StarterOptions {
@@ -1,5 +1,14 @@
1
1
  import { Starter } from "./events-handler/starter";
2
2
  import { ButtonManager, MenuManager, PermissionChecker } from './builder/utils';
3
- import { prefixLoader } from "./events-handler/prefixLoader";
4
3
  import { slashLoader } from "./events-handler/slashLoader";
5
- export { Starter, ButtonManager, MenuManager, PermissionChecker, prefixLoader, slashLoader }
4
+ import { prefixLoader } from "./events-handler/prefixLoader";
5
+ import { eventLoader } from "./events-handler/eventLoader";
6
+ import { readCommands } from "./events-handler/prefix-register";
7
+ import { loadPrefix, handleMessageCreate } from "./events-handler/prefix-responder";
8
+ import { registerSlashCommands } from "./events-handler/slash-register";
9
+ import { loadSlash } from "./events-handler/slash-responder";
10
+ import { logError, logInfo, logSuccess, logWarning } from "./functions/logger";
11
+ import { loadEvents, withRetry, processEventFile, processDirectory, limitConcurrency, countEventFiles } from "./events-handler/events";
12
+ export { Starter, ButtonManager, MenuManager, PermissionChecker, slashLoader, prefixLoader, eventLoader, readCommands, loadEvents,
13
+ loadSlash, loadPrefix, handleMessageCreate, processDirectory, countEventFiles, limitConcurrency, withRetry, registerSlashCommands,
14
+ processEventFile, logError, logInfo, logSuccess, logWarning }
package/lib/index.ts CHANGED
@@ -27,7 +27,14 @@ fetch("https://registry.npmjs.com/-/v1/search?text=djs-builder")
27
27
  .catch((e: any) => {});
28
28
 
29
29
 
30
- import { Starter, ButtonManager, MenuManager, PermissionChecker, slashLoader, prefixLoader} from "./discord/utils";
30
+ import { Starter, ButtonManager, MenuManager, PermissionChecker, slashLoader, prefixLoader, eventLoader, readCommands, loadEvents,
31
+ loadSlash, loadPrefix, handleMessageCreate, processDirectory, countEventFiles, limitConcurrency, withRetry, registerSlashCommands,
32
+ processEventFile, logError, logInfo, logSuccess, logWarning } from "./discord/utils";
31
33
 
32
- export { Starter, ButtonManager, MenuManager, PermissionChecker, slashLoader, prefixLoader };
33
- export default { Starter, ButtonManager, MenuManager, PermissionChecker, prefixLoader, slashLoader };
34
+ export { Starter, ButtonManager, MenuManager, PermissionChecker, slashLoader, prefixLoader, eventLoader, readCommands, loadEvents,
35
+ loadSlash, loadPrefix, handleMessageCreate, processDirectory, countEventFiles, limitConcurrency, withRetry, registerSlashCommands,
36
+ processEventFile , logError, logInfo, logSuccess, logWarning};
37
+ export default { Starter, ButtonManager, MenuManager, PermissionChecker, slashLoader, prefixLoader, eventLoader, readCommands, loadEvents,
38
+ loadSlash, loadPrefix, handleMessageCreate, processDirectory, countEventFiles, limitConcurrency, withRetry, registerSlashCommands,
39
+ processEventFile, logError, logInfo, logSuccess, logWarning };
40
+ export * from './discord/types/starter';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "djs-builder",
3
- "version": "0.4.85",
3
+ "version": "0.5.1",
4
4
  "description": "Discord.js bot builder. Supports Ts and Js.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -33,6 +33,7 @@
33
33
  "cli-table": "^0.3.11",
34
34
  "colorette": "^2.0.20",
35
35
  "discord.js": "^14.15.3",
36
+ "djs-builder": "^0.4.10",
36
37
  "mongodb": "^6.5.0",
37
38
  "verse.db": "^2.0.4"
38
39
  },
@@ -1,21 +0,0 @@
1
- import { logSuccess, logError, logInfo } from '../functions/logger';
2
- import { EventsOptions } from '../types/starter';
3
- import { loadEvents } from './events';
4
- export async function eventsLoader(client: any, eventsOptions: EventsOptions) {
5
-
6
- client.eventSize = 0;
7
- client.removeAllListeners();
8
-
9
- logInfo(`Reloading events from ${eventsOptions.path}`);
10
-
11
- try {
12
-
13
- await loadEvents(client, eventsOptions);
14
-
15
- logSuccess(`Successfully reloaded ${client.eventSize} events.`);
16
- return true
17
- } catch (error: any) {
18
- logError(`Error reloading events: ${error.message}`);
19
- return false
20
- }
21
- }