djs-next 1.0.0-dev.1 → 1.0.0-dev.2
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.
Potentially problematic release.
This version of djs-next might be problematic. Click here for more details.
- package/README.md +12 -3
- package/dist/index.d.mts +12 -2
- package/dist/index.d.ts +12 -2
- package/dist/index.js +76 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +76 -0
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/client.ts +105 -3
- package/src/types.ts +7 -2
package/README.md
CHANGED
|
@@ -53,7 +53,9 @@ const db = new PrismaClient();
|
|
|
53
53
|
|
|
54
54
|
const client = new DJSNextClient({
|
|
55
55
|
intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent],
|
|
56
|
-
developers: ['YOUR_DISCORD_ID'] // Required for Developer Tools
|
|
56
|
+
developers: ['YOUR_DISCORD_ID'], // Required for Developer Tools
|
|
57
|
+
prefixes: ['!', '?'], // Standard prefixes. Pass [''] for no-prefix commands!
|
|
58
|
+
enableMentionPrefix: true // Allows "@Bot ping" to work natively
|
|
57
59
|
});
|
|
58
60
|
|
|
59
61
|
// Attach your database for global framework availability
|
|
@@ -70,15 +72,22 @@ client.start(process.env.DISCORD_TOKEN);
|
|
|
70
72
|
```
|
|
71
73
|
|
|
72
74
|
### 2. Creating a Command
|
|
73
|
-
Drop a file into `src/commands/ping.js`. The framework reads it and registers it
|
|
75
|
+
Drop a file into `src/commands/ping.js`. The framework reads it and registers it for **both** Slash Commands AND normal text prefixes!
|
|
74
76
|
```javascript
|
|
75
77
|
/** @type {import('djs-next').FileCommand} */
|
|
76
78
|
module.exports = {
|
|
77
79
|
description: 'Replies with Pong!',
|
|
80
|
+
aliases: ['p'], // Works for text commands (e.g. !p)
|
|
78
81
|
cooldown: 5, // Automatically intercepts spammers
|
|
82
|
+
|
|
83
|
+
// Triggers on Slash Command: /ping
|
|
79
84
|
execute: async (interaction, client) => {
|
|
80
|
-
// client.db is strongly typed as your database (via JSDoc/TS config)
|
|
81
85
|
await interaction.reply('Pong! 🏓');
|
|
86
|
+
},
|
|
87
|
+
|
|
88
|
+
// Triggers on Text Prefix: !ping, @Bot ping, or no-prefix ping
|
|
89
|
+
executeText: async (message, args, client) => {
|
|
90
|
+
await message.reply('Pong from text! 🏓');
|
|
82
91
|
}
|
|
83
92
|
};
|
|
84
93
|
```
|
package/dist/index.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as discord_js from 'discord.js';
|
|
2
|
-
import { ApplicationCommandOptionData, PermissionResolvable, ChatInputCommandInteraction, Client, AutocompleteInteraction, MessageComponentInteraction, ModalSubmitInteraction, ClientOptions, Interaction, ClientEvents, Collection, CommandInteraction, EmbedBuilder } from 'discord.js';
|
|
2
|
+
import { ApplicationCommandOptionData, PermissionResolvable, ChatInputCommandInteraction, Client, Message, AutocompleteInteraction, MessageComponentInteraction, ModalSubmitInteraction, ClientOptions, Interaction, ClientEvents, Collection, CommandInteraction, EmbedBuilder } from 'discord.js';
|
|
3
3
|
export * from 'discord.js';
|
|
4
4
|
|
|
5
5
|
interface DJSNextConfig {
|
|
@@ -22,7 +22,9 @@ interface DJSNextClientOptions extends ClientOptions {
|
|
|
22
22
|
clientId?: string;
|
|
23
23
|
guildId?: string;
|
|
24
24
|
developers?: string[];
|
|
25
|
-
|
|
25
|
+
prefixes?: string[] | string;
|
|
26
|
+
enableMentionPrefix?: boolean;
|
|
27
|
+
middleware?: (interaction: Interaction | Message, client: Client) => Promise<boolean> | boolean;
|
|
26
28
|
config?: DJSNextConfig;
|
|
27
29
|
}
|
|
28
30
|
interface FileTask<DB = any> {
|
|
@@ -43,11 +45,17 @@ interface FileCommand<DB = any> {
|
|
|
43
45
|
botPermissions?: PermissionResolvable[];
|
|
44
46
|
developerOnly?: boolean;
|
|
45
47
|
guildOnly?: boolean;
|
|
48
|
+
aliases?: string[];
|
|
46
49
|
execute?: (interaction: ChatInputCommandInteraction, client: Client & {
|
|
47
50
|
db: DB;
|
|
48
51
|
t: Function;
|
|
49
52
|
config: DJSNextConfig;
|
|
50
53
|
}) => Promise<void> | void;
|
|
54
|
+
executeText?: (message: Message, args: string[], client: Client & {
|
|
55
|
+
db: DB;
|
|
56
|
+
t: Function;
|
|
57
|
+
config: DJSNextConfig;
|
|
58
|
+
}) => Promise<void> | void;
|
|
51
59
|
autocomplete?: (interaction: AutocompleteInteraction, client: Client & {
|
|
52
60
|
db: DB;
|
|
53
61
|
t: Function;
|
|
@@ -94,6 +102,8 @@ declare class DJSNextClient<DB = any> extends Client {
|
|
|
94
102
|
private _guildId?;
|
|
95
103
|
private _developers;
|
|
96
104
|
private _middleware?;
|
|
105
|
+
private _prefixes;
|
|
106
|
+
private _enableMentionPrefix;
|
|
97
107
|
constructor(options: DJSNextClientOptions);
|
|
98
108
|
private attachCoreListeners;
|
|
99
109
|
start(token: string): Promise<void>;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as discord_js from 'discord.js';
|
|
2
|
-
import { ApplicationCommandOptionData, PermissionResolvable, ChatInputCommandInteraction, Client, AutocompleteInteraction, MessageComponentInteraction, ModalSubmitInteraction, ClientOptions, Interaction, ClientEvents, Collection, CommandInteraction, EmbedBuilder } from 'discord.js';
|
|
2
|
+
import { ApplicationCommandOptionData, PermissionResolvable, ChatInputCommandInteraction, Client, Message, AutocompleteInteraction, MessageComponentInteraction, ModalSubmitInteraction, ClientOptions, Interaction, ClientEvents, Collection, CommandInteraction, EmbedBuilder } from 'discord.js';
|
|
3
3
|
export * from 'discord.js';
|
|
4
4
|
|
|
5
5
|
interface DJSNextConfig {
|
|
@@ -22,7 +22,9 @@ interface DJSNextClientOptions extends ClientOptions {
|
|
|
22
22
|
clientId?: string;
|
|
23
23
|
guildId?: string;
|
|
24
24
|
developers?: string[];
|
|
25
|
-
|
|
25
|
+
prefixes?: string[] | string;
|
|
26
|
+
enableMentionPrefix?: boolean;
|
|
27
|
+
middleware?: (interaction: Interaction | Message, client: Client) => Promise<boolean> | boolean;
|
|
26
28
|
config?: DJSNextConfig;
|
|
27
29
|
}
|
|
28
30
|
interface FileTask<DB = any> {
|
|
@@ -43,11 +45,17 @@ interface FileCommand<DB = any> {
|
|
|
43
45
|
botPermissions?: PermissionResolvable[];
|
|
44
46
|
developerOnly?: boolean;
|
|
45
47
|
guildOnly?: boolean;
|
|
48
|
+
aliases?: string[];
|
|
46
49
|
execute?: (interaction: ChatInputCommandInteraction, client: Client & {
|
|
47
50
|
db: DB;
|
|
48
51
|
t: Function;
|
|
49
52
|
config: DJSNextConfig;
|
|
50
53
|
}) => Promise<void> | void;
|
|
54
|
+
executeText?: (message: Message, args: string[], client: Client & {
|
|
55
|
+
db: DB;
|
|
56
|
+
t: Function;
|
|
57
|
+
config: DJSNextConfig;
|
|
58
|
+
}) => Promise<void> | void;
|
|
51
59
|
autocomplete?: (interaction: AutocompleteInteraction, client: Client & {
|
|
52
60
|
db: DB;
|
|
53
61
|
t: Function;
|
|
@@ -94,6 +102,8 @@ declare class DJSNextClient<DB = any> extends Client {
|
|
|
94
102
|
private _guildId?;
|
|
95
103
|
private _developers;
|
|
96
104
|
private _middleware?;
|
|
105
|
+
private _prefixes;
|
|
106
|
+
private _enableMentionPrefix;
|
|
97
107
|
constructor(options: DJSNextClientOptions);
|
|
98
108
|
private attachCoreListeners;
|
|
99
109
|
start(token: string): Promise<void>;
|
package/dist/index.js
CHANGED
|
@@ -658,6 +658,8 @@ var DJSNextClient = class extends import_discord3.Client {
|
|
|
658
658
|
_guildId;
|
|
659
659
|
_developers;
|
|
660
660
|
_middleware;
|
|
661
|
+
_prefixes;
|
|
662
|
+
_enableMentionPrefix;
|
|
661
663
|
constructor(options) {
|
|
662
664
|
super(options);
|
|
663
665
|
this.commands = new import_discord3.Collection();
|
|
@@ -671,6 +673,9 @@ var DJSNextClient = class extends import_discord3.Client {
|
|
|
671
673
|
this._guildId = options.guildId;
|
|
672
674
|
this._developers = options.developers || [];
|
|
673
675
|
this._middleware = options.middleware;
|
|
676
|
+
const prefs = options.prefixes || [];
|
|
677
|
+
this._prefixes = Array.isArray(prefs) ? prefs : [prefs];
|
|
678
|
+
this._enableMentionPrefix = options.enableMentionPrefix ?? true;
|
|
674
679
|
this.attachCoreListeners();
|
|
675
680
|
}
|
|
676
681
|
attachCoreListeners() {
|
|
@@ -780,6 +785,77 @@ var DJSNextClient = class extends import_discord3.Client {
|
|
|
780
785
|
}
|
|
781
786
|
}
|
|
782
787
|
});
|
|
788
|
+
this.on("messageCreate", async (message2) => {
|
|
789
|
+
if (message2.author.bot) return;
|
|
790
|
+
if (this._middleware) {
|
|
791
|
+
try {
|
|
792
|
+
const shouldContinue = await this._middleware(message2, this);
|
|
793
|
+
if (!shouldContinue) return;
|
|
794
|
+
} catch (error) {
|
|
795
|
+
console.error(`[djs-next] Middleware error (Message):`, error);
|
|
796
|
+
return;
|
|
797
|
+
}
|
|
798
|
+
}
|
|
799
|
+
let content = message2.content.trim();
|
|
800
|
+
let matchedPrefix = "";
|
|
801
|
+
let isCommand = false;
|
|
802
|
+
const mentionRegex = new RegExp(`^<@!?${this.user?.id}>\\s*`);
|
|
803
|
+
if (this._enableMentionPrefix && mentionRegex.test(content)) {
|
|
804
|
+
matchedPrefix = content.match(mentionRegex)[0];
|
|
805
|
+
isCommand = true;
|
|
806
|
+
} else {
|
|
807
|
+
const sortedPrefs = [...this._prefixes].sort((a, b) => b.length - a.length);
|
|
808
|
+
if (sortedPrefs.includes("")) {
|
|
809
|
+
isCommand = true;
|
|
810
|
+
}
|
|
811
|
+
for (const p of sortedPrefs) {
|
|
812
|
+
if (p !== "" && content.startsWith(p)) {
|
|
813
|
+
matchedPrefix = p;
|
|
814
|
+
isCommand = true;
|
|
815
|
+
break;
|
|
816
|
+
}
|
|
817
|
+
}
|
|
818
|
+
}
|
|
819
|
+
if (!isCommand) return;
|
|
820
|
+
const args2 = content.slice(matchedPrefix.length).trim().split(/ +/g);
|
|
821
|
+
const commandName = args2.shift()?.toLowerCase();
|
|
822
|
+
if (!commandName) return;
|
|
823
|
+
let command2 = this.commands.get(commandName);
|
|
824
|
+
if (!command2) {
|
|
825
|
+
command2 = this.commands.find((c) => c.aliases?.includes(commandName) || false);
|
|
826
|
+
}
|
|
827
|
+
if (!command2 || !command2.executeText) return;
|
|
828
|
+
if (command2.developerOnly && !this._developers.includes(message2.author.id)) return;
|
|
829
|
+
if (command2.guildOnly && !message2.guild) return;
|
|
830
|
+
if (command2.userPermissions && message2.member?.permissions) {
|
|
831
|
+
const missing = message2.member.permissions.missing(command2.userPermissions);
|
|
832
|
+
if (missing.length > 0) return;
|
|
833
|
+
}
|
|
834
|
+
if (command2.botPermissions && message2.guild?.members.me?.permissions) {
|
|
835
|
+
const missing = message2.guild.members.me.permissions.missing(command2.botPermissions);
|
|
836
|
+
if (missing.length > 0) return;
|
|
837
|
+
}
|
|
838
|
+
if (command2.cooldown) {
|
|
839
|
+
if (!this.cooldowns.has(commandName)) this.cooldowns.set(commandName, new import_discord3.Collection());
|
|
840
|
+
const now = Date.now();
|
|
841
|
+
const timestamps = this.cooldowns.get(commandName);
|
|
842
|
+
const cooldownAmount = command2.cooldown * 1e3;
|
|
843
|
+
if (timestamps.has(message2.author.id)) {
|
|
844
|
+
const expirationTime = timestamps.get(message2.author.id) + cooldownAmount;
|
|
845
|
+
if (now < expirationTime) {
|
|
846
|
+
return void await message2.reply(`Please wait, you are on a cooldown. You can use it again <t:${Math.round(expirationTime / 1e3)}:R>.`);
|
|
847
|
+
}
|
|
848
|
+
}
|
|
849
|
+
timestamps.set(message2.author.id, now);
|
|
850
|
+
setTimeout(() => timestamps.delete(message2.author.id), cooldownAmount);
|
|
851
|
+
}
|
|
852
|
+
try {
|
|
853
|
+
await command2.executeText(message2, args2, this);
|
|
854
|
+
} catch (error) {
|
|
855
|
+
console.error(`[djs-next] Error executing text command: "${commandName}"`, error);
|
|
856
|
+
await message2.reply("We ran into an internal error executing this command.").catch(() => null);
|
|
857
|
+
}
|
|
858
|
+
});
|
|
783
859
|
}
|
|
784
860
|
async start(token) {
|
|
785
861
|
if (!token) throw new Error("[djs-next] A token must be provided to start the bot.");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/client.ts","../src/handlers/commandHandler.ts","../src/handlers/utils.ts","../src/handlers/eventHandler.ts","../src/handlers/componentHandler.ts","../src/handlers/taskHandler.ts","../src/utils/configLoader.ts","../src/utils/i18n.ts","../src/plugins/dnxt.ts","../src/utils/paginate.ts"],"sourcesContent":["export * from './client.js';\nexport { DJSNextClientOptions, FileCommand, FileComponent, FileTask, Event as DJSNextEvent, DJSNextConfig } from './types.js';\nexport * from './utils/paginate.js';\nexport * from './utils/configLoader.js';\nexport * from './utils/i18n.js';\n// Re-export everything from discord.js so users don't need to install it explicitly\nexport * from 'discord.js';\n","import { Client, Collection, Interaction } from 'discord.js';\nimport { DJSNextClientOptions, FileCommand, FileComponent, DJSNextConfig } from './types.js';\nimport { loadAndDeployCommands } from './handlers/commandHandler.js';\nimport { loadEvents } from './handlers/eventHandler.js';\nimport { loadComponents } from './handlers/componentHandler.js';\nimport { loadTasks } from './handlers/taskHandler.js';\nimport path from 'path';\nimport fs from 'fs';\nimport { pathToFileURL } from 'url';\n\nimport { loadConfig } from './utils/configLoader.js';\nimport { loadLocales, translate } from './utils/i18n.js';\nimport { handleDNXT } from './plugins/dnxt.js';\n\nexport class DJSNextClient<DB = any> extends Client {\n public commands: Collection<string, FileCommand>;\n public components: Collection<string, FileComponent>;\n public cooldowns: Collection<string, Collection<string, number>>;\n public config: DJSNextConfig = {};\n public t = translate;\n public db!: DB;\n \n private _commandsDir?: string;\n private _eventsDir?: string;\n private _componentsDir?: string;\n private _tasksDir?: string;\n private _localesDir?: string;\n private _clientId?: string;\n private _guildId?: string;\n private _developers: string[];\n private _middleware?: (interaction: Interaction, client: Client) => Promise<boolean> | boolean;\n\n constructor(options: DJSNextClientOptions) {\n super(options);\n this.commands = new Collection();\n this.components = new Collection();\n this.cooldowns = new Collection();\n \n this._commandsDir = options.commandsDir ? path.resolve(process.cwd(), options.commandsDir) : undefined;\n this._eventsDir = options.eventsDir ? path.resolve(process.cwd(), options.eventsDir) : undefined;\n this._componentsDir = options.componentsDir ? path.resolve(process.cwd(), options.componentsDir) : undefined;\n this._tasksDir = options.tasksDir ? path.resolve(process.cwd(), options.tasksDir) : undefined;\n this._clientId = options.clientId;\n this._guildId = options.guildId;\n this._developers = options.developers || [];\n this._middleware = options.middleware;\n\n this.attachCoreListeners();\n }\n\n private attachCoreListeners() {\n this.on('interactionCreate', async (interaction: Interaction) => {\n // 1. Global Middleware execution\n if (this._middleware) {\n try {\n const shouldContinue = await this._middleware(interaction, this);\n if (!shouldContinue) return; // Middleware halted execution\n } catch (error) {\n console.error(`[djs-next] Middleware error:`, error);\n return;\n }\n }\n\n // 2. Chat Input Commands Execution\n if (interaction.isChatInputCommand()) {\n let commandKey = interaction.commandName;\n const group = interaction.options.getSubcommandGroup(false);\n const sub = interaction.options.getSubcommand(false);\n\n if (group) commandKey += ` ${group}`;\n if (sub) commandKey += ` ${sub}`;\n\n const command = this.commands.get(commandKey);\n if (!command || !command.execute) return;\n\n // --- Permissions & Validation Checks ---\n if (command.developerOnly && !this._developers.includes(interaction.user.id)) {\n return interaction.reply({ content: 'Only developers can use this command.', ephemeral: true }) as never;\n }\n\n if (command.guildOnly && !interaction.inGuild()) {\n return interaction.reply({ content: 'This command can only be used in a server.', ephemeral: true }) as never;\n }\n\n if (command.userPermissions && interaction.memberPermissions) {\n const missing = interaction.memberPermissions.missing(command.userPermissions);\n if (missing.length > 0) {\n return interaction.reply({ content: `You are missing permissions: \\`${missing.join(', ')}\\``, ephemeral: true }) as never;\n }\n }\n\n if (command.botPermissions && interaction.guild?.members.me?.permissions) {\n const missing = interaction.guild.members.me.permissions.missing(command.botPermissions);\n if (missing.length > 0) {\n return interaction.reply({ content: `I am missing permissions to run this: \\`${missing.join(', ')}\\``, ephemeral: true }) as never;\n }\n }\n\n // --- Built-in Cooldowns ---\n if (command.cooldown) {\n if (!this.cooldowns.has(commandKey)) this.cooldowns.set(commandKey, new Collection());\n const now = Date.now();\n const timestamps = this.cooldowns.get(commandKey)!;\n const cooldownAmount = command.cooldown * 1000;\n\n if (timestamps.has(interaction.user.id)) {\n const expirationTime = timestamps.get(interaction.user.id)! + cooldownAmount;\n if (now < expirationTime) {\n return interaction.reply({ \n content: `Please wait, you are on a cooldown. You can use it again <t:${Math.round(expirationTime / 1000)}:R>.`, \n ephemeral: true \n }) as never;\n }\n }\n timestamps.set(interaction.user.id, now);\n setTimeout(() => timestamps.delete(interaction.user.id), cooldownAmount);\n }\n\n try {\n await command.execute(interaction, this);\n } catch (error) {\n console.error(`[djs-next] Error executing command: \"${commandKey}\"`, error);\n const msg = { content: 'We ran into an internal error executing this command. The developers have been notified.', ephemeral: true };\n if (interaction.replied || interaction.deferred) await interaction.followUp(msg).catch(()=>null);\n else await interaction.reply(msg).catch(()=>null);\n }\n }\n\n // 3. Autocomplete Routing\n if (interaction.isAutocomplete()) {\n let commandKey = interaction.commandName;\n const group = interaction.options.getSubcommandGroup(false);\n const sub = interaction.options.getSubcommand(false);\n\n if (group) commandKey += ` ${group}`;\n if (sub) commandKey += ` ${sub}`;\n\n const command = this.commands.get(commandKey);\n if (command && command.autocomplete) {\n try {\n await command.autocomplete(interaction, this);\n } catch (error) {\n console.error(`[djs-next] Error executing autocomplete for: \"${commandKey}\"`, error);\n }\n }\n }\n\n // 4. Component Routing (Buttons, Modals, Menus)\n if (interaction.isMessageComponent() || interaction.isModalSubmit()) {\n // Skip pagination built-in buttons\n if (interaction.customId === 'djs_prev' || interaction.customId === 'djs_next') return;\n\n let component = this.components.get(interaction.customId);\n let params: Record<string, string> = {};\n\n if (!component) {\n for (const [key, comp] of this.components) {\n if (!key.includes('[')) continue;\n // Escape regex chars except brackets\n const escapedKey = key.replace(/[.*+?^${}()|\\\\-]/g, '\\\\$&');\n // Transform \\[id\\] into (?<id>.+)\n const regexStr = '^' + escapedKey.replace(/\\\\\\[([^\\]]+)\\\\\\]/g, '(?<$1>.+)') + '$';\n const match = interaction.customId.match(new RegExp(regexStr));\n if (match) {\n component = comp;\n if (match.groups) params = match.groups;\n break;\n }\n }\n }\n if (component) {\n try {\n await component.execute(interaction, this, params);\n } catch (error) {\n console.error(`[djs-next] Error executing component: \"${interaction.customId}\"`, error);\n const msg = { content: 'We ran into an internal error executing this component.', ephemeral: true };\n if (interaction.replied || interaction.deferred) await interaction.followUp(msg).catch(()=>null);\n else await interaction.reply(msg).catch(()=>null);\n }\n }\n }\n });\n }\n\n public async start(token: string): Promise<void> {\n if (!token) throw new Error(\"[djs-next] A token must be provided to start the bot.\");\n\n this.config = await loadConfig();\n\n // Fallback options to config\n this._guildId = this._guildId || this.config.devGuildId;\n if (!this._commandsDir && this.config.directories?.commands) this._commandsDir = path.resolve(process.cwd(), this.config.directories.commands);\n if (!this._eventsDir && this.config.directories?.events) this._eventsDir = path.resolve(process.cwd(), this.config.directories.events);\n if (!this._componentsDir && this.config.directories?.components) this._componentsDir = path.resolve(process.cwd(), this.config.directories.components);\n if (!this._tasksDir && this.config.directories?.tasks) this._tasksDir = path.resolve(process.cwd(), this.config.directories.tasks);\n if (!this._localesDir && this.config.directories?.locales) this._localesDir = path.resolve(process.cwd(), this.config.directories.locales);\n\n if (this._localesDir) loadLocales(this._localesDir, this.config.defaultLocale);\n\n // Load middleware from root\n if (!this._middleware) {\n const exts = ['.js', '.mjs', '.cjs', '.ts', '.mts', '.cts'];\n const cwd = process.cwd();\n for (const ext of exts) {\n const mwPath = path.join(cwd, `middleware${ext}`);\n if (fs.existsSync(mwPath)) {\n try {\n const mwModule = await import(pathToFileURL(mwPath).href);\n this._middleware = mwModule.default?.middleware || mwModule.middleware || mwModule.default || mwModule;\n if (this._middleware) {\n console.log(`[djs-next] Loaded global middleware.`);\n break;\n }\n } catch (err) {\n console.error(`[djs-next] Error loading middleware file ${mwPath}:`, err);\n }\n }\n }\n }\n\n if (this._eventsDir) await loadEvents(this, this._eventsDir);\n if (this._componentsDir) this.components = await loadComponents(this._componentsDir);\n if (this._tasksDir) await loadTasks(this, this._tasksDir);\n\n if (this._commandsDir) {\n if (!this._clientId) throw new Error(\"[djs-next] You must provide a clientId to deploy commands.\");\n this.commands = await loadAndDeployCommands(this._commandsDir, token, this._clientId, this._guildId);\n }\n\n await this.login(token);\n console.log(`[djs-next] Bot is ready and logged in as ${this.user?.tag}!`);\n }\n\n public enableDevTools(prefix: 'dnxt' | 'nxt' = 'dnxt'): void {\n if (prefix !== 'dnxt' && prefix !== 'nxt') {\n throw new Error(`[djs-next] Developer Tools prefix must be either 'dnxt' or 'nxt'. Received: ${prefix}`);\n }\n\n this.on('messageCreate', async (message) => {\n await handleDNXT(message, this, prefix);\n });\n\n console.log(`[djs-next] 🛠️ Developer Tools enabled. Use \"${prefix}\" in chat. Ensure MessageContent intent is enabled!`);\n }\n\n public async enableHMR(): Promise<void> {\n try {\n const chokidar = await import('chokidar');\n console.log(`[djs-next] 🔄 HMR Enabled. Watching for file changes...`);\n\n const watcher = chokidar.watch([\n this._commandsDir, \n this._eventsDir, \n this._componentsDir, \n this._localesDir\n ].filter(Boolean) as string[], { ignoreInitial: true });\n\n watcher.on('change', async (filePath) => {\n console.log(`[djs-next] ♻️ File changed: ${filePath}. Reloading...`);\n // We will just naively re-run the loaders. \n // For events, we need to remove all listeners first to avoid memory leaks.\n this.removeAllListeners();\n this.commands.clear();\n this.components.clear();\n \n // Re-attach core listener\n this.attachCoreListeners();\n\n // Reload\n if (this._eventsDir) await loadEvents(this, this._eventsDir);\n if (this._componentsDir) this.components = await loadComponents(this._componentsDir);\n if (this._commandsDir && this._clientId) {\n this.commands = await loadAndDeployCommands(this._commandsDir, this.token!, this._clientId, this._guildId);\n }\n if (this._localesDir) loadLocales(this._localesDir, this.config.defaultLocale);\n \n console.log(`[djs-next] ✅ Hot Reload complete.`);\n });\n } catch (e) {\n console.warn(`[djs-next] chokidar not installed. HMR is disabled. Please run \"npm install chokidar\" to use this feature.`);\n }\n }\n}\n","import { Collection, REST, Routes } from 'discord.js';\nimport fs from 'fs';\nimport path from 'path';\nimport { pathToFileURL } from 'url';\nimport { FileCommand } from '../types.js';\nimport { getAllFiles } from './utils.js';\n\ninterface CommandNode {\n name: string;\n description: string;\n options: any[];\n execute?: Function;\n children: Map<string, CommandNode>;\n}\n\nexport async function loadAndDeployCommands(\n commandsDir: string, \n token: string, \n clientId: string,\n guildId?: string\n): Promise<Collection<string, FileCommand>> {\n const flatCommands = new Collection<string, FileCommand>();\n \n if (!fs.existsSync(commandsDir)) {\n console.warn(`[djs-next] Commands directory \"${commandsDir}\" does not exist.`);\n return flatCommands;\n }\n\n const commandFiles = getAllFiles(commandsDir);\n const rootNodes = new Map<string, CommandNode>();\n\n function getOrCreateNode(pathParts: string[]): CommandNode {\n let currentMap = rootNodes;\n let currentNode: CommandNode | undefined;\n\n for (const part of pathParts) {\n if (!currentMap.has(part)) {\n currentMap.set(part, {\n name: part,\n description: `${part} command`, // Fallback description\n options: [],\n children: new Map()\n });\n }\n currentNode = currentMap.get(part)!;\n currentMap = currentNode.children;\n }\n return currentNode!;\n }\n\n for (const file of commandFiles) {\n const relativePath = path.relative(commandsDir, file);\n const parsed = path.parse(relativePath);\n \n // Normalize path separators\n const dirParts = parsed.dir ? parsed.dir.split(path.sep) : [];\n const name = parsed.name;\n \n const pathParts = [...dirParts];\n if (name !== 'index') {\n pathParts.push(name);\n }\n\n if (pathParts.length === 0) continue;\n if (pathParts.length > 3) {\n console.warn(`[djs-next] Command path too deep (Discord allows max 3 levels): ${relativePath}`);\n continue;\n }\n\n const module = await import(pathToFileURL(file).href);\n const commandData: FileCommand = module.default || module.command || module;\n if (commandData) commandData.filepath = file;\n\n const node = getOrCreateNode(pathParts);\n if (commandData.description) node.description = commandData.description;\n if (commandData.options) node.options = commandData.options;\n if (commandData.execute) {\n node.execute = commandData.execute;\n // Map entire FileCommand object to a space-separated string (e.g. \"economy balance\")\n flatCommands.set(pathParts.join(' '), commandData);\n }\n }\n\n // Build JSON payloads for Discord\n function buildCommandJSON(node: CommandNode, depth: number): any {\n const json: any = {\n name: node.name,\n description: node.description,\n };\n\n if (node.children.size > 0) {\n json.options = [];\n for (const [_, childNode] of node.children) {\n const childJson = buildCommandJSON(childNode, depth + 1);\n \n // 1 = SUB_COMMAND, 2 = SUB_COMMAND_GROUP\n if (depth === 0) {\n childJson.type = childNode.children.size > 0 ? 2 : 1;\n } else if (depth === 1) {\n childJson.type = 1;\n }\n \n json.options.push(childJson);\n }\n } else if (node.options && node.options.length > 0) {\n json.options = node.options;\n }\n \n return json;\n }\n\n const commandsData = Array.from(rootNodes.values()).map(node => buildCommandJSON(node, 0));\n\n // Deploy commands\n const rest = new REST({ version: '10' }).setToken(token);\n\n try {\n console.log(`[djs-next] Started refreshing ${commandsData.length} File-System application (/) commands.`);\n\n let data: any;\n if (guildId) {\n data = await rest.put(\n Routes.applicationGuildCommands(clientId, guildId),\n { body: commandsData },\n );\n } else {\n data = await rest.put(\n Routes.applicationCommands(clientId),\n { body: commandsData },\n );\n }\n\n console.log(`[djs-next] Successfully reloaded ${data.length} File-System application (/) commands.`);\n } catch (error) {\n console.error(`[djs-next] Failed to deploy commands:`, error);\n }\n\n return flatCommands;\n}\n","import fs from 'fs';\nimport path from 'path';\n\n/**\n * Recursively gets all files in a directory\n */\nexport function getAllFiles(dirPath: string, arrayOfFiles: string[] = []): string[] {\n const files = fs.readdirSync(dirPath);\n\n files.forEach(file => {\n const fullPath = path.join(dirPath, file);\n if (fs.statSync(fullPath).isDirectory()) {\n arrayOfFiles = getAllFiles(fullPath, arrayOfFiles);\n } else {\n if (file.endsWith('.js') || file.endsWith('.ts') || file.endsWith('.mjs') || file.endsWith('.cjs')) {\n // Skip TypeScript declaration files\n if (!file.endsWith('.d.ts')) {\n arrayOfFiles.push(fullPath);\n }\n }\n }\n });\n\n return arrayOfFiles;\n}\n","import { Client } from 'discord.js';\nimport fs from 'fs';\nimport { pathToFileURL } from 'url';\nimport { Event } from '../types.js';\nimport { getAllFiles } from './utils.js';\n\nexport async function loadEvents(client: Client, eventsDir: string) {\n if (!fs.existsSync(eventsDir)) {\n console.warn(`[djs-next] Events directory \"${eventsDir}\" does not exist.`);\n return;\n }\n\n const eventFiles = getAllFiles(eventsDir);\n let loadedEvents = 0;\n\n for (const file of eventFiles) {\n const eventModule = await import(pathToFileURL(file).href);\n const eventData: Event<any> = eventModule.default?.event || eventModule.event || eventModule.default || eventModule;\n if (eventData) eventData.filepath = file;\n\n if (!eventData || !eventData.name || !eventData.execute) {\n console.warn(`[djs-next] The event at ${file} is missing a required \"name\" or \"execute\" property.`);\n continue;\n }\n\n if (eventData.once) {\n client.once(eventData.name, (...args) => eventData.execute(client, ...args));\n } else {\n client.on(eventData.name, (...args) => eventData.execute(client, ...args));\n }\n loadedEvents++;\n }\n\n if (loadedEvents > 0) {\n console.log(`[djs-next] Successfully loaded ${loadedEvents} events.`);\n }\n}\n","import { Collection } from 'discord.js';\nimport fs from 'fs';\nimport path from 'path';\nimport { pathToFileURL } from 'url';\nimport { FileComponent } from '../types.js';\nimport { getAllFiles } from './utils.js';\n\nexport async function loadComponents(componentsDir: string): Promise<Collection<string, FileComponent>> {\n const components = new Collection<string, FileComponent>();\n \n if (!fs.existsSync(componentsDir)) return components;\n\n const files = getAllFiles(componentsDir);\n\n for (const file of files) {\n const module = await import(pathToFileURL(file).href);\n const componentData: FileComponent = module.default || module.component || module;\n if (componentData) componentData.filepath = file;\n\n if (!componentData || !componentData.execute) continue;\n\n // Infer customId from filename if not explicitly provided\n const parsed = path.parse(file);\n const customId = componentData.customId || parsed.name;\n\n components.set(customId, componentData);\n }\n\n console.log(`[djs-next] Successfully loaded ${components.size} components.`);\n return components;\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { pathToFileURL } from 'url';\nimport { Client } from 'discord.js';\nimport { FileTask } from '../types.js';\nimport { getAllFiles } from './utils.js';\n\nexport async function loadTasks(client: Client, tasksDir: string) {\n if (!fs.existsSync(tasksDir)) return;\n\n const files = getAllFiles(tasksDir);\n let loaded = 0;\n\n for (const file of files) {\n const module = await import(pathToFileURL(file).href);\n const taskData: FileTask = module.default || module.task || module;\n if (taskData) taskData.filepath = file;\n\n if (!taskData || !taskData.interval || !taskData.execute) continue;\n\n const intervalId = setInterval(async () => {\n try {\n await taskData.execute(client);\n } catch (error) {\n console.error(`[djs-next] Background Task error at ${file}:`, error);\n }\n }, taskData.interval);\n\n if (!(client as any)._activeTasks) (client as any)._activeTasks = new Map();\n (client as any)._activeTasks.set(file, intervalId);\n\n loaded++;\n }\n\n if (loaded > 0) {\n console.log(`[djs-next] Successfully scheduled ${loaded} background tasks.`);\n }\n}\n","import path from 'path';\nimport fs from 'fs';\nimport { pathToFileURL } from 'url';\nimport { DJSNextConfig } from '../types.js';\n\nexport async function loadConfig(): Promise<DJSNextConfig> {\n const exts = ['.js', '.mjs', '.cjs', '.ts', '.mts', '.cts'];\n const cwd = process.cwd();\n \n for (const ext of exts) {\n const configPath = path.join(cwd, `djs-next.config${ext}`);\n if (fs.existsSync(configPath)) {\n try {\n const configModule = await import(pathToFileURL(configPath).href);\n return configModule.default || configModule;\n } catch (err) {\n console.error(`[djs-next] Error loading config file ${configPath}:`, err);\n return {};\n }\n }\n }\n return {};\n}\n\nexport function defineConfig(config: DJSNextConfig): DJSNextConfig {\n return config;\n}\n","import fs from 'fs';\nimport path from 'path';\n\nlet localesCache: Record<string, Record<string, any>> = {};\nlet defaultLoc = 'en';\n\nexport function loadLocales(localesDir: string, defaultLocale?: string) {\n if (defaultLocale) defaultLoc = defaultLocale;\n \n if (!fs.existsSync(localesDir)) return;\n\n const files = fs.readdirSync(localesDir);\n for (const file of files) {\n if (file.endsWith('.json')) {\n const lang = file.replace('.json', '');\n const content = fs.readFileSync(path.join(localesDir, file), 'utf8');\n try {\n localesCache[lang] = JSON.parse(content);\n } catch (e) {\n console.error(`[djs-next] Failed to parse locale file: ${file}`, e);\n }\n }\n }\n}\n\nexport function translate(key: string, locale: string = defaultLoc, variables?: Record<string, string | number>): string {\n // Fallback to default locale if the requested one is not found\n const dict = localesCache[locale] || localesCache[defaultLoc] || {};\n \n const keys = key.split('.');\n let value: any = dict;\n\n for (const k of keys) {\n if (value && typeof value === 'object') {\n value = value[k];\n } else {\n value = undefined;\n break;\n }\n }\n\n if (typeof value !== 'string') {\n return key; // return the key itself if string not found\n }\n\n if (variables) {\n for (const [varKey, varValue] of Object.entries(variables)) {\n value = value.replace(new RegExp(`{{s*${varKey}s*}}`, 'g'), String(varValue));\n }\n }\n\n return value;\n}\n\nexport function getLocalesCache() {\n return localesCache;\n}\n","import { Message, EmbedBuilder } from 'discord.js';\nimport { exec } from 'child_process';\nimport util from 'util';\nimport os from 'os';\nimport { DJSNextClient } from '../client.js';\nimport { loadEvents } from '../handlers/eventHandler.js';\nimport { loadComponents } from '../handlers/componentHandler.js';\nimport { loadAndDeployCommands } from '../handlers/commandHandler.js';\nimport { loadTasks } from '../handlers/taskHandler.js';\nimport { loadLocales } from '../utils/i18n.js';\n\nconst execAsync = util.promisify(exec);\n\nexport async function handleDNXT(message: Message, client: DJSNextClient, prefix: 'dnxt' | 'nxt' = 'dnxt') {\n if (message.author.bot) return;\n // Make sure only developers can use this\n if (!client['_developers'].includes(message.author.id)) return;\n\n if (!message.content.startsWith(prefix)) return;\n\n const args = message.content.slice(prefix.length).trim().split(/ +/);\n const command = args.shift()?.toLowerCase();\n\n // Root dnxt command (Stats)\n if (!command) {\n const mem = process.memoryUsage();\n const discordJsVersion = require('discord.js/package.json').version;\n const botPing = client.ws.ping;\n \n const text = \n `Module was loaded <t:${Math.floor((Date.now() - client.uptime!) / 1000)}:R>.\\n` +\n `DNXT framework plugin, discord.js \\`${discordJsVersion}\\`, \\`Node.js ${process.version}\\` on \\`${os.type()}\\`.\\n` +\n `Latencies: \\`${botPing}ms\\` websocket ping.\\n` +\n `Memory: \\`${(mem.rss / 1024 / 1024).toFixed(2)} MB\\` physical, \\`${(mem.heapUsed / 1024 / 1024).toFixed(2)} MB\\` heap.\\n` +\n `System: \\`${os.cpus().length}\\` thread(s), \\`${(os.uptime() / 60 / 60).toFixed(2)}\\` hrs system uptime.`;\n\n await message.reply(text);\n return;\n }\n\n // Evaluation (js, eval, py)\n if (command === 'js' || command === 'eval' || command === 'py') {\n let code = args.join(' ');\n if (code.startsWith('```js') || code.startsWith('```py')) code = code.replace(/^```[a-z]*|```$/g, '');\n else if (code.startsWith('```')) code = code.replace(/^```|```$/g, '');\n\n if (!code) return void await message.reply('❌ Please provide code to evaluate.');\n\n try {\n const start = process.hrtime.bigint();\n const { commands, components, config } = client;\n \n // eslint-disable-next-line no-eval\n let evaled = await eval(`(async () => { ${code} })()`);\n const end = process.hrtime.bigint();\n const timeMs = Number(end - start) / 1e6;\n\n if (typeof evaled !== 'string') evaled = util.inspect(evaled, { depth: 1 });\n\n await sendPaginatedText(message, `✅ **Evaluated in ${timeMs.toFixed(3)}ms**\\n`, evaled, 'js');\n } catch (err: any) {\n await sendPaginatedText(message, `❌ **Evaluation Error**\\n`, err.message, 'js');\n }\n return;\n }\n\n // Execute Shell (sh, shell, git)\n if (command === 'sh' || command === 'shell' || command === 'git') {\n const cmd = command === 'git' ? 'git ' + args.join(' ') : args.join(' ');\n if (!cmd) return void await message.reply('❌ Please provide a command to execute.');\n\n try {\n const start = process.hrtime.bigint();\n const { stdout, stderr } = await execAsync(cmd);\n const end = process.hrtime.bigint();\n const timeMs = Number(end - start) / 1e6;\n\n const result = stdout || stderr || 'No output.';\n await sendPaginatedText(message, `✅ **Executed in ${timeMs.toFixed(3)}ms**\\n`, result, 'sh');\n } catch (err: any) {\n await sendPaginatedText(message, `❌ **Shell Error**\\n`, err.message, 'sh');\n }\n return;\n }\n\n // Load / Unload / Reload\n if (command === 'reload' || command === 'load') {\n const target = args[0]?.toLowerCase();\n try {\n if (target === 'commands' && client['_commandsDir']) {\n client.commands.clear();\n client.commands = await loadAndDeployCommands(client['_commandsDir'], client.token!, client['_clientId']!, client['_guildId']);\n await message.reply('✅ Reloaded commands.');\n } else if (target === 'events' && client['_eventsDir']) {\n client.removeAllListeners();\n client['attachCoreListeners']();\n await loadEvents(client, client['_eventsDir']);\n await message.reply('✅ Reloaded events.');\n } else if (target === 'components' && client['_componentsDir']) {\n client.components.clear();\n client.components = await loadComponents(client['_componentsDir']);\n await message.reply('✅ Reloaded components.');\n } else if (target === 'locales' && client['_localesDir']) {\n loadLocales(client['_localesDir'], client.config.defaultLocale);\n await message.reply('✅ Reloaded locales.');\n } else if (target === 'all' || !target) {\n client.removeAllListeners();\n client['attachCoreListeners']();\n client.commands.clear();\n client.components.clear();\n if (client['_eventsDir']) await loadEvents(client, client['_eventsDir']);\n if (client['_componentsDir']) client.components = await loadComponents(client['_componentsDir']);\n if (client['_localesDir']) loadLocales(client['_localesDir'], client.config.defaultLocale);\n if (client['_commandsDir']) client.commands = await loadAndDeployCommands(client['_commandsDir'], client.token!, client['_clientId']!, client['_guildId']);\n await message.reply('✅ Reloaded all framework modules.');\n } else {\n await message.reply('❌ Unknown target. Valid targets: `commands, events, components, locales, all`');\n }\n } catch (err: any) {\n await message.reply(`❌ **Reload Error:** ${err.message}`);\n }\n return;\n }\n\n // Cat (Read File)\n if (command === 'cat') {\n const fs = await import('fs');\n const path = await import('path');\n const file = args.join(' ');\n if (!file) return void await message.reply('❌ Please provide a file to read.');\n \n try {\n const content = fs.readFileSync(path.resolve(process.cwd(), file), 'utf8');\n await sendPaginatedText(message, `📄 **${file}**\\n`, content, file.split('.').pop() || '');\n } catch (e: any) {\n await message.reply(`❌ **Error reading file:** ${e.message}`);\n }\n return;\n }\n\n // Sudo (Invoke command as another user)\n if (command === 'su' || command === 'sudo') {\n const targetUserId = args.shift();\n const cmd = args.join(' ');\n if (!targetUserId || !cmd) return void await message.reply(`❌ Usage: ${prefix} su <user_id> <command>`);\n \n try {\n const targetUser = await client.users.fetch(targetUserId.replace(/<@!?|>/g, ''));\n if (!targetUser) throw new Error('User not found.');\n \n // Create a mock message\n const mockMessage = Object.assign(Object.create(Object.getPrototypeOf(message)), message);\n mockMessage.author = targetUser;\n if (message.guild) {\n mockMessage.member = await message.guild.members.fetch(targetUser.id).catch(() => null);\n }\n mockMessage.content = cmd;\n \n client.emit('messageCreate', mockMessage as Message);\n await message.reply(`✅ Invoked \\`${cmd}\\` as **${targetUser.tag}**.`);\n } catch (e: any) {\n await message.reply(`❌ **Sudo Error:** ${e.message}`);\n }\n return;\n }\n\n // Source Command (dnxt source <command>)\n if (command === 'source' || command === 'src') {\n const target = args.join(' ');\n if (!target) return void await message.reply('❌ Please provide a command name.');\n const cmdData = client.commands.get(target);\n if (!cmdData || !cmdData.filepath) return void await message.reply('❌ Command not found or has no associated filepath.');\n \n try {\n const fs = await import('fs');\n const content = fs.readFileSync(cmdData.filepath, 'utf8');\n await sendPaginatedText(message, `📄 **Source of \\`${target}\\`**\\n`, content, cmdData.filepath.split('.').pop() || '');\n } catch (e: any) {\n await message.reply(`❌ **Error reading source:** ${e.message}`);\n }\n return;\n }\n\n // Curl (dnxt curl <url>)\n if (command === 'curl') {\n const url = args[0];\n if (!url) return void await message.reply('❌ Please provide a URL.');\n try {\n const res = await fetch(url);\n const text = await res.text();\n await sendPaginatedText(message, `🌐 **Fetched from \\`${url}\\`**\\n`, text, 'html');\n } catch (e: any) {\n await message.reply(`❌ **Curl Error:** ${e.message}`);\n }\n return;\n }\n\n // Debug Command (dnxt debug <command>)\n // In discord.py DNXT debug measures execution of a command.\n // In our case we will run a js eval and time it explicitly with heap usage.\n if (command === 'debug') {\n let code = args.join(' ');\n if (code.startsWith('```js') || code.startsWith('```py')) code = code.replace(/^```[a-z]*|```$/g, '');\n else if (code.startsWith('```')) code = code.replace(/^```|```$/g, '');\n if (!code) return void await message.reply('❌ Please provide code to debug.');\n \n try {\n const startMem = process.memoryUsage().heapUsed;\n const start = process.hrtime.bigint();\n const { commands, components, config } = client;\n \n // eslint-disable-next-line no-eval\n let evaled = await eval(`(async () => { ${code} })()`);\n \n const end = process.hrtime.bigint();\n const endMem = process.memoryUsage().heapUsed;\n const timeMs = Number(end - start) / 1e6;\n const memDiff = (endMem - startMem) / 1024 / 1024;\n \n if (typeof evaled !== 'string') evaled = util.inspect(evaled, { depth: 1 });\n \n await sendPaginatedText(message, `⏱️ **Debug Execution**\\nTime: \\`${timeMs.toFixed(3)}ms\\` | Heap Delta: \\`${memDiff.toFixed(3)}MB\\`\\n`, evaled, 'js');\n } catch (err: any) {\n await sendPaginatedText(message, `❌ **Debug Error**\\n`, err.message, 'js');\n }\n return;\n }\n\n // In Command (dnxt in <channel_id> <command>)\n if (command === 'in') {\n const channelId = args.shift()?.replace(/<#|>/g, '');\n const cmd = args.join(' ');\n if (!channelId || !cmd) return void await message.reply(`❌ Usage: ${prefix} in <channel> <command>`);\n try {\n const targetChannel = await client.channels.fetch(channelId);\n if (!targetChannel || !targetChannel.isTextBased()) throw new Error('Invalid Text Channel.');\n \n const mockMessage = Object.assign(Object.create(Object.getPrototypeOf(message)), message);\n mockMessage.channel = targetChannel;\n mockMessage.channelId = targetChannel.id;\n mockMessage.content = cmd;\n \n client.emit('messageCreate', mockMessage as Message);\n await message.reply(`✅ Redirected execution to <#${targetChannel.id}>.`);\n } catch (e: any) {\n await message.reply(`❌ **In Error:** ${e.message}`);\n }\n return;\n }\n\n // Tasks Command (dnxt tasks)\n if (command === 'tasks') {\n const tasks = (client as any)._activeTasks as Map<string, NodeJS.Timeout>;\n if (!tasks || tasks.size === 0) return void await message.reply('No active background tasks running.');\n \n let text = `⚙️ **Active Background Tasks (${tasks.size})**\\n`;\n for (const [name] of tasks.entries()) {\n text += `- \\`${name.split('/').pop()}\\`\\n`;\n }\n await sendPaginatedText(message, '', text, '');\n return;\n }\n\n // Cancel Command (dnxt cancel <task>)\n if (command === 'cancel') {\n const target = args.join(' ');\n if (!target) return void await message.reply(`❌ Usage: ${prefix} cancel <task_name>`);\n \n const tasks = (client as any)._activeTasks as Map<string, NodeJS.Timeout>;\n if (!tasks) return void await message.reply('No active tasks to cancel.');\n \n let found = false;\n for (const [name, intervalId] of tasks.entries()) {\n if (name.includes(target)) {\n clearInterval(intervalId);\n tasks.delete(name);\n found = true;\n await message.reply(`✅ Cancelled background task: \\`${name.split('/').pop()}\\``);\n break;\n }\n }\n if (!found) await message.reply('❌ Task not found.');\n return;\n }\n\n // Sync Command (dnxt sync)\n if (command === 'sync') {\n try {\n await message.reply('🔄 Force syncing slash commands...');\n await loadAndDeployCommands((client as any)._commandsDir, client.token!, (client as any)._clientId, (client as any)._guildId);\n await message.reply('✅ Slash commands synchronized globally/locally.');\n } catch (e: any) {\n await message.reply(`❌ **Sync Error:** ${e.message}`);\n }\n return;\n }\n\n // SQL Command (dnxt sql <query>)\n if (command === 'sql') {\n const query = args.join(' ');\n if (!query) return void await message.reply(`❌ Usage: ${prefix} sql <query>`);\n \n try {\n let res: any;\n if (client.db && typeof client.db.$queryRawUnsafe === 'function') {\n res = await client.db.$queryRawUnsafe(query); // Prisma fallback\n } else if (client.db && typeof client.db.query === 'function') {\n res = await client.db.query(query); // PG/MySQL fallback\n } else {\n return void await message.reply('❌ Your configured `client.db` does not expose a recognized raw SQL execution method (`$queryRawUnsafe` or `query`).');\n }\n const inspect = util.inspect(res, { depth: 2 });\n await sendPaginatedText(message, `🗄️ **SQL Query**\\n`, inspect, 'js');\n } catch (e: any) {\n await message.reply(`❌ **SQL Error:** ${e.message}`);\n }\n return;\n }\n\n // Voice Command (dnxt vc)\n if (command === 'vc' || command === 'voice') {\n if (!message.guild) return void await message.reply('❌ This command must be used in a server.');\n const me = message.guild.members.me;\n if (!me?.voice?.channel) return void await message.reply('❌ Bot is not currently in a voice channel.');\n \n const text = `🎙️ **Voice Debugger**\\n` +\n `Channel: <#${me.voice.channel.id}> (\\`${me.voice.channel.id}\\`)\\n` +\n `Muted: ${me.voice.mute} | Deafened: ${me.voice.deaf}\\n` +\n `Session ID: \\`${me.voice.sessionId || 'None'}\\``;\n await message.reply(text);\n return;\n }\n\n await message.reply(`❓ Unknown ${prefix} command. Available: \\`js, sh, git, cat, curl, su, in, source, debug, reload, tasks, cancel, sync, sql, vc\\``);\n}\n\nasync function sendPaginatedText(message: Message, header: string, content: string, language: string = '') {\n const maxLength = 1900;\n if (content.length <= maxLength) {\n await message.reply(`${header}\\`\\`\\`${language}\\n${content}\\n\\`\\`\\``);\n return;\n }\n\n const chunks: string[] = [];\n for (let i = 0; i < content.length; i += maxLength) {\n chunks.push(content.substring(i, i + maxLength));\n }\n\n let index = 0;\n const reply = await message.reply(`${header}\\`\\`\\`${language}\\n${chunks[index]}\\n\\`\\`\\`\\n*Page 1 of ${chunks.length}*`);\n\n await reply.react('◀️');\n await reply.react('▶️');\n await reply.react('⏹️');\n\n const collector = reply.createReactionCollector({\n filter: (reaction, user) => ['◀️', '▶️', '⏹️'].includes(reaction.emoji.name!) && user.id === message.author.id,\n time: 120000\n });\n\n collector.on('collect', async (reaction, user) => {\n await reaction.users.remove(user.id).catch(() => null);\n\n if (reaction.emoji.name === '◀️') {\n index = index > 0 ? index - 1 : index;\n } else if (reaction.emoji.name === '▶️') {\n index = index < chunks.length - 1 ? index + 1 : index;\n } else if (reaction.emoji.name === '⏹️') {\n collector.stop();\n return;\n }\n\n await reply.edit(`${header}\\`\\`\\`${language}\\n${chunks[index]}\\n\\`\\`\\`\\n*Page ${index + 1} of ${chunks.length}*`);\n });\n\n collector.on('end', () => {\n reply.reactions.removeAll().catch(() => null);\n });\n}\n","import {\n ActionRowBuilder,\n ButtonBuilder,\n ButtonStyle,\n CommandInteraction,\n EmbedBuilder,\n MessageComponentInteraction\n} from 'discord.js';\n\nexport async function paginate(\n interaction: CommandInteraction | MessageComponentInteraction,\n pages: EmbedBuilder[],\n time: number = 60000\n) {\n if (!interaction.deferred && !interaction.replied) {\n await interaction.deferReply();\n }\n\n if (pages.length === 1) {\n return interaction.editReply({ embeds: [pages[0]], components: [] });\n }\n\n let index = 0;\n\n const prevButton = new ButtonBuilder()\n .setCustomId('djs_prev')\n .setLabel('Previous')\n .setStyle(ButtonStyle.Primary)\n .setDisabled(true);\n\n const nextButton = new ButtonBuilder()\n .setCustomId('djs_next')\n .setLabel('Next')\n .setStyle(ButtonStyle.Primary);\n\n const row = new ActionRowBuilder<ButtonBuilder>().addComponents(prevButton, nextButton);\n\n const message = await interaction.editReply({\n embeds: [pages[index]],\n components: [row],\n });\n\n const collector = message.createMessageComponentCollector({\n filter: (i) => i.user.id === interaction.user.id,\n time\n });\n\n collector.on('collect', async (i) => {\n if (i.customId === 'djs_prev') {\n index = index > 0 ? index - 1 : index;\n } else if (i.customId === 'djs_next') {\n index = index < pages.length - 1 ? index + 1 : index;\n }\n\n prevButton.setDisabled(index === 0);\n nextButton.setDisabled(index === pages.length - 1);\n\n await i.update({\n embeds: [pages[index]],\n components: [new ActionRowBuilder<ButtonBuilder>().addComponents(prevButton, nextButton)]\n });\n });\n\n collector.on('end', async () => {\n prevButton.setDisabled(true);\n nextButton.setDisabled(true);\n await interaction.editReply({\n components: [new ActionRowBuilder<ButtonBuilder>().addComponents(prevButton, nextButton)]\n }).catch(() => {});\n });\n}\n"],"mappings":"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","names":["import_discord","import_fs","import_path","fs","path","fs","path","module","import_fs","import_url","client","fs","args","import_discord","import_fs","import_path","import_url","components","fs","module","path","import_fs","import_url","client","fs","module","import_path","import_fs","import_url","import_path","import_fs","import_url","path","fs","config","import_fs","import_path","fs","path","util","os","start","end","timeMs","fs","path","message","path","command","fs","prefix","message","import_discord","message"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/client.ts","../src/handlers/commandHandler.ts","../src/handlers/utils.ts","../src/handlers/eventHandler.ts","../src/handlers/componentHandler.ts","../src/handlers/taskHandler.ts","../src/utils/configLoader.ts","../src/utils/i18n.ts","../src/plugins/dnxt.ts","../src/utils/paginate.ts"],"sourcesContent":["export * from './client.js';\nexport { DJSNextClientOptions, FileCommand, FileComponent, FileTask, Event as DJSNextEvent, DJSNextConfig } from './types.js';\nexport * from './utils/paginate.js';\nexport * from './utils/configLoader.js';\nexport * from './utils/i18n.js';\n// Re-export everything from discord.js so users don't need to install it explicitly\nexport * from 'discord.js';\n","import { Client, Collection, Interaction, Message } from 'discord.js';\nimport { DJSNextClientOptions, FileCommand, FileComponent, DJSNextConfig } from './types.js';\nimport { loadAndDeployCommands } from './handlers/commandHandler.js';\nimport { loadEvents } from './handlers/eventHandler.js';\nimport { loadComponents } from './handlers/componentHandler.js';\nimport { loadTasks } from './handlers/taskHandler.js';\nimport path from 'path';\nimport fs from 'fs';\nimport { pathToFileURL } from 'url';\n\nimport { loadConfig } from './utils/configLoader.js';\nimport { loadLocales, translate } from './utils/i18n.js';\nimport { handleDNXT } from './plugins/dnxt.js';\n\nexport class DJSNextClient<DB = any> extends Client {\n public commands: Collection<string, FileCommand>;\n public components: Collection<string, FileComponent>;\n public cooldowns: Collection<string, Collection<string, number>>;\n public config: DJSNextConfig = {};\n public t = translate;\n public db!: DB;\n \n private _commandsDir?: string;\n private _eventsDir?: string;\n private _componentsDir?: string;\n private _tasksDir?: string;\n private _localesDir?: string;\n private _clientId?: string;\n private _guildId?: string;\n private _developers: string[];\n private _middleware?: (interaction: Interaction | Message, client: Client) => Promise<boolean> | boolean;\n private _prefixes: string[];\n private _enableMentionPrefix: boolean;\n\n constructor(options: DJSNextClientOptions) {\n super(options);\n this.commands = new Collection();\n this.components = new Collection();\n this.cooldowns = new Collection();\n \n this._commandsDir = options.commandsDir ? path.resolve(process.cwd(), options.commandsDir) : undefined;\n this._eventsDir = options.eventsDir ? path.resolve(process.cwd(), options.eventsDir) : undefined;\n this._componentsDir = options.componentsDir ? path.resolve(process.cwd(), options.componentsDir) : undefined;\n this._tasksDir = options.tasksDir ? path.resolve(process.cwd(), options.tasksDir) : undefined;\n this._clientId = options.clientId;\n this._guildId = options.guildId;\n this._developers = options.developers || [];\n this._middleware = options.middleware as any;\n \n const prefs = options.prefixes || [];\n this._prefixes = Array.isArray(prefs) ? prefs : [prefs];\n this._enableMentionPrefix = options.enableMentionPrefix ?? true;\n\n this.attachCoreListeners();\n }\n\n private attachCoreListeners() {\n this.on('interactionCreate', async (interaction: Interaction) => {\n // 1. Global Middleware execution\n if (this._middleware) {\n try {\n const shouldContinue = await this._middleware(interaction, this);\n if (!shouldContinue) return; // Middleware halted execution\n } catch (error) {\n console.error(`[djs-next] Middleware error:`, error);\n return;\n }\n }\n\n // 2. Chat Input Commands Execution\n if (interaction.isChatInputCommand()) {\n let commandKey = interaction.commandName;\n const group = interaction.options.getSubcommandGroup(false);\n const sub = interaction.options.getSubcommand(false);\n\n if (group) commandKey += ` ${group}`;\n if (sub) commandKey += ` ${sub}`;\n\n const command = this.commands.get(commandKey);\n if (!command || !command.execute) return;\n\n // --- Permissions & Validation Checks ---\n if (command.developerOnly && !this._developers.includes(interaction.user.id)) {\n return interaction.reply({ content: 'Only developers can use this command.', ephemeral: true }) as never;\n }\n\n if (command.guildOnly && !interaction.inGuild()) {\n return interaction.reply({ content: 'This command can only be used in a server.', ephemeral: true }) as never;\n }\n\n if (command.userPermissions && interaction.memberPermissions) {\n const missing = interaction.memberPermissions.missing(command.userPermissions);\n if (missing.length > 0) {\n return interaction.reply({ content: `You are missing permissions: \\`${missing.join(', ')}\\``, ephemeral: true }) as never;\n }\n }\n\n if (command.botPermissions && interaction.guild?.members.me?.permissions) {\n const missing = interaction.guild.members.me.permissions.missing(command.botPermissions);\n if (missing.length > 0) {\n return interaction.reply({ content: `I am missing permissions to run this: \\`${missing.join(', ')}\\``, ephemeral: true }) as never;\n }\n }\n\n // --- Built-in Cooldowns ---\n if (command.cooldown) {\n if (!this.cooldowns.has(commandKey)) this.cooldowns.set(commandKey, new Collection());\n const now = Date.now();\n const timestamps = this.cooldowns.get(commandKey)!;\n const cooldownAmount = command.cooldown * 1000;\n\n if (timestamps.has(interaction.user.id)) {\n const expirationTime = timestamps.get(interaction.user.id)! + cooldownAmount;\n if (now < expirationTime) {\n return interaction.reply({ \n content: `Please wait, you are on a cooldown. You can use it again <t:${Math.round(expirationTime / 1000)}:R>.`, \n ephemeral: true \n }) as never;\n }\n }\n timestamps.set(interaction.user.id, now);\n setTimeout(() => timestamps.delete(interaction.user.id), cooldownAmount);\n }\n\n try {\n await command.execute(interaction, this);\n } catch (error) {\n console.error(`[djs-next] Error executing command: \"${commandKey}\"`, error);\n const msg = { content: 'We ran into an internal error executing this command. The developers have been notified.', ephemeral: true };\n if (interaction.replied || interaction.deferred) await interaction.followUp(msg).catch(()=>null);\n else await interaction.reply(msg).catch(()=>null);\n }\n }\n\n // 3. Autocomplete Routing\n if (interaction.isAutocomplete()) {\n let commandKey = interaction.commandName;\n const group = interaction.options.getSubcommandGroup(false);\n const sub = interaction.options.getSubcommand(false);\n\n if (group) commandKey += ` ${group}`;\n if (sub) commandKey += ` ${sub}`;\n\n const command = this.commands.get(commandKey);\n if (command && command.autocomplete) {\n try {\n await command.autocomplete(interaction, this);\n } catch (error) {\n console.error(`[djs-next] Error executing autocomplete for: \"${commandKey}\"`, error);\n }\n }\n }\n\n // 4. Component Routing (Buttons, Modals, Menus)\n if (interaction.isMessageComponent() || interaction.isModalSubmit()) {\n // Skip pagination built-in buttons\n if (interaction.customId === 'djs_prev' || interaction.customId === 'djs_next') return;\n\n let component = this.components.get(interaction.customId);\n let params: Record<string, string> = {};\n\n if (!component) {\n for (const [key, comp] of this.components) {\n if (!key.includes('[')) continue;\n // Escape regex chars except brackets\n const escapedKey = key.replace(/[.*+?^${}()|\\\\-]/g, '\\\\$&');\n // Transform \\[id\\] into (?<id>.+)\n const regexStr = '^' + escapedKey.replace(/\\\\\\[([^\\]]+)\\\\\\]/g, '(?<$1>.+)') + '$';\n const match = interaction.customId.match(new RegExp(regexStr));\n if (match) {\n component = comp;\n if (match.groups) params = match.groups;\n break;\n }\n }\n }\n if (component) {\n try {\n await component.execute(interaction, this, params);\n } catch (error) {\n console.error(`[djs-next] Error executing component: \"${interaction.customId}\"`, error);\n const msg = { content: 'We ran into an internal error executing this component.', ephemeral: true };\n if (interaction.replied || interaction.deferred) await interaction.followUp(msg).catch(()=>null);\n else await interaction.reply(msg).catch(()=>null);\n }\n }\n }\n });\n\n this.on('messageCreate', async (message: Message) => {\n if (message.author.bot) return;\n\n // Global Middleware execution for Messages\n if (this._middleware) {\n try {\n const shouldContinue = await this._middleware(message, this);\n if (!shouldContinue) return;\n } catch (error) {\n console.error(`[djs-next] Middleware error (Message):`, error);\n return;\n }\n }\n\n let content = message.content.trim();\n let matchedPrefix = '';\n let isCommand = false;\n\n // 1. Check Mention Prefix\n const mentionRegex = new RegExp(`^<@!?${this.user?.id}>\\\\s*`);\n if (this._enableMentionPrefix && mentionRegex.test(content)) {\n matchedPrefix = content.match(mentionRegex)![0];\n isCommand = true;\n } else {\n // 2. Check Standard/No Prefixes\n // Sort by length descending so longer prefixes match first\n const sortedPrefs = [...this._prefixes].sort((a, b) => b.length - a.length);\n \n // If prefixes array is empty or contains an empty string, it means \"no prefix\" is supported!\n if (sortedPrefs.includes('')) {\n isCommand = true; \n }\n\n for (const p of sortedPrefs) {\n if (p !== '' && content.startsWith(p)) {\n matchedPrefix = p;\n isCommand = true;\n break;\n }\n }\n }\n\n if (!isCommand) return;\n\n const args = content.slice(matchedPrefix.length).trim().split(/ +/g);\n const commandName = args.shift()?.toLowerCase();\n if (!commandName) return;\n\n // Find the command\n let command = this.commands.get(commandName);\n if (!command) {\n // Check aliases\n command = this.commands.find(c => c.aliases?.includes(commandName) || false);\n }\n\n if (!command || !command.executeText) return;\n\n // Validation Checks (Developers/GuildOnly)\n if (command.developerOnly && !this._developers.includes(message.author.id)) return;\n if (command.guildOnly && !message.guild) return;\n\n if (command.userPermissions && message.member?.permissions) {\n const missing = message.member.permissions.missing(command.userPermissions);\n if (missing.length > 0) return;\n }\n if (command.botPermissions && message.guild?.members.me?.permissions) {\n const missing = message.guild.members.me.permissions.missing(command.botPermissions);\n if (missing.length > 0) return;\n }\n\n // Cooldowns\n if (command.cooldown) {\n if (!this.cooldowns.has(commandName)) this.cooldowns.set(commandName, new Collection());\n const now = Date.now();\n const timestamps = this.cooldowns.get(commandName)!;\n const cooldownAmount = command.cooldown * 1000;\n\n if (timestamps.has(message.author.id)) {\n const expirationTime = timestamps.get(message.author.id)! + cooldownAmount;\n if (now < expirationTime) {\n return void await message.reply(`Please wait, you are on a cooldown. You can use it again <t:${Math.round(expirationTime / 1000)}:R>.`);\n }\n }\n timestamps.set(message.author.id, now);\n setTimeout(() => timestamps.delete(message.author.id), cooldownAmount);\n }\n\n // Execute Text Command\n try {\n await command.executeText(message, args, this);\n } catch (error) {\n console.error(`[djs-next] Error executing text command: \"${commandName}\"`, error);\n await message.reply('We ran into an internal error executing this command.').catch(() => null);\n }\n });\n }\n\n public async start(token: string): Promise<void> {\n if (!token) throw new Error(\"[djs-next] A token must be provided to start the bot.\");\n\n this.config = await loadConfig();\n\n // Fallback options to config\n this._guildId = this._guildId || this.config.devGuildId;\n if (!this._commandsDir && this.config.directories?.commands) this._commandsDir = path.resolve(process.cwd(), this.config.directories.commands);\n if (!this._eventsDir && this.config.directories?.events) this._eventsDir = path.resolve(process.cwd(), this.config.directories.events);\n if (!this._componentsDir && this.config.directories?.components) this._componentsDir = path.resolve(process.cwd(), this.config.directories.components);\n if (!this._tasksDir && this.config.directories?.tasks) this._tasksDir = path.resolve(process.cwd(), this.config.directories.tasks);\n if (!this._localesDir && this.config.directories?.locales) this._localesDir = path.resolve(process.cwd(), this.config.directories.locales);\n\n if (this._localesDir) loadLocales(this._localesDir, this.config.defaultLocale);\n\n // Load middleware from root\n if (!this._middleware) {\n const exts = ['.js', '.mjs', '.cjs', '.ts', '.mts', '.cts'];\n const cwd = process.cwd();\n for (const ext of exts) {\n const mwPath = path.join(cwd, `middleware${ext}`);\n if (fs.existsSync(mwPath)) {\n try {\n const mwModule = await import(pathToFileURL(mwPath).href);\n this._middleware = mwModule.default?.middleware || mwModule.middleware || mwModule.default || mwModule;\n if (this._middleware) {\n console.log(`[djs-next] Loaded global middleware.`);\n break;\n }\n } catch (err) {\n console.error(`[djs-next] Error loading middleware file ${mwPath}:`, err);\n }\n }\n }\n }\n\n if (this._eventsDir) await loadEvents(this, this._eventsDir);\n if (this._componentsDir) this.components = await loadComponents(this._componentsDir);\n if (this._tasksDir) await loadTasks(this, this._tasksDir);\n\n if (this._commandsDir) {\n if (!this._clientId) throw new Error(\"[djs-next] You must provide a clientId to deploy commands.\");\n this.commands = await loadAndDeployCommands(this._commandsDir, token, this._clientId, this._guildId);\n }\n\n await this.login(token);\n console.log(`[djs-next] Bot is ready and logged in as ${this.user?.tag}!`);\n }\n\n public enableDevTools(prefix: 'dnxt' | 'nxt' = 'dnxt'): void {\n if (prefix !== 'dnxt' && prefix !== 'nxt') {\n throw new Error(`[djs-next] Developer Tools prefix must be either 'dnxt' or 'nxt'. Received: ${prefix}`);\n }\n\n this.on('messageCreate', async (message) => {\n await handleDNXT(message, this, prefix);\n });\n\n console.log(`[djs-next] 🛠️ Developer Tools enabled. Use \"${prefix}\" in chat. Ensure MessageContent intent is enabled!`);\n }\n\n public async enableHMR(): Promise<void> {\n try {\n const chokidar = await import('chokidar');\n console.log(`[djs-next] 🔄 HMR Enabled. Watching for file changes...`);\n\n const watcher = chokidar.watch([\n this._commandsDir, \n this._eventsDir, \n this._componentsDir, \n this._localesDir\n ].filter(Boolean) as string[], { ignoreInitial: true });\n\n watcher.on('change', async (filePath) => {\n console.log(`[djs-next] ♻️ File changed: ${filePath}. Reloading...`);\n // We will just naively re-run the loaders. \n // For events, we need to remove all listeners first to avoid memory leaks.\n this.removeAllListeners();\n this.commands.clear();\n this.components.clear();\n \n // Re-attach core listener\n this.attachCoreListeners();\n\n // Reload\n if (this._eventsDir) await loadEvents(this, this._eventsDir);\n if (this._componentsDir) this.components = await loadComponents(this._componentsDir);\n if (this._commandsDir && this._clientId) {\n this.commands = await loadAndDeployCommands(this._commandsDir, this.token!, this._clientId, this._guildId);\n }\n if (this._localesDir) loadLocales(this._localesDir, this.config.defaultLocale);\n \n console.log(`[djs-next] ✅ Hot Reload complete.`);\n });\n } catch (e) {\n console.warn(`[djs-next] chokidar not installed. HMR is disabled. Please run \"npm install chokidar\" to use this feature.`);\n }\n }\n}\n","import { Collection, REST, Routes } from 'discord.js';\nimport fs from 'fs';\nimport path from 'path';\nimport { pathToFileURL } from 'url';\nimport { FileCommand } from '../types.js';\nimport { getAllFiles } from './utils.js';\n\ninterface CommandNode {\n name: string;\n description: string;\n options: any[];\n execute?: Function;\n children: Map<string, CommandNode>;\n}\n\nexport async function loadAndDeployCommands(\n commandsDir: string, \n token: string, \n clientId: string,\n guildId?: string\n): Promise<Collection<string, FileCommand>> {\n const flatCommands = new Collection<string, FileCommand>();\n \n if (!fs.existsSync(commandsDir)) {\n console.warn(`[djs-next] Commands directory \"${commandsDir}\" does not exist.`);\n return flatCommands;\n }\n\n const commandFiles = getAllFiles(commandsDir);\n const rootNodes = new Map<string, CommandNode>();\n\n function getOrCreateNode(pathParts: string[]): CommandNode {\n let currentMap = rootNodes;\n let currentNode: CommandNode | undefined;\n\n for (const part of pathParts) {\n if (!currentMap.has(part)) {\n currentMap.set(part, {\n name: part,\n description: `${part} command`, // Fallback description\n options: [],\n children: new Map()\n });\n }\n currentNode = currentMap.get(part)!;\n currentMap = currentNode.children;\n }\n return currentNode!;\n }\n\n for (const file of commandFiles) {\n const relativePath = path.relative(commandsDir, file);\n const parsed = path.parse(relativePath);\n \n // Normalize path separators\n const dirParts = parsed.dir ? parsed.dir.split(path.sep) : [];\n const name = parsed.name;\n \n const pathParts = [...dirParts];\n if (name !== 'index') {\n pathParts.push(name);\n }\n\n if (pathParts.length === 0) continue;\n if (pathParts.length > 3) {\n console.warn(`[djs-next] Command path too deep (Discord allows max 3 levels): ${relativePath}`);\n continue;\n }\n\n const module = await import(pathToFileURL(file).href);\n const commandData: FileCommand = module.default || module.command || module;\n if (commandData) commandData.filepath = file;\n\n const node = getOrCreateNode(pathParts);\n if (commandData.description) node.description = commandData.description;\n if (commandData.options) node.options = commandData.options;\n if (commandData.execute) {\n node.execute = commandData.execute;\n // Map entire FileCommand object to a space-separated string (e.g. \"economy balance\")\n flatCommands.set(pathParts.join(' '), commandData);\n }\n }\n\n // Build JSON payloads for Discord\n function buildCommandJSON(node: CommandNode, depth: number): any {\n const json: any = {\n name: node.name,\n description: node.description,\n };\n\n if (node.children.size > 0) {\n json.options = [];\n for (const [_, childNode] of node.children) {\n const childJson = buildCommandJSON(childNode, depth + 1);\n \n // 1 = SUB_COMMAND, 2 = SUB_COMMAND_GROUP\n if (depth === 0) {\n childJson.type = childNode.children.size > 0 ? 2 : 1;\n } else if (depth === 1) {\n childJson.type = 1;\n }\n \n json.options.push(childJson);\n }\n } else if (node.options && node.options.length > 0) {\n json.options = node.options;\n }\n \n return json;\n }\n\n const commandsData = Array.from(rootNodes.values()).map(node => buildCommandJSON(node, 0));\n\n // Deploy commands\n const rest = new REST({ version: '10' }).setToken(token);\n\n try {\n console.log(`[djs-next] Started refreshing ${commandsData.length} File-System application (/) commands.`);\n\n let data: any;\n if (guildId) {\n data = await rest.put(\n Routes.applicationGuildCommands(clientId, guildId),\n { body: commandsData },\n );\n } else {\n data = await rest.put(\n Routes.applicationCommands(clientId),\n { body: commandsData },\n );\n }\n\n console.log(`[djs-next] Successfully reloaded ${data.length} File-System application (/) commands.`);\n } catch (error) {\n console.error(`[djs-next] Failed to deploy commands:`, error);\n }\n\n return flatCommands;\n}\n","import fs from 'fs';\nimport path from 'path';\n\n/**\n * Recursively gets all files in a directory\n */\nexport function getAllFiles(dirPath: string, arrayOfFiles: string[] = []): string[] {\n const files = fs.readdirSync(dirPath);\n\n files.forEach(file => {\n const fullPath = path.join(dirPath, file);\n if (fs.statSync(fullPath).isDirectory()) {\n arrayOfFiles = getAllFiles(fullPath, arrayOfFiles);\n } else {\n if (file.endsWith('.js') || file.endsWith('.ts') || file.endsWith('.mjs') || file.endsWith('.cjs')) {\n // Skip TypeScript declaration files\n if (!file.endsWith('.d.ts')) {\n arrayOfFiles.push(fullPath);\n }\n }\n }\n });\n\n return arrayOfFiles;\n}\n","import { Client } from 'discord.js';\nimport fs from 'fs';\nimport { pathToFileURL } from 'url';\nimport { Event } from '../types.js';\nimport { getAllFiles } from './utils.js';\n\nexport async function loadEvents(client: Client, eventsDir: string) {\n if (!fs.existsSync(eventsDir)) {\n console.warn(`[djs-next] Events directory \"${eventsDir}\" does not exist.`);\n return;\n }\n\n const eventFiles = getAllFiles(eventsDir);\n let loadedEvents = 0;\n\n for (const file of eventFiles) {\n const eventModule = await import(pathToFileURL(file).href);\n const eventData: Event<any> = eventModule.default?.event || eventModule.event || eventModule.default || eventModule;\n if (eventData) eventData.filepath = file;\n\n if (!eventData || !eventData.name || !eventData.execute) {\n console.warn(`[djs-next] The event at ${file} is missing a required \"name\" or \"execute\" property.`);\n continue;\n }\n\n if (eventData.once) {\n client.once(eventData.name, (...args) => eventData.execute(client, ...args));\n } else {\n client.on(eventData.name, (...args) => eventData.execute(client, ...args));\n }\n loadedEvents++;\n }\n\n if (loadedEvents > 0) {\n console.log(`[djs-next] Successfully loaded ${loadedEvents} events.`);\n }\n}\n","import { Collection } from 'discord.js';\nimport fs from 'fs';\nimport path from 'path';\nimport { pathToFileURL } from 'url';\nimport { FileComponent } from '../types.js';\nimport { getAllFiles } from './utils.js';\n\nexport async function loadComponents(componentsDir: string): Promise<Collection<string, FileComponent>> {\n const components = new Collection<string, FileComponent>();\n \n if (!fs.existsSync(componentsDir)) return components;\n\n const files = getAllFiles(componentsDir);\n\n for (const file of files) {\n const module = await import(pathToFileURL(file).href);\n const componentData: FileComponent = module.default || module.component || module;\n if (componentData) componentData.filepath = file;\n\n if (!componentData || !componentData.execute) continue;\n\n // Infer customId from filename if not explicitly provided\n const parsed = path.parse(file);\n const customId = componentData.customId || parsed.name;\n\n components.set(customId, componentData);\n }\n\n console.log(`[djs-next] Successfully loaded ${components.size} components.`);\n return components;\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { pathToFileURL } from 'url';\nimport { Client } from 'discord.js';\nimport { FileTask } from '../types.js';\nimport { getAllFiles } from './utils.js';\n\nexport async function loadTasks(client: Client, tasksDir: string) {\n if (!fs.existsSync(tasksDir)) return;\n\n const files = getAllFiles(tasksDir);\n let loaded = 0;\n\n for (const file of files) {\n const module = await import(pathToFileURL(file).href);\n const taskData: FileTask = module.default || module.task || module;\n if (taskData) taskData.filepath = file;\n\n if (!taskData || !taskData.interval || !taskData.execute) continue;\n\n const intervalId = setInterval(async () => {\n try {\n await taskData.execute(client);\n } catch (error) {\n console.error(`[djs-next] Background Task error at ${file}:`, error);\n }\n }, taskData.interval);\n\n if (!(client as any)._activeTasks) (client as any)._activeTasks = new Map();\n (client as any)._activeTasks.set(file, intervalId);\n\n loaded++;\n }\n\n if (loaded > 0) {\n console.log(`[djs-next] Successfully scheduled ${loaded} background tasks.`);\n }\n}\n","import path from 'path';\nimport fs from 'fs';\nimport { pathToFileURL } from 'url';\nimport { DJSNextConfig } from '../types.js';\n\nexport async function loadConfig(): Promise<DJSNextConfig> {\n const exts = ['.js', '.mjs', '.cjs', '.ts', '.mts', '.cts'];\n const cwd = process.cwd();\n \n for (const ext of exts) {\n const configPath = path.join(cwd, `djs-next.config${ext}`);\n if (fs.existsSync(configPath)) {\n try {\n const configModule = await import(pathToFileURL(configPath).href);\n return configModule.default || configModule;\n } catch (err) {\n console.error(`[djs-next] Error loading config file ${configPath}:`, err);\n return {};\n }\n }\n }\n return {};\n}\n\nexport function defineConfig(config: DJSNextConfig): DJSNextConfig {\n return config;\n}\n","import fs from 'fs';\nimport path from 'path';\n\nlet localesCache: Record<string, Record<string, any>> = {};\nlet defaultLoc = 'en';\n\nexport function loadLocales(localesDir: string, defaultLocale?: string) {\n if (defaultLocale) defaultLoc = defaultLocale;\n \n if (!fs.existsSync(localesDir)) return;\n\n const files = fs.readdirSync(localesDir);\n for (const file of files) {\n if (file.endsWith('.json')) {\n const lang = file.replace('.json', '');\n const content = fs.readFileSync(path.join(localesDir, file), 'utf8');\n try {\n localesCache[lang] = JSON.parse(content);\n } catch (e) {\n console.error(`[djs-next] Failed to parse locale file: ${file}`, e);\n }\n }\n }\n}\n\nexport function translate(key: string, locale: string = defaultLoc, variables?: Record<string, string | number>): string {\n // Fallback to default locale if the requested one is not found\n const dict = localesCache[locale] || localesCache[defaultLoc] || {};\n \n const keys = key.split('.');\n let value: any = dict;\n\n for (const k of keys) {\n if (value && typeof value === 'object') {\n value = value[k];\n } else {\n value = undefined;\n break;\n }\n }\n\n if (typeof value !== 'string') {\n return key; // return the key itself if string not found\n }\n\n if (variables) {\n for (const [varKey, varValue] of Object.entries(variables)) {\n value = value.replace(new RegExp(`{{s*${varKey}s*}}`, 'g'), String(varValue));\n }\n }\n\n return value;\n}\n\nexport function getLocalesCache() {\n return localesCache;\n}\n","import { Message, EmbedBuilder } from 'discord.js';\nimport { exec } from 'child_process';\nimport util from 'util';\nimport os from 'os';\nimport { DJSNextClient } from '../client.js';\nimport { loadEvents } from '../handlers/eventHandler.js';\nimport { loadComponents } from '../handlers/componentHandler.js';\nimport { loadAndDeployCommands } from '../handlers/commandHandler.js';\nimport { loadTasks } from '../handlers/taskHandler.js';\nimport { loadLocales } from '../utils/i18n.js';\n\nconst execAsync = util.promisify(exec);\n\nexport async function handleDNXT(message: Message, client: DJSNextClient, prefix: 'dnxt' | 'nxt' = 'dnxt') {\n if (message.author.bot) return;\n // Make sure only developers can use this\n if (!client['_developers'].includes(message.author.id)) return;\n\n if (!message.content.startsWith(prefix)) return;\n\n const args = message.content.slice(prefix.length).trim().split(/ +/);\n const command = args.shift()?.toLowerCase();\n\n // Root dnxt command (Stats)\n if (!command) {\n const mem = process.memoryUsage();\n const discordJsVersion = require('discord.js/package.json').version;\n const botPing = client.ws.ping;\n \n const text = \n `Module was loaded <t:${Math.floor((Date.now() - client.uptime!) / 1000)}:R>.\\n` +\n `DNXT framework plugin, discord.js \\`${discordJsVersion}\\`, \\`Node.js ${process.version}\\` on \\`${os.type()}\\`.\\n` +\n `Latencies: \\`${botPing}ms\\` websocket ping.\\n` +\n `Memory: \\`${(mem.rss / 1024 / 1024).toFixed(2)} MB\\` physical, \\`${(mem.heapUsed / 1024 / 1024).toFixed(2)} MB\\` heap.\\n` +\n `System: \\`${os.cpus().length}\\` thread(s), \\`${(os.uptime() / 60 / 60).toFixed(2)}\\` hrs system uptime.`;\n\n await message.reply(text);\n return;\n }\n\n // Evaluation (js, eval, py)\n if (command === 'js' || command === 'eval' || command === 'py') {\n let code = args.join(' ');\n if (code.startsWith('```js') || code.startsWith('```py')) code = code.replace(/^```[a-z]*|```$/g, '');\n else if (code.startsWith('```')) code = code.replace(/^```|```$/g, '');\n\n if (!code) return void await message.reply('❌ Please provide code to evaluate.');\n\n try {\n const start = process.hrtime.bigint();\n const { commands, components, config } = client;\n \n // eslint-disable-next-line no-eval\n let evaled = await eval(`(async () => { ${code} })()`);\n const end = process.hrtime.bigint();\n const timeMs = Number(end - start) / 1e6;\n\n if (typeof evaled !== 'string') evaled = util.inspect(evaled, { depth: 1 });\n\n await sendPaginatedText(message, `✅ **Evaluated in ${timeMs.toFixed(3)}ms**\\n`, evaled, 'js');\n } catch (err: any) {\n await sendPaginatedText(message, `❌ **Evaluation Error**\\n`, err.message, 'js');\n }\n return;\n }\n\n // Execute Shell (sh, shell, git)\n if (command === 'sh' || command === 'shell' || command === 'git') {\n const cmd = command === 'git' ? 'git ' + args.join(' ') : args.join(' ');\n if (!cmd) return void await message.reply('❌ Please provide a command to execute.');\n\n try {\n const start = process.hrtime.bigint();\n const { stdout, stderr } = await execAsync(cmd);\n const end = process.hrtime.bigint();\n const timeMs = Number(end - start) / 1e6;\n\n const result = stdout || stderr || 'No output.';\n await sendPaginatedText(message, `✅ **Executed in ${timeMs.toFixed(3)}ms**\\n`, result, 'sh');\n } catch (err: any) {\n await sendPaginatedText(message, `❌ **Shell Error**\\n`, err.message, 'sh');\n }\n return;\n }\n\n // Load / Unload / Reload\n if (command === 'reload' || command === 'load') {\n const target = args[0]?.toLowerCase();\n try {\n if (target === 'commands' && client['_commandsDir']) {\n client.commands.clear();\n client.commands = await loadAndDeployCommands(client['_commandsDir'], client.token!, client['_clientId']!, client['_guildId']);\n await message.reply('✅ Reloaded commands.');\n } else if (target === 'events' && client['_eventsDir']) {\n client.removeAllListeners();\n client['attachCoreListeners']();\n await loadEvents(client, client['_eventsDir']);\n await message.reply('✅ Reloaded events.');\n } else if (target === 'components' && client['_componentsDir']) {\n client.components.clear();\n client.components = await loadComponents(client['_componentsDir']);\n await message.reply('✅ Reloaded components.');\n } else if (target === 'locales' && client['_localesDir']) {\n loadLocales(client['_localesDir'], client.config.defaultLocale);\n await message.reply('✅ Reloaded locales.');\n } else if (target === 'all' || !target) {\n client.removeAllListeners();\n client['attachCoreListeners']();\n client.commands.clear();\n client.components.clear();\n if (client['_eventsDir']) await loadEvents(client, client['_eventsDir']);\n if (client['_componentsDir']) client.components = await loadComponents(client['_componentsDir']);\n if (client['_localesDir']) loadLocales(client['_localesDir'], client.config.defaultLocale);\n if (client['_commandsDir']) client.commands = await loadAndDeployCommands(client['_commandsDir'], client.token!, client['_clientId']!, client['_guildId']);\n await message.reply('✅ Reloaded all framework modules.');\n } else {\n await message.reply('❌ Unknown target. Valid targets: `commands, events, components, locales, all`');\n }\n } catch (err: any) {\n await message.reply(`❌ **Reload Error:** ${err.message}`);\n }\n return;\n }\n\n // Cat (Read File)\n if (command === 'cat') {\n const fs = await import('fs');\n const path = await import('path');\n const file = args.join(' ');\n if (!file) return void await message.reply('❌ Please provide a file to read.');\n \n try {\n const content = fs.readFileSync(path.resolve(process.cwd(), file), 'utf8');\n await sendPaginatedText(message, `📄 **${file}**\\n`, content, file.split('.').pop() || '');\n } catch (e: any) {\n await message.reply(`❌ **Error reading file:** ${e.message}`);\n }\n return;\n }\n\n // Sudo (Invoke command as another user)\n if (command === 'su' || command === 'sudo') {\n const targetUserId = args.shift();\n const cmd = args.join(' ');\n if (!targetUserId || !cmd) return void await message.reply(`❌ Usage: ${prefix} su <user_id> <command>`);\n \n try {\n const targetUser = await client.users.fetch(targetUserId.replace(/<@!?|>/g, ''));\n if (!targetUser) throw new Error('User not found.');\n \n // Create a mock message\n const mockMessage = Object.assign(Object.create(Object.getPrototypeOf(message)), message);\n mockMessage.author = targetUser;\n if (message.guild) {\n mockMessage.member = await message.guild.members.fetch(targetUser.id).catch(() => null);\n }\n mockMessage.content = cmd;\n \n client.emit('messageCreate', mockMessage as Message);\n await message.reply(`✅ Invoked \\`${cmd}\\` as **${targetUser.tag}**.`);\n } catch (e: any) {\n await message.reply(`❌ **Sudo Error:** ${e.message}`);\n }\n return;\n }\n\n // Source Command (dnxt source <command>)\n if (command === 'source' || command === 'src') {\n const target = args.join(' ');\n if (!target) return void await message.reply('❌ Please provide a command name.');\n const cmdData = client.commands.get(target);\n if (!cmdData || !cmdData.filepath) return void await message.reply('❌ Command not found or has no associated filepath.');\n \n try {\n const fs = await import('fs');\n const content = fs.readFileSync(cmdData.filepath, 'utf8');\n await sendPaginatedText(message, `📄 **Source of \\`${target}\\`**\\n`, content, cmdData.filepath.split('.').pop() || '');\n } catch (e: any) {\n await message.reply(`❌ **Error reading source:** ${e.message}`);\n }\n return;\n }\n\n // Curl (dnxt curl <url>)\n if (command === 'curl') {\n const url = args[0];\n if (!url) return void await message.reply('❌ Please provide a URL.');\n try {\n const res = await fetch(url);\n const text = await res.text();\n await sendPaginatedText(message, `🌐 **Fetched from \\`${url}\\`**\\n`, text, 'html');\n } catch (e: any) {\n await message.reply(`❌ **Curl Error:** ${e.message}`);\n }\n return;\n }\n\n // Debug Command (dnxt debug <command>)\n // In discord.py DNXT debug measures execution of a command.\n // In our case we will run a js eval and time it explicitly with heap usage.\n if (command === 'debug') {\n let code = args.join(' ');\n if (code.startsWith('```js') || code.startsWith('```py')) code = code.replace(/^```[a-z]*|```$/g, '');\n else if (code.startsWith('```')) code = code.replace(/^```|```$/g, '');\n if (!code) return void await message.reply('❌ Please provide code to debug.');\n \n try {\n const startMem = process.memoryUsage().heapUsed;\n const start = process.hrtime.bigint();\n const { commands, components, config } = client;\n \n // eslint-disable-next-line no-eval\n let evaled = await eval(`(async () => { ${code} })()`);\n \n const end = process.hrtime.bigint();\n const endMem = process.memoryUsage().heapUsed;\n const timeMs = Number(end - start) / 1e6;\n const memDiff = (endMem - startMem) / 1024 / 1024;\n \n if (typeof evaled !== 'string') evaled = util.inspect(evaled, { depth: 1 });\n \n await sendPaginatedText(message, `⏱️ **Debug Execution**\\nTime: \\`${timeMs.toFixed(3)}ms\\` | Heap Delta: \\`${memDiff.toFixed(3)}MB\\`\\n`, evaled, 'js');\n } catch (err: any) {\n await sendPaginatedText(message, `❌ **Debug Error**\\n`, err.message, 'js');\n }\n return;\n }\n\n // In Command (dnxt in <channel_id> <command>)\n if (command === 'in') {\n const channelId = args.shift()?.replace(/<#|>/g, '');\n const cmd = args.join(' ');\n if (!channelId || !cmd) return void await message.reply(`❌ Usage: ${prefix} in <channel> <command>`);\n try {\n const targetChannel = await client.channels.fetch(channelId);\n if (!targetChannel || !targetChannel.isTextBased()) throw new Error('Invalid Text Channel.');\n \n const mockMessage = Object.assign(Object.create(Object.getPrototypeOf(message)), message);\n mockMessage.channel = targetChannel;\n mockMessage.channelId = targetChannel.id;\n mockMessage.content = cmd;\n \n client.emit('messageCreate', mockMessage as Message);\n await message.reply(`✅ Redirected execution to <#${targetChannel.id}>.`);\n } catch (e: any) {\n await message.reply(`❌ **In Error:** ${e.message}`);\n }\n return;\n }\n\n // Tasks Command (dnxt tasks)\n if (command === 'tasks') {\n const tasks = (client as any)._activeTasks as Map<string, NodeJS.Timeout>;\n if (!tasks || tasks.size === 0) return void await message.reply('No active background tasks running.');\n \n let text = `⚙️ **Active Background Tasks (${tasks.size})**\\n`;\n for (const [name] of tasks.entries()) {\n text += `- \\`${name.split('/').pop()}\\`\\n`;\n }\n await sendPaginatedText(message, '', text, '');\n return;\n }\n\n // Cancel Command (dnxt cancel <task>)\n if (command === 'cancel') {\n const target = args.join(' ');\n if (!target) return void await message.reply(`❌ Usage: ${prefix} cancel <task_name>`);\n \n const tasks = (client as any)._activeTasks as Map<string, NodeJS.Timeout>;\n if (!tasks) return void await message.reply('No active tasks to cancel.');\n \n let found = false;\n for (const [name, intervalId] of tasks.entries()) {\n if (name.includes(target)) {\n clearInterval(intervalId);\n tasks.delete(name);\n found = true;\n await message.reply(`✅ Cancelled background task: \\`${name.split('/').pop()}\\``);\n break;\n }\n }\n if (!found) await message.reply('❌ Task not found.');\n return;\n }\n\n // Sync Command (dnxt sync)\n if (command === 'sync') {\n try {\n await message.reply('🔄 Force syncing slash commands...');\n await loadAndDeployCommands((client as any)._commandsDir, client.token!, (client as any)._clientId, (client as any)._guildId);\n await message.reply('✅ Slash commands synchronized globally/locally.');\n } catch (e: any) {\n await message.reply(`❌ **Sync Error:** ${e.message}`);\n }\n return;\n }\n\n // SQL Command (dnxt sql <query>)\n if (command === 'sql') {\n const query = args.join(' ');\n if (!query) return void await message.reply(`❌ Usage: ${prefix} sql <query>`);\n \n try {\n let res: any;\n if (client.db && typeof client.db.$queryRawUnsafe === 'function') {\n res = await client.db.$queryRawUnsafe(query); // Prisma fallback\n } else if (client.db && typeof client.db.query === 'function') {\n res = await client.db.query(query); // PG/MySQL fallback\n } else {\n return void await message.reply('❌ Your configured `client.db` does not expose a recognized raw SQL execution method (`$queryRawUnsafe` or `query`).');\n }\n const inspect = util.inspect(res, { depth: 2 });\n await sendPaginatedText(message, `🗄️ **SQL Query**\\n`, inspect, 'js');\n } catch (e: any) {\n await message.reply(`❌ **SQL Error:** ${e.message}`);\n }\n return;\n }\n\n // Voice Command (dnxt vc)\n if (command === 'vc' || command === 'voice') {\n if (!message.guild) return void await message.reply('❌ This command must be used in a server.');\n const me = message.guild.members.me;\n if (!me?.voice?.channel) return void await message.reply('❌ Bot is not currently in a voice channel.');\n \n const text = `🎙️ **Voice Debugger**\\n` +\n `Channel: <#${me.voice.channel.id}> (\\`${me.voice.channel.id}\\`)\\n` +\n `Muted: ${me.voice.mute} | Deafened: ${me.voice.deaf}\\n` +\n `Session ID: \\`${me.voice.sessionId || 'None'}\\``;\n await message.reply(text);\n return;\n }\n\n await message.reply(`❓ Unknown ${prefix} command. Available: \\`js, sh, git, cat, curl, su, in, source, debug, reload, tasks, cancel, sync, sql, vc\\``);\n}\n\nasync function sendPaginatedText(message: Message, header: string, content: string, language: string = '') {\n const maxLength = 1900;\n if (content.length <= maxLength) {\n await message.reply(`${header}\\`\\`\\`${language}\\n${content}\\n\\`\\`\\``);\n return;\n }\n\n const chunks: string[] = [];\n for (let i = 0; i < content.length; i += maxLength) {\n chunks.push(content.substring(i, i + maxLength));\n }\n\n let index = 0;\n const reply = await message.reply(`${header}\\`\\`\\`${language}\\n${chunks[index]}\\n\\`\\`\\`\\n*Page 1 of ${chunks.length}*`);\n\n await reply.react('◀️');\n await reply.react('▶️');\n await reply.react('⏹️');\n\n const collector = reply.createReactionCollector({\n filter: (reaction, user) => ['◀️', '▶️', '⏹️'].includes(reaction.emoji.name!) && user.id === message.author.id,\n time: 120000\n });\n\n collector.on('collect', async (reaction, user) => {\n await reaction.users.remove(user.id).catch(() => null);\n\n if (reaction.emoji.name === '◀️') {\n index = index > 0 ? index - 1 : index;\n } else if (reaction.emoji.name === '▶️') {\n index = index < chunks.length - 1 ? index + 1 : index;\n } else if (reaction.emoji.name === '⏹️') {\n collector.stop();\n return;\n }\n\n await reply.edit(`${header}\\`\\`\\`${language}\\n${chunks[index]}\\n\\`\\`\\`\\n*Page ${index + 1} of ${chunks.length}*`);\n });\n\n collector.on('end', () => {\n reply.reactions.removeAll().catch(() => null);\n });\n}\n","import {\n ActionRowBuilder,\n ButtonBuilder,\n ButtonStyle,\n CommandInteraction,\n EmbedBuilder,\n MessageComponentInteraction\n} from 'discord.js';\n\nexport async function paginate(\n interaction: CommandInteraction | MessageComponentInteraction,\n pages: EmbedBuilder[],\n time: number = 60000\n) {\n if (!interaction.deferred && !interaction.replied) {\n await interaction.deferReply();\n }\n\n if (pages.length === 1) {\n return interaction.editReply({ embeds: [pages[0]], components: [] });\n }\n\n let index = 0;\n\n const prevButton = new ButtonBuilder()\n .setCustomId('djs_prev')\n .setLabel('Previous')\n .setStyle(ButtonStyle.Primary)\n .setDisabled(true);\n\n const nextButton = new ButtonBuilder()\n .setCustomId('djs_next')\n .setLabel('Next')\n .setStyle(ButtonStyle.Primary);\n\n const row = new ActionRowBuilder<ButtonBuilder>().addComponents(prevButton, nextButton);\n\n const message = await interaction.editReply({\n embeds: [pages[index]],\n components: [row],\n });\n\n const collector = message.createMessageComponentCollector({\n filter: (i) => i.user.id === interaction.user.id,\n time\n });\n\n collector.on('collect', async (i) => {\n if (i.customId === 'djs_prev') {\n index = index > 0 ? index - 1 : index;\n } else if (i.customId === 'djs_next') {\n index = index < pages.length - 1 ? index + 1 : index;\n }\n\n prevButton.setDisabled(index === 0);\n nextButton.setDisabled(index === pages.length - 1);\n\n await i.update({\n embeds: [pages[index]],\n components: [new ActionRowBuilder<ButtonBuilder>().addComponents(prevButton, nextButton)]\n });\n });\n\n collector.on('end', async () => {\n prevButton.setDisabled(true);\n nextButton.setDisabled(true);\n await interaction.editReply({\n components: [new ActionRowBuilder<ButtonBuilder>().addComponents(prevButton, nextButton)]\n }).catch(() => {});\n });\n}\n"],"mappings":"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","names":["import_discord","import_fs","import_path","fs","path","fs","path","module","import_fs","import_url","client","fs","args","import_discord","import_fs","import_path","import_url","components","fs","module","path","import_fs","import_url","client","fs","module","import_path","import_fs","import_url","import_path","import_fs","import_url","path","fs","config","import_fs","import_path","fs","path","util","os","start","end","timeMs","fs","path","message","path","command","message","args","fs","prefix","import_discord","message"]}
|
package/dist/index.mjs
CHANGED
|
@@ -622,6 +622,8 @@ var DJSNextClient = class extends Client {
|
|
|
622
622
|
_guildId;
|
|
623
623
|
_developers;
|
|
624
624
|
_middleware;
|
|
625
|
+
_prefixes;
|
|
626
|
+
_enableMentionPrefix;
|
|
625
627
|
constructor(options) {
|
|
626
628
|
super(options);
|
|
627
629
|
this.commands = new Collection3();
|
|
@@ -635,6 +637,9 @@ var DJSNextClient = class extends Client {
|
|
|
635
637
|
this._guildId = options.guildId;
|
|
636
638
|
this._developers = options.developers || [];
|
|
637
639
|
this._middleware = options.middleware;
|
|
640
|
+
const prefs = options.prefixes || [];
|
|
641
|
+
this._prefixes = Array.isArray(prefs) ? prefs : [prefs];
|
|
642
|
+
this._enableMentionPrefix = options.enableMentionPrefix ?? true;
|
|
638
643
|
this.attachCoreListeners();
|
|
639
644
|
}
|
|
640
645
|
attachCoreListeners() {
|
|
@@ -744,6 +749,77 @@ var DJSNextClient = class extends Client {
|
|
|
744
749
|
}
|
|
745
750
|
}
|
|
746
751
|
});
|
|
752
|
+
this.on("messageCreate", async (message2) => {
|
|
753
|
+
if (message2.author.bot) return;
|
|
754
|
+
if (this._middleware) {
|
|
755
|
+
try {
|
|
756
|
+
const shouldContinue = await this._middleware(message2, this);
|
|
757
|
+
if (!shouldContinue) return;
|
|
758
|
+
} catch (error) {
|
|
759
|
+
console.error(`[djs-next] Middleware error (Message):`, error);
|
|
760
|
+
return;
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
let content = message2.content.trim();
|
|
764
|
+
let matchedPrefix = "";
|
|
765
|
+
let isCommand = false;
|
|
766
|
+
const mentionRegex = new RegExp(`^<@!?${this.user?.id}>\\s*`);
|
|
767
|
+
if (this._enableMentionPrefix && mentionRegex.test(content)) {
|
|
768
|
+
matchedPrefix = content.match(mentionRegex)[0];
|
|
769
|
+
isCommand = true;
|
|
770
|
+
} else {
|
|
771
|
+
const sortedPrefs = [...this._prefixes].sort((a, b) => b.length - a.length);
|
|
772
|
+
if (sortedPrefs.includes("")) {
|
|
773
|
+
isCommand = true;
|
|
774
|
+
}
|
|
775
|
+
for (const p of sortedPrefs) {
|
|
776
|
+
if (p !== "" && content.startsWith(p)) {
|
|
777
|
+
matchedPrefix = p;
|
|
778
|
+
isCommand = true;
|
|
779
|
+
break;
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
if (!isCommand) return;
|
|
784
|
+
const args2 = content.slice(matchedPrefix.length).trim().split(/ +/g);
|
|
785
|
+
const commandName = args2.shift()?.toLowerCase();
|
|
786
|
+
if (!commandName) return;
|
|
787
|
+
let command2 = this.commands.get(commandName);
|
|
788
|
+
if (!command2) {
|
|
789
|
+
command2 = this.commands.find((c) => c.aliases?.includes(commandName) || false);
|
|
790
|
+
}
|
|
791
|
+
if (!command2 || !command2.executeText) return;
|
|
792
|
+
if (command2.developerOnly && !this._developers.includes(message2.author.id)) return;
|
|
793
|
+
if (command2.guildOnly && !message2.guild) return;
|
|
794
|
+
if (command2.userPermissions && message2.member?.permissions) {
|
|
795
|
+
const missing = message2.member.permissions.missing(command2.userPermissions);
|
|
796
|
+
if (missing.length > 0) return;
|
|
797
|
+
}
|
|
798
|
+
if (command2.botPermissions && message2.guild?.members.me?.permissions) {
|
|
799
|
+
const missing = message2.guild.members.me.permissions.missing(command2.botPermissions);
|
|
800
|
+
if (missing.length > 0) return;
|
|
801
|
+
}
|
|
802
|
+
if (command2.cooldown) {
|
|
803
|
+
if (!this.cooldowns.has(commandName)) this.cooldowns.set(commandName, new Collection3());
|
|
804
|
+
const now = Date.now();
|
|
805
|
+
const timestamps = this.cooldowns.get(commandName);
|
|
806
|
+
const cooldownAmount = command2.cooldown * 1e3;
|
|
807
|
+
if (timestamps.has(message2.author.id)) {
|
|
808
|
+
const expirationTime = timestamps.get(message2.author.id) + cooldownAmount;
|
|
809
|
+
if (now < expirationTime) {
|
|
810
|
+
return void await message2.reply(`Please wait, you are on a cooldown. You can use it again <t:${Math.round(expirationTime / 1e3)}:R>.`);
|
|
811
|
+
}
|
|
812
|
+
}
|
|
813
|
+
timestamps.set(message2.author.id, now);
|
|
814
|
+
setTimeout(() => timestamps.delete(message2.author.id), cooldownAmount);
|
|
815
|
+
}
|
|
816
|
+
try {
|
|
817
|
+
await command2.executeText(message2, args2, this);
|
|
818
|
+
} catch (error) {
|
|
819
|
+
console.error(`[djs-next] Error executing text command: "${commandName}"`, error);
|
|
820
|
+
await message2.reply("We ran into an internal error executing this command.").catch(() => null);
|
|
821
|
+
}
|
|
822
|
+
});
|
|
747
823
|
}
|
|
748
824
|
async start(token) {
|
|
749
825
|
if (!token) throw new Error("[djs-next] A token must be provided to start the bot.");
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts","../src/handlers/commandHandler.ts","../src/handlers/utils.ts","../src/handlers/eventHandler.ts","../src/handlers/componentHandler.ts","../src/handlers/taskHandler.ts","../src/utils/configLoader.ts","../src/utils/i18n.ts","../src/plugins/dnxt.ts","../src/utils/paginate.ts","../src/index.ts"],"sourcesContent":["import { Client, Collection, Interaction } from 'discord.js';\nimport { DJSNextClientOptions, FileCommand, FileComponent, DJSNextConfig } from './types.js';\nimport { loadAndDeployCommands } from './handlers/commandHandler.js';\nimport { loadEvents } from './handlers/eventHandler.js';\nimport { loadComponents } from './handlers/componentHandler.js';\nimport { loadTasks } from './handlers/taskHandler.js';\nimport path from 'path';\nimport fs from 'fs';\nimport { pathToFileURL } from 'url';\n\nimport { loadConfig } from './utils/configLoader.js';\nimport { loadLocales, translate } from './utils/i18n.js';\nimport { handleDNXT } from './plugins/dnxt.js';\n\nexport class DJSNextClient<DB = any> extends Client {\n public commands: Collection<string, FileCommand>;\n public components: Collection<string, FileComponent>;\n public cooldowns: Collection<string, Collection<string, number>>;\n public config: DJSNextConfig = {};\n public t = translate;\n public db!: DB;\n \n private _commandsDir?: string;\n private _eventsDir?: string;\n private _componentsDir?: string;\n private _tasksDir?: string;\n private _localesDir?: string;\n private _clientId?: string;\n private _guildId?: string;\n private _developers: string[];\n private _middleware?: (interaction: Interaction, client: Client) => Promise<boolean> | boolean;\n\n constructor(options: DJSNextClientOptions) {\n super(options);\n this.commands = new Collection();\n this.components = new Collection();\n this.cooldowns = new Collection();\n \n this._commandsDir = options.commandsDir ? path.resolve(process.cwd(), options.commandsDir) : undefined;\n this._eventsDir = options.eventsDir ? path.resolve(process.cwd(), options.eventsDir) : undefined;\n this._componentsDir = options.componentsDir ? path.resolve(process.cwd(), options.componentsDir) : undefined;\n this._tasksDir = options.tasksDir ? path.resolve(process.cwd(), options.tasksDir) : undefined;\n this._clientId = options.clientId;\n this._guildId = options.guildId;\n this._developers = options.developers || [];\n this._middleware = options.middleware;\n\n this.attachCoreListeners();\n }\n\n private attachCoreListeners() {\n this.on('interactionCreate', async (interaction: Interaction) => {\n // 1. Global Middleware execution\n if (this._middleware) {\n try {\n const shouldContinue = await this._middleware(interaction, this);\n if (!shouldContinue) return; // Middleware halted execution\n } catch (error) {\n console.error(`[djs-next] Middleware error:`, error);\n return;\n }\n }\n\n // 2. Chat Input Commands Execution\n if (interaction.isChatInputCommand()) {\n let commandKey = interaction.commandName;\n const group = interaction.options.getSubcommandGroup(false);\n const sub = interaction.options.getSubcommand(false);\n\n if (group) commandKey += ` ${group}`;\n if (sub) commandKey += ` ${sub}`;\n\n const command = this.commands.get(commandKey);\n if (!command || !command.execute) return;\n\n // --- Permissions & Validation Checks ---\n if (command.developerOnly && !this._developers.includes(interaction.user.id)) {\n return interaction.reply({ content: 'Only developers can use this command.', ephemeral: true }) as never;\n }\n\n if (command.guildOnly && !interaction.inGuild()) {\n return interaction.reply({ content: 'This command can only be used in a server.', ephemeral: true }) as never;\n }\n\n if (command.userPermissions && interaction.memberPermissions) {\n const missing = interaction.memberPermissions.missing(command.userPermissions);\n if (missing.length > 0) {\n return interaction.reply({ content: `You are missing permissions: \\`${missing.join(', ')}\\``, ephemeral: true }) as never;\n }\n }\n\n if (command.botPermissions && interaction.guild?.members.me?.permissions) {\n const missing = interaction.guild.members.me.permissions.missing(command.botPermissions);\n if (missing.length > 0) {\n return interaction.reply({ content: `I am missing permissions to run this: \\`${missing.join(', ')}\\``, ephemeral: true }) as never;\n }\n }\n\n // --- Built-in Cooldowns ---\n if (command.cooldown) {\n if (!this.cooldowns.has(commandKey)) this.cooldowns.set(commandKey, new Collection());\n const now = Date.now();\n const timestamps = this.cooldowns.get(commandKey)!;\n const cooldownAmount = command.cooldown * 1000;\n\n if (timestamps.has(interaction.user.id)) {\n const expirationTime = timestamps.get(interaction.user.id)! + cooldownAmount;\n if (now < expirationTime) {\n return interaction.reply({ \n content: `Please wait, you are on a cooldown. You can use it again <t:${Math.round(expirationTime / 1000)}:R>.`, \n ephemeral: true \n }) as never;\n }\n }\n timestamps.set(interaction.user.id, now);\n setTimeout(() => timestamps.delete(interaction.user.id), cooldownAmount);\n }\n\n try {\n await command.execute(interaction, this);\n } catch (error) {\n console.error(`[djs-next] Error executing command: \"${commandKey}\"`, error);\n const msg = { content: 'We ran into an internal error executing this command. The developers have been notified.', ephemeral: true };\n if (interaction.replied || interaction.deferred) await interaction.followUp(msg).catch(()=>null);\n else await interaction.reply(msg).catch(()=>null);\n }\n }\n\n // 3. Autocomplete Routing\n if (interaction.isAutocomplete()) {\n let commandKey = interaction.commandName;\n const group = interaction.options.getSubcommandGroup(false);\n const sub = interaction.options.getSubcommand(false);\n\n if (group) commandKey += ` ${group}`;\n if (sub) commandKey += ` ${sub}`;\n\n const command = this.commands.get(commandKey);\n if (command && command.autocomplete) {\n try {\n await command.autocomplete(interaction, this);\n } catch (error) {\n console.error(`[djs-next] Error executing autocomplete for: \"${commandKey}\"`, error);\n }\n }\n }\n\n // 4. Component Routing (Buttons, Modals, Menus)\n if (interaction.isMessageComponent() || interaction.isModalSubmit()) {\n // Skip pagination built-in buttons\n if (interaction.customId === 'djs_prev' || interaction.customId === 'djs_next') return;\n\n let component = this.components.get(interaction.customId);\n let params: Record<string, string> = {};\n\n if (!component) {\n for (const [key, comp] of this.components) {\n if (!key.includes('[')) continue;\n // Escape regex chars except brackets\n const escapedKey = key.replace(/[.*+?^${}()|\\\\-]/g, '\\\\$&');\n // Transform \\[id\\] into (?<id>.+)\n const regexStr = '^' + escapedKey.replace(/\\\\\\[([^\\]]+)\\\\\\]/g, '(?<$1>.+)') + '$';\n const match = interaction.customId.match(new RegExp(regexStr));\n if (match) {\n component = comp;\n if (match.groups) params = match.groups;\n break;\n }\n }\n }\n if (component) {\n try {\n await component.execute(interaction, this, params);\n } catch (error) {\n console.error(`[djs-next] Error executing component: \"${interaction.customId}\"`, error);\n const msg = { content: 'We ran into an internal error executing this component.', ephemeral: true };\n if (interaction.replied || interaction.deferred) await interaction.followUp(msg).catch(()=>null);\n else await interaction.reply(msg).catch(()=>null);\n }\n }\n }\n });\n }\n\n public async start(token: string): Promise<void> {\n if (!token) throw new Error(\"[djs-next] A token must be provided to start the bot.\");\n\n this.config = await loadConfig();\n\n // Fallback options to config\n this._guildId = this._guildId || this.config.devGuildId;\n if (!this._commandsDir && this.config.directories?.commands) this._commandsDir = path.resolve(process.cwd(), this.config.directories.commands);\n if (!this._eventsDir && this.config.directories?.events) this._eventsDir = path.resolve(process.cwd(), this.config.directories.events);\n if (!this._componentsDir && this.config.directories?.components) this._componentsDir = path.resolve(process.cwd(), this.config.directories.components);\n if (!this._tasksDir && this.config.directories?.tasks) this._tasksDir = path.resolve(process.cwd(), this.config.directories.tasks);\n if (!this._localesDir && this.config.directories?.locales) this._localesDir = path.resolve(process.cwd(), this.config.directories.locales);\n\n if (this._localesDir) loadLocales(this._localesDir, this.config.defaultLocale);\n\n // Load middleware from root\n if (!this._middleware) {\n const exts = ['.js', '.mjs', '.cjs', '.ts', '.mts', '.cts'];\n const cwd = process.cwd();\n for (const ext of exts) {\n const mwPath = path.join(cwd, `middleware${ext}`);\n if (fs.existsSync(mwPath)) {\n try {\n const mwModule = await import(pathToFileURL(mwPath).href);\n this._middleware = mwModule.default?.middleware || mwModule.middleware || mwModule.default || mwModule;\n if (this._middleware) {\n console.log(`[djs-next] Loaded global middleware.`);\n break;\n }\n } catch (err) {\n console.error(`[djs-next] Error loading middleware file ${mwPath}:`, err);\n }\n }\n }\n }\n\n if (this._eventsDir) await loadEvents(this, this._eventsDir);\n if (this._componentsDir) this.components = await loadComponents(this._componentsDir);\n if (this._tasksDir) await loadTasks(this, this._tasksDir);\n\n if (this._commandsDir) {\n if (!this._clientId) throw new Error(\"[djs-next] You must provide a clientId to deploy commands.\");\n this.commands = await loadAndDeployCommands(this._commandsDir, token, this._clientId, this._guildId);\n }\n\n await this.login(token);\n console.log(`[djs-next] Bot is ready and logged in as ${this.user?.tag}!`);\n }\n\n public enableDevTools(prefix: 'dnxt' | 'nxt' = 'dnxt'): void {\n if (prefix !== 'dnxt' && prefix !== 'nxt') {\n throw new Error(`[djs-next] Developer Tools prefix must be either 'dnxt' or 'nxt'. Received: ${prefix}`);\n }\n\n this.on('messageCreate', async (message) => {\n await handleDNXT(message, this, prefix);\n });\n\n console.log(`[djs-next] 🛠️ Developer Tools enabled. Use \"${prefix}\" in chat. Ensure MessageContent intent is enabled!`);\n }\n\n public async enableHMR(): Promise<void> {\n try {\n const chokidar = await import('chokidar');\n console.log(`[djs-next] 🔄 HMR Enabled. Watching for file changes...`);\n\n const watcher = chokidar.watch([\n this._commandsDir, \n this._eventsDir, \n this._componentsDir, \n this._localesDir\n ].filter(Boolean) as string[], { ignoreInitial: true });\n\n watcher.on('change', async (filePath) => {\n console.log(`[djs-next] ♻️ File changed: ${filePath}. Reloading...`);\n // We will just naively re-run the loaders. \n // For events, we need to remove all listeners first to avoid memory leaks.\n this.removeAllListeners();\n this.commands.clear();\n this.components.clear();\n \n // Re-attach core listener\n this.attachCoreListeners();\n\n // Reload\n if (this._eventsDir) await loadEvents(this, this._eventsDir);\n if (this._componentsDir) this.components = await loadComponents(this._componentsDir);\n if (this._commandsDir && this._clientId) {\n this.commands = await loadAndDeployCommands(this._commandsDir, this.token!, this._clientId, this._guildId);\n }\n if (this._localesDir) loadLocales(this._localesDir, this.config.defaultLocale);\n \n console.log(`[djs-next] ✅ Hot Reload complete.`);\n });\n } catch (e) {\n console.warn(`[djs-next] chokidar not installed. HMR is disabled. Please run \"npm install chokidar\" to use this feature.`);\n }\n }\n}\n","import { Collection, REST, Routes } from 'discord.js';\nimport fs from 'fs';\nimport path from 'path';\nimport { pathToFileURL } from 'url';\nimport { FileCommand } from '../types.js';\nimport { getAllFiles } from './utils.js';\n\ninterface CommandNode {\n name: string;\n description: string;\n options: any[];\n execute?: Function;\n children: Map<string, CommandNode>;\n}\n\nexport async function loadAndDeployCommands(\n commandsDir: string, \n token: string, \n clientId: string,\n guildId?: string\n): Promise<Collection<string, FileCommand>> {\n const flatCommands = new Collection<string, FileCommand>();\n \n if (!fs.existsSync(commandsDir)) {\n console.warn(`[djs-next] Commands directory \"${commandsDir}\" does not exist.`);\n return flatCommands;\n }\n\n const commandFiles = getAllFiles(commandsDir);\n const rootNodes = new Map<string, CommandNode>();\n\n function getOrCreateNode(pathParts: string[]): CommandNode {\n let currentMap = rootNodes;\n let currentNode: CommandNode | undefined;\n\n for (const part of pathParts) {\n if (!currentMap.has(part)) {\n currentMap.set(part, {\n name: part,\n description: `${part} command`, // Fallback description\n options: [],\n children: new Map()\n });\n }\n currentNode = currentMap.get(part)!;\n currentMap = currentNode.children;\n }\n return currentNode!;\n }\n\n for (const file of commandFiles) {\n const relativePath = path.relative(commandsDir, file);\n const parsed = path.parse(relativePath);\n \n // Normalize path separators\n const dirParts = parsed.dir ? parsed.dir.split(path.sep) : [];\n const name = parsed.name;\n \n const pathParts = [...dirParts];\n if (name !== 'index') {\n pathParts.push(name);\n }\n\n if (pathParts.length === 0) continue;\n if (pathParts.length > 3) {\n console.warn(`[djs-next] Command path too deep (Discord allows max 3 levels): ${relativePath}`);\n continue;\n }\n\n const module = await import(pathToFileURL(file).href);\n const commandData: FileCommand = module.default || module.command || module;\n if (commandData) commandData.filepath = file;\n\n const node = getOrCreateNode(pathParts);\n if (commandData.description) node.description = commandData.description;\n if (commandData.options) node.options = commandData.options;\n if (commandData.execute) {\n node.execute = commandData.execute;\n // Map entire FileCommand object to a space-separated string (e.g. \"economy balance\")\n flatCommands.set(pathParts.join(' '), commandData);\n }\n }\n\n // Build JSON payloads for Discord\n function buildCommandJSON(node: CommandNode, depth: number): any {\n const json: any = {\n name: node.name,\n description: node.description,\n };\n\n if (node.children.size > 0) {\n json.options = [];\n for (const [_, childNode] of node.children) {\n const childJson = buildCommandJSON(childNode, depth + 1);\n \n // 1 = SUB_COMMAND, 2 = SUB_COMMAND_GROUP\n if (depth === 0) {\n childJson.type = childNode.children.size > 0 ? 2 : 1;\n } else if (depth === 1) {\n childJson.type = 1;\n }\n \n json.options.push(childJson);\n }\n } else if (node.options && node.options.length > 0) {\n json.options = node.options;\n }\n \n return json;\n }\n\n const commandsData = Array.from(rootNodes.values()).map(node => buildCommandJSON(node, 0));\n\n // Deploy commands\n const rest = new REST({ version: '10' }).setToken(token);\n\n try {\n console.log(`[djs-next] Started refreshing ${commandsData.length} File-System application (/) commands.`);\n\n let data: any;\n if (guildId) {\n data = await rest.put(\n Routes.applicationGuildCommands(clientId, guildId),\n { body: commandsData },\n );\n } else {\n data = await rest.put(\n Routes.applicationCommands(clientId),\n { body: commandsData },\n );\n }\n\n console.log(`[djs-next] Successfully reloaded ${data.length} File-System application (/) commands.`);\n } catch (error) {\n console.error(`[djs-next] Failed to deploy commands:`, error);\n }\n\n return flatCommands;\n}\n","import fs from 'fs';\nimport path from 'path';\n\n/**\n * Recursively gets all files in a directory\n */\nexport function getAllFiles(dirPath: string, arrayOfFiles: string[] = []): string[] {\n const files = fs.readdirSync(dirPath);\n\n files.forEach(file => {\n const fullPath = path.join(dirPath, file);\n if (fs.statSync(fullPath).isDirectory()) {\n arrayOfFiles = getAllFiles(fullPath, arrayOfFiles);\n } else {\n if (file.endsWith('.js') || file.endsWith('.ts') || file.endsWith('.mjs') || file.endsWith('.cjs')) {\n // Skip TypeScript declaration files\n if (!file.endsWith('.d.ts')) {\n arrayOfFiles.push(fullPath);\n }\n }\n }\n });\n\n return arrayOfFiles;\n}\n","import { Client } from 'discord.js';\nimport fs from 'fs';\nimport { pathToFileURL } from 'url';\nimport { Event } from '../types.js';\nimport { getAllFiles } from './utils.js';\n\nexport async function loadEvents(client: Client, eventsDir: string) {\n if (!fs.existsSync(eventsDir)) {\n console.warn(`[djs-next] Events directory \"${eventsDir}\" does not exist.`);\n return;\n }\n\n const eventFiles = getAllFiles(eventsDir);\n let loadedEvents = 0;\n\n for (const file of eventFiles) {\n const eventModule = await import(pathToFileURL(file).href);\n const eventData: Event<any> = eventModule.default?.event || eventModule.event || eventModule.default || eventModule;\n if (eventData) eventData.filepath = file;\n\n if (!eventData || !eventData.name || !eventData.execute) {\n console.warn(`[djs-next] The event at ${file} is missing a required \"name\" or \"execute\" property.`);\n continue;\n }\n\n if (eventData.once) {\n client.once(eventData.name, (...args) => eventData.execute(client, ...args));\n } else {\n client.on(eventData.name, (...args) => eventData.execute(client, ...args));\n }\n loadedEvents++;\n }\n\n if (loadedEvents > 0) {\n console.log(`[djs-next] Successfully loaded ${loadedEvents} events.`);\n }\n}\n","import { Collection } from 'discord.js';\nimport fs from 'fs';\nimport path from 'path';\nimport { pathToFileURL } from 'url';\nimport { FileComponent } from '../types.js';\nimport { getAllFiles } from './utils.js';\n\nexport async function loadComponents(componentsDir: string): Promise<Collection<string, FileComponent>> {\n const components = new Collection<string, FileComponent>();\n \n if (!fs.existsSync(componentsDir)) return components;\n\n const files = getAllFiles(componentsDir);\n\n for (const file of files) {\n const module = await import(pathToFileURL(file).href);\n const componentData: FileComponent = module.default || module.component || module;\n if (componentData) componentData.filepath = file;\n\n if (!componentData || !componentData.execute) continue;\n\n // Infer customId from filename if not explicitly provided\n const parsed = path.parse(file);\n const customId = componentData.customId || parsed.name;\n\n components.set(customId, componentData);\n }\n\n console.log(`[djs-next] Successfully loaded ${components.size} components.`);\n return components;\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { pathToFileURL } from 'url';\nimport { Client } from 'discord.js';\nimport { FileTask } from '../types.js';\nimport { getAllFiles } from './utils.js';\n\nexport async function loadTasks(client: Client, tasksDir: string) {\n if (!fs.existsSync(tasksDir)) return;\n\n const files = getAllFiles(tasksDir);\n let loaded = 0;\n\n for (const file of files) {\n const module = await import(pathToFileURL(file).href);\n const taskData: FileTask = module.default || module.task || module;\n if (taskData) taskData.filepath = file;\n\n if (!taskData || !taskData.interval || !taskData.execute) continue;\n\n const intervalId = setInterval(async () => {\n try {\n await taskData.execute(client);\n } catch (error) {\n console.error(`[djs-next] Background Task error at ${file}:`, error);\n }\n }, taskData.interval);\n\n if (!(client as any)._activeTasks) (client as any)._activeTasks = new Map();\n (client as any)._activeTasks.set(file, intervalId);\n\n loaded++;\n }\n\n if (loaded > 0) {\n console.log(`[djs-next] Successfully scheduled ${loaded} background tasks.`);\n }\n}\n","import path from 'path';\nimport fs from 'fs';\nimport { pathToFileURL } from 'url';\nimport { DJSNextConfig } from '../types.js';\n\nexport async function loadConfig(): Promise<DJSNextConfig> {\n const exts = ['.js', '.mjs', '.cjs', '.ts', '.mts', '.cts'];\n const cwd = process.cwd();\n \n for (const ext of exts) {\n const configPath = path.join(cwd, `djs-next.config${ext}`);\n if (fs.existsSync(configPath)) {\n try {\n const configModule = await import(pathToFileURL(configPath).href);\n return configModule.default || configModule;\n } catch (err) {\n console.error(`[djs-next] Error loading config file ${configPath}:`, err);\n return {};\n }\n }\n }\n return {};\n}\n\nexport function defineConfig(config: DJSNextConfig): DJSNextConfig {\n return config;\n}\n","import fs from 'fs';\nimport path from 'path';\n\nlet localesCache: Record<string, Record<string, any>> = {};\nlet defaultLoc = 'en';\n\nexport function loadLocales(localesDir: string, defaultLocale?: string) {\n if (defaultLocale) defaultLoc = defaultLocale;\n \n if (!fs.existsSync(localesDir)) return;\n\n const files = fs.readdirSync(localesDir);\n for (const file of files) {\n if (file.endsWith('.json')) {\n const lang = file.replace('.json', '');\n const content = fs.readFileSync(path.join(localesDir, file), 'utf8');\n try {\n localesCache[lang] = JSON.parse(content);\n } catch (e) {\n console.error(`[djs-next] Failed to parse locale file: ${file}`, e);\n }\n }\n }\n}\n\nexport function translate(key: string, locale: string = defaultLoc, variables?: Record<string, string | number>): string {\n // Fallback to default locale if the requested one is not found\n const dict = localesCache[locale] || localesCache[defaultLoc] || {};\n \n const keys = key.split('.');\n let value: any = dict;\n\n for (const k of keys) {\n if (value && typeof value === 'object') {\n value = value[k];\n } else {\n value = undefined;\n break;\n }\n }\n\n if (typeof value !== 'string') {\n return key; // return the key itself if string not found\n }\n\n if (variables) {\n for (const [varKey, varValue] of Object.entries(variables)) {\n value = value.replace(new RegExp(`{{s*${varKey}s*}}`, 'g'), String(varValue));\n }\n }\n\n return value;\n}\n\nexport function getLocalesCache() {\n return localesCache;\n}\n","import { Message, EmbedBuilder } from 'discord.js';\nimport { exec } from 'child_process';\nimport util from 'util';\nimport os from 'os';\nimport { DJSNextClient } from '../client.js';\nimport { loadEvents } from '../handlers/eventHandler.js';\nimport { loadComponents } from '../handlers/componentHandler.js';\nimport { loadAndDeployCommands } from '../handlers/commandHandler.js';\nimport { loadTasks } from '../handlers/taskHandler.js';\nimport { loadLocales } from '../utils/i18n.js';\n\nconst execAsync = util.promisify(exec);\n\nexport async function handleDNXT(message: Message, client: DJSNextClient, prefix: 'dnxt' | 'nxt' = 'dnxt') {\n if (message.author.bot) return;\n // Make sure only developers can use this\n if (!client['_developers'].includes(message.author.id)) return;\n\n if (!message.content.startsWith(prefix)) return;\n\n const args = message.content.slice(prefix.length).trim().split(/ +/);\n const command = args.shift()?.toLowerCase();\n\n // Root dnxt command (Stats)\n if (!command) {\n const mem = process.memoryUsage();\n const discordJsVersion = require('discord.js/package.json').version;\n const botPing = client.ws.ping;\n \n const text = \n `Module was loaded <t:${Math.floor((Date.now() - client.uptime!) / 1000)}:R>.\\n` +\n `DNXT framework plugin, discord.js \\`${discordJsVersion}\\`, \\`Node.js ${process.version}\\` on \\`${os.type()}\\`.\\n` +\n `Latencies: \\`${botPing}ms\\` websocket ping.\\n` +\n `Memory: \\`${(mem.rss / 1024 / 1024).toFixed(2)} MB\\` physical, \\`${(mem.heapUsed / 1024 / 1024).toFixed(2)} MB\\` heap.\\n` +\n `System: \\`${os.cpus().length}\\` thread(s), \\`${(os.uptime() / 60 / 60).toFixed(2)}\\` hrs system uptime.`;\n\n await message.reply(text);\n return;\n }\n\n // Evaluation (js, eval, py)\n if (command === 'js' || command === 'eval' || command === 'py') {\n let code = args.join(' ');\n if (code.startsWith('```js') || code.startsWith('```py')) code = code.replace(/^```[a-z]*|```$/g, '');\n else if (code.startsWith('```')) code = code.replace(/^```|```$/g, '');\n\n if (!code) return void await message.reply('❌ Please provide code to evaluate.');\n\n try {\n const start = process.hrtime.bigint();\n const { commands, components, config } = client;\n \n // eslint-disable-next-line no-eval\n let evaled = await eval(`(async () => { ${code} })()`);\n const end = process.hrtime.bigint();\n const timeMs = Number(end - start) / 1e6;\n\n if (typeof evaled !== 'string') evaled = util.inspect(evaled, { depth: 1 });\n\n await sendPaginatedText(message, `✅ **Evaluated in ${timeMs.toFixed(3)}ms**\\n`, evaled, 'js');\n } catch (err: any) {\n await sendPaginatedText(message, `❌ **Evaluation Error**\\n`, err.message, 'js');\n }\n return;\n }\n\n // Execute Shell (sh, shell, git)\n if (command === 'sh' || command === 'shell' || command === 'git') {\n const cmd = command === 'git' ? 'git ' + args.join(' ') : args.join(' ');\n if (!cmd) return void await message.reply('❌ Please provide a command to execute.');\n\n try {\n const start = process.hrtime.bigint();\n const { stdout, stderr } = await execAsync(cmd);\n const end = process.hrtime.bigint();\n const timeMs = Number(end - start) / 1e6;\n\n const result = stdout || stderr || 'No output.';\n await sendPaginatedText(message, `✅ **Executed in ${timeMs.toFixed(3)}ms**\\n`, result, 'sh');\n } catch (err: any) {\n await sendPaginatedText(message, `❌ **Shell Error**\\n`, err.message, 'sh');\n }\n return;\n }\n\n // Load / Unload / Reload\n if (command === 'reload' || command === 'load') {\n const target = args[0]?.toLowerCase();\n try {\n if (target === 'commands' && client['_commandsDir']) {\n client.commands.clear();\n client.commands = await loadAndDeployCommands(client['_commandsDir'], client.token!, client['_clientId']!, client['_guildId']);\n await message.reply('✅ Reloaded commands.');\n } else if (target === 'events' && client['_eventsDir']) {\n client.removeAllListeners();\n client['attachCoreListeners']();\n await loadEvents(client, client['_eventsDir']);\n await message.reply('✅ Reloaded events.');\n } else if (target === 'components' && client['_componentsDir']) {\n client.components.clear();\n client.components = await loadComponents(client['_componentsDir']);\n await message.reply('✅ Reloaded components.');\n } else if (target === 'locales' && client['_localesDir']) {\n loadLocales(client['_localesDir'], client.config.defaultLocale);\n await message.reply('✅ Reloaded locales.');\n } else if (target === 'all' || !target) {\n client.removeAllListeners();\n client['attachCoreListeners']();\n client.commands.clear();\n client.components.clear();\n if (client['_eventsDir']) await loadEvents(client, client['_eventsDir']);\n if (client['_componentsDir']) client.components = await loadComponents(client['_componentsDir']);\n if (client['_localesDir']) loadLocales(client['_localesDir'], client.config.defaultLocale);\n if (client['_commandsDir']) client.commands = await loadAndDeployCommands(client['_commandsDir'], client.token!, client['_clientId']!, client['_guildId']);\n await message.reply('✅ Reloaded all framework modules.');\n } else {\n await message.reply('❌ Unknown target. Valid targets: `commands, events, components, locales, all`');\n }\n } catch (err: any) {\n await message.reply(`❌ **Reload Error:** ${err.message}`);\n }\n return;\n }\n\n // Cat (Read File)\n if (command === 'cat') {\n const fs = await import('fs');\n const path = await import('path');\n const file = args.join(' ');\n if (!file) return void await message.reply('❌ Please provide a file to read.');\n \n try {\n const content = fs.readFileSync(path.resolve(process.cwd(), file), 'utf8');\n await sendPaginatedText(message, `📄 **${file}**\\n`, content, file.split('.').pop() || '');\n } catch (e: any) {\n await message.reply(`❌ **Error reading file:** ${e.message}`);\n }\n return;\n }\n\n // Sudo (Invoke command as another user)\n if (command === 'su' || command === 'sudo') {\n const targetUserId = args.shift();\n const cmd = args.join(' ');\n if (!targetUserId || !cmd) return void await message.reply(`❌ Usage: ${prefix} su <user_id> <command>`);\n \n try {\n const targetUser = await client.users.fetch(targetUserId.replace(/<@!?|>/g, ''));\n if (!targetUser) throw new Error('User not found.');\n \n // Create a mock message\n const mockMessage = Object.assign(Object.create(Object.getPrototypeOf(message)), message);\n mockMessage.author = targetUser;\n if (message.guild) {\n mockMessage.member = await message.guild.members.fetch(targetUser.id).catch(() => null);\n }\n mockMessage.content = cmd;\n \n client.emit('messageCreate', mockMessage as Message);\n await message.reply(`✅ Invoked \\`${cmd}\\` as **${targetUser.tag}**.`);\n } catch (e: any) {\n await message.reply(`❌ **Sudo Error:** ${e.message}`);\n }\n return;\n }\n\n // Source Command (dnxt source <command>)\n if (command === 'source' || command === 'src') {\n const target = args.join(' ');\n if (!target) return void await message.reply('❌ Please provide a command name.');\n const cmdData = client.commands.get(target);\n if (!cmdData || !cmdData.filepath) return void await message.reply('❌ Command not found or has no associated filepath.');\n \n try {\n const fs = await import('fs');\n const content = fs.readFileSync(cmdData.filepath, 'utf8');\n await sendPaginatedText(message, `📄 **Source of \\`${target}\\`**\\n`, content, cmdData.filepath.split('.').pop() || '');\n } catch (e: any) {\n await message.reply(`❌ **Error reading source:** ${e.message}`);\n }\n return;\n }\n\n // Curl (dnxt curl <url>)\n if (command === 'curl') {\n const url = args[0];\n if (!url) return void await message.reply('❌ Please provide a URL.');\n try {\n const res = await fetch(url);\n const text = await res.text();\n await sendPaginatedText(message, `🌐 **Fetched from \\`${url}\\`**\\n`, text, 'html');\n } catch (e: any) {\n await message.reply(`❌ **Curl Error:** ${e.message}`);\n }\n return;\n }\n\n // Debug Command (dnxt debug <command>)\n // In discord.py DNXT debug measures execution of a command.\n // In our case we will run a js eval and time it explicitly with heap usage.\n if (command === 'debug') {\n let code = args.join(' ');\n if (code.startsWith('```js') || code.startsWith('```py')) code = code.replace(/^```[a-z]*|```$/g, '');\n else if (code.startsWith('```')) code = code.replace(/^```|```$/g, '');\n if (!code) return void await message.reply('❌ Please provide code to debug.');\n \n try {\n const startMem = process.memoryUsage().heapUsed;\n const start = process.hrtime.bigint();\n const { commands, components, config } = client;\n \n // eslint-disable-next-line no-eval\n let evaled = await eval(`(async () => { ${code} })()`);\n \n const end = process.hrtime.bigint();\n const endMem = process.memoryUsage().heapUsed;\n const timeMs = Number(end - start) / 1e6;\n const memDiff = (endMem - startMem) / 1024 / 1024;\n \n if (typeof evaled !== 'string') evaled = util.inspect(evaled, { depth: 1 });\n \n await sendPaginatedText(message, `⏱️ **Debug Execution**\\nTime: \\`${timeMs.toFixed(3)}ms\\` | Heap Delta: \\`${memDiff.toFixed(3)}MB\\`\\n`, evaled, 'js');\n } catch (err: any) {\n await sendPaginatedText(message, `❌ **Debug Error**\\n`, err.message, 'js');\n }\n return;\n }\n\n // In Command (dnxt in <channel_id> <command>)\n if (command === 'in') {\n const channelId = args.shift()?.replace(/<#|>/g, '');\n const cmd = args.join(' ');\n if (!channelId || !cmd) return void await message.reply(`❌ Usage: ${prefix} in <channel> <command>`);\n try {\n const targetChannel = await client.channels.fetch(channelId);\n if (!targetChannel || !targetChannel.isTextBased()) throw new Error('Invalid Text Channel.');\n \n const mockMessage = Object.assign(Object.create(Object.getPrototypeOf(message)), message);\n mockMessage.channel = targetChannel;\n mockMessage.channelId = targetChannel.id;\n mockMessage.content = cmd;\n \n client.emit('messageCreate', mockMessage as Message);\n await message.reply(`✅ Redirected execution to <#${targetChannel.id}>.`);\n } catch (e: any) {\n await message.reply(`❌ **In Error:** ${e.message}`);\n }\n return;\n }\n\n // Tasks Command (dnxt tasks)\n if (command === 'tasks') {\n const tasks = (client as any)._activeTasks as Map<string, NodeJS.Timeout>;\n if (!tasks || tasks.size === 0) return void await message.reply('No active background tasks running.');\n \n let text = `⚙️ **Active Background Tasks (${tasks.size})**\\n`;\n for (const [name] of tasks.entries()) {\n text += `- \\`${name.split('/').pop()}\\`\\n`;\n }\n await sendPaginatedText(message, '', text, '');\n return;\n }\n\n // Cancel Command (dnxt cancel <task>)\n if (command === 'cancel') {\n const target = args.join(' ');\n if (!target) return void await message.reply(`❌ Usage: ${prefix} cancel <task_name>`);\n \n const tasks = (client as any)._activeTasks as Map<string, NodeJS.Timeout>;\n if (!tasks) return void await message.reply('No active tasks to cancel.');\n \n let found = false;\n for (const [name, intervalId] of tasks.entries()) {\n if (name.includes(target)) {\n clearInterval(intervalId);\n tasks.delete(name);\n found = true;\n await message.reply(`✅ Cancelled background task: \\`${name.split('/').pop()}\\``);\n break;\n }\n }\n if (!found) await message.reply('❌ Task not found.');\n return;\n }\n\n // Sync Command (dnxt sync)\n if (command === 'sync') {\n try {\n await message.reply('🔄 Force syncing slash commands...');\n await loadAndDeployCommands((client as any)._commandsDir, client.token!, (client as any)._clientId, (client as any)._guildId);\n await message.reply('✅ Slash commands synchronized globally/locally.');\n } catch (e: any) {\n await message.reply(`❌ **Sync Error:** ${e.message}`);\n }\n return;\n }\n\n // SQL Command (dnxt sql <query>)\n if (command === 'sql') {\n const query = args.join(' ');\n if (!query) return void await message.reply(`❌ Usage: ${prefix} sql <query>`);\n \n try {\n let res: any;\n if (client.db && typeof client.db.$queryRawUnsafe === 'function') {\n res = await client.db.$queryRawUnsafe(query); // Prisma fallback\n } else if (client.db && typeof client.db.query === 'function') {\n res = await client.db.query(query); // PG/MySQL fallback\n } else {\n return void await message.reply('❌ Your configured `client.db` does not expose a recognized raw SQL execution method (`$queryRawUnsafe` or `query`).');\n }\n const inspect = util.inspect(res, { depth: 2 });\n await sendPaginatedText(message, `🗄️ **SQL Query**\\n`, inspect, 'js');\n } catch (e: any) {\n await message.reply(`❌ **SQL Error:** ${e.message}`);\n }\n return;\n }\n\n // Voice Command (dnxt vc)\n if (command === 'vc' || command === 'voice') {\n if (!message.guild) return void await message.reply('❌ This command must be used in a server.');\n const me = message.guild.members.me;\n if (!me?.voice?.channel) return void await message.reply('❌ Bot is not currently in a voice channel.');\n \n const text = `🎙️ **Voice Debugger**\\n` +\n `Channel: <#${me.voice.channel.id}> (\\`${me.voice.channel.id}\\`)\\n` +\n `Muted: ${me.voice.mute} | Deafened: ${me.voice.deaf}\\n` +\n `Session ID: \\`${me.voice.sessionId || 'None'}\\``;\n await message.reply(text);\n return;\n }\n\n await message.reply(`❓ Unknown ${prefix} command. Available: \\`js, sh, git, cat, curl, su, in, source, debug, reload, tasks, cancel, sync, sql, vc\\``);\n}\n\nasync function sendPaginatedText(message: Message, header: string, content: string, language: string = '') {\n const maxLength = 1900;\n if (content.length <= maxLength) {\n await message.reply(`${header}\\`\\`\\`${language}\\n${content}\\n\\`\\`\\``);\n return;\n }\n\n const chunks: string[] = [];\n for (let i = 0; i < content.length; i += maxLength) {\n chunks.push(content.substring(i, i + maxLength));\n }\n\n let index = 0;\n const reply = await message.reply(`${header}\\`\\`\\`${language}\\n${chunks[index]}\\n\\`\\`\\`\\n*Page 1 of ${chunks.length}*`);\n\n await reply.react('◀️');\n await reply.react('▶️');\n await reply.react('⏹️');\n\n const collector = reply.createReactionCollector({\n filter: (reaction, user) => ['◀️', '▶️', '⏹️'].includes(reaction.emoji.name!) && user.id === message.author.id,\n time: 120000\n });\n\n collector.on('collect', async (reaction, user) => {\n await reaction.users.remove(user.id).catch(() => null);\n\n if (reaction.emoji.name === '◀️') {\n index = index > 0 ? index - 1 : index;\n } else if (reaction.emoji.name === '▶️') {\n index = index < chunks.length - 1 ? index + 1 : index;\n } else if (reaction.emoji.name === '⏹️') {\n collector.stop();\n return;\n }\n\n await reply.edit(`${header}\\`\\`\\`${language}\\n${chunks[index]}\\n\\`\\`\\`\\n*Page ${index + 1} of ${chunks.length}*`);\n });\n\n collector.on('end', () => {\n reply.reactions.removeAll().catch(() => null);\n });\n}\n","import {\n ActionRowBuilder,\n ButtonBuilder,\n ButtonStyle,\n CommandInteraction,\n EmbedBuilder,\n MessageComponentInteraction\n} from 'discord.js';\n\nexport async function paginate(\n interaction: CommandInteraction | MessageComponentInteraction,\n pages: EmbedBuilder[],\n time: number = 60000\n) {\n if (!interaction.deferred && !interaction.replied) {\n await interaction.deferReply();\n }\n\n if (pages.length === 1) {\n return interaction.editReply({ embeds: [pages[0]], components: [] });\n }\n\n let index = 0;\n\n const prevButton = new ButtonBuilder()\n .setCustomId('djs_prev')\n .setLabel('Previous')\n .setStyle(ButtonStyle.Primary)\n .setDisabled(true);\n\n const nextButton = new ButtonBuilder()\n .setCustomId('djs_next')\n .setLabel('Next')\n .setStyle(ButtonStyle.Primary);\n\n const row = new ActionRowBuilder<ButtonBuilder>().addComponents(prevButton, nextButton);\n\n const message = await interaction.editReply({\n embeds: [pages[index]],\n components: [row],\n });\n\n const collector = message.createMessageComponentCollector({\n filter: (i) => i.user.id === interaction.user.id,\n time\n });\n\n collector.on('collect', async (i) => {\n if (i.customId === 'djs_prev') {\n index = index > 0 ? index - 1 : index;\n } else if (i.customId === 'djs_next') {\n index = index < pages.length - 1 ? index + 1 : index;\n }\n\n prevButton.setDisabled(index === 0);\n nextButton.setDisabled(index === pages.length - 1);\n\n await i.update({\n embeds: [pages[index]],\n components: [new ActionRowBuilder<ButtonBuilder>().addComponents(prevButton, nextButton)]\n });\n });\n\n collector.on('end', async () => {\n prevButton.setDisabled(true);\n nextButton.setDisabled(true);\n await interaction.editReply({\n components: [new ActionRowBuilder<ButtonBuilder>().addComponents(prevButton, nextButton)]\n }).catch(() => {});\n });\n}\n","export * from './client.js';\nexport { DJSNextClientOptions, FileCommand, FileComponent, FileTask, Event as DJSNextEvent, DJSNextConfig } from './types.js';\nexport * from './utils/paginate.js';\nexport * from './utils/configLoader.js';\nexport * from './utils/i18n.js';\n// Re-export everything from discord.js so users don't need to install it explicitly\nexport * from 'discord.js';\n"],"mappings":"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","names":["Collection","fs","path","fs","path","fs","pathToFileURL","client","fs","pathToFileURL","args","Collection","fs","path","pathToFileURL","components","Collection","fs","pathToFileURL","path","fs","pathToFileURL","client","fs","pathToFileURL","path","fs","pathToFileURL","path","fs","pathToFileURL","config","fs","path","start","end","timeMs","fs","path","message","Collection","path","command","fs","pathToFileURL","prefix","message","message"]}
|
|
1
|
+
{"version":3,"sources":["../src/client.ts","../src/handlers/commandHandler.ts","../src/handlers/utils.ts","../src/handlers/eventHandler.ts","../src/handlers/componentHandler.ts","../src/handlers/taskHandler.ts","../src/utils/configLoader.ts","../src/utils/i18n.ts","../src/plugins/dnxt.ts","../src/utils/paginate.ts","../src/index.ts"],"sourcesContent":["import { Client, Collection, Interaction, Message } from 'discord.js';\nimport { DJSNextClientOptions, FileCommand, FileComponent, DJSNextConfig } from './types.js';\nimport { loadAndDeployCommands } from './handlers/commandHandler.js';\nimport { loadEvents } from './handlers/eventHandler.js';\nimport { loadComponents } from './handlers/componentHandler.js';\nimport { loadTasks } from './handlers/taskHandler.js';\nimport path from 'path';\nimport fs from 'fs';\nimport { pathToFileURL } from 'url';\n\nimport { loadConfig } from './utils/configLoader.js';\nimport { loadLocales, translate } from './utils/i18n.js';\nimport { handleDNXT } from './plugins/dnxt.js';\n\nexport class DJSNextClient<DB = any> extends Client {\n public commands: Collection<string, FileCommand>;\n public components: Collection<string, FileComponent>;\n public cooldowns: Collection<string, Collection<string, number>>;\n public config: DJSNextConfig = {};\n public t = translate;\n public db!: DB;\n \n private _commandsDir?: string;\n private _eventsDir?: string;\n private _componentsDir?: string;\n private _tasksDir?: string;\n private _localesDir?: string;\n private _clientId?: string;\n private _guildId?: string;\n private _developers: string[];\n private _middleware?: (interaction: Interaction | Message, client: Client) => Promise<boolean> | boolean;\n private _prefixes: string[];\n private _enableMentionPrefix: boolean;\n\n constructor(options: DJSNextClientOptions) {\n super(options);\n this.commands = new Collection();\n this.components = new Collection();\n this.cooldowns = new Collection();\n \n this._commandsDir = options.commandsDir ? path.resolve(process.cwd(), options.commandsDir) : undefined;\n this._eventsDir = options.eventsDir ? path.resolve(process.cwd(), options.eventsDir) : undefined;\n this._componentsDir = options.componentsDir ? path.resolve(process.cwd(), options.componentsDir) : undefined;\n this._tasksDir = options.tasksDir ? path.resolve(process.cwd(), options.tasksDir) : undefined;\n this._clientId = options.clientId;\n this._guildId = options.guildId;\n this._developers = options.developers || [];\n this._middleware = options.middleware as any;\n \n const prefs = options.prefixes || [];\n this._prefixes = Array.isArray(prefs) ? prefs : [prefs];\n this._enableMentionPrefix = options.enableMentionPrefix ?? true;\n\n this.attachCoreListeners();\n }\n\n private attachCoreListeners() {\n this.on('interactionCreate', async (interaction: Interaction) => {\n // 1. Global Middleware execution\n if (this._middleware) {\n try {\n const shouldContinue = await this._middleware(interaction, this);\n if (!shouldContinue) return; // Middleware halted execution\n } catch (error) {\n console.error(`[djs-next] Middleware error:`, error);\n return;\n }\n }\n\n // 2. Chat Input Commands Execution\n if (interaction.isChatInputCommand()) {\n let commandKey = interaction.commandName;\n const group = interaction.options.getSubcommandGroup(false);\n const sub = interaction.options.getSubcommand(false);\n\n if (group) commandKey += ` ${group}`;\n if (sub) commandKey += ` ${sub}`;\n\n const command = this.commands.get(commandKey);\n if (!command || !command.execute) return;\n\n // --- Permissions & Validation Checks ---\n if (command.developerOnly && !this._developers.includes(interaction.user.id)) {\n return interaction.reply({ content: 'Only developers can use this command.', ephemeral: true }) as never;\n }\n\n if (command.guildOnly && !interaction.inGuild()) {\n return interaction.reply({ content: 'This command can only be used in a server.', ephemeral: true }) as never;\n }\n\n if (command.userPermissions && interaction.memberPermissions) {\n const missing = interaction.memberPermissions.missing(command.userPermissions);\n if (missing.length > 0) {\n return interaction.reply({ content: `You are missing permissions: \\`${missing.join(', ')}\\``, ephemeral: true }) as never;\n }\n }\n\n if (command.botPermissions && interaction.guild?.members.me?.permissions) {\n const missing = interaction.guild.members.me.permissions.missing(command.botPermissions);\n if (missing.length > 0) {\n return interaction.reply({ content: `I am missing permissions to run this: \\`${missing.join(', ')}\\``, ephemeral: true }) as never;\n }\n }\n\n // --- Built-in Cooldowns ---\n if (command.cooldown) {\n if (!this.cooldowns.has(commandKey)) this.cooldowns.set(commandKey, new Collection());\n const now = Date.now();\n const timestamps = this.cooldowns.get(commandKey)!;\n const cooldownAmount = command.cooldown * 1000;\n\n if (timestamps.has(interaction.user.id)) {\n const expirationTime = timestamps.get(interaction.user.id)! + cooldownAmount;\n if (now < expirationTime) {\n return interaction.reply({ \n content: `Please wait, you are on a cooldown. You can use it again <t:${Math.round(expirationTime / 1000)}:R>.`, \n ephemeral: true \n }) as never;\n }\n }\n timestamps.set(interaction.user.id, now);\n setTimeout(() => timestamps.delete(interaction.user.id), cooldownAmount);\n }\n\n try {\n await command.execute(interaction, this);\n } catch (error) {\n console.error(`[djs-next] Error executing command: \"${commandKey}\"`, error);\n const msg = { content: 'We ran into an internal error executing this command. The developers have been notified.', ephemeral: true };\n if (interaction.replied || interaction.deferred) await interaction.followUp(msg).catch(()=>null);\n else await interaction.reply(msg).catch(()=>null);\n }\n }\n\n // 3. Autocomplete Routing\n if (interaction.isAutocomplete()) {\n let commandKey = interaction.commandName;\n const group = interaction.options.getSubcommandGroup(false);\n const sub = interaction.options.getSubcommand(false);\n\n if (group) commandKey += ` ${group}`;\n if (sub) commandKey += ` ${sub}`;\n\n const command = this.commands.get(commandKey);\n if (command && command.autocomplete) {\n try {\n await command.autocomplete(interaction, this);\n } catch (error) {\n console.error(`[djs-next] Error executing autocomplete for: \"${commandKey}\"`, error);\n }\n }\n }\n\n // 4. Component Routing (Buttons, Modals, Menus)\n if (interaction.isMessageComponent() || interaction.isModalSubmit()) {\n // Skip pagination built-in buttons\n if (interaction.customId === 'djs_prev' || interaction.customId === 'djs_next') return;\n\n let component = this.components.get(interaction.customId);\n let params: Record<string, string> = {};\n\n if (!component) {\n for (const [key, comp] of this.components) {\n if (!key.includes('[')) continue;\n // Escape regex chars except brackets\n const escapedKey = key.replace(/[.*+?^${}()|\\\\-]/g, '\\\\$&');\n // Transform \\[id\\] into (?<id>.+)\n const regexStr = '^' + escapedKey.replace(/\\\\\\[([^\\]]+)\\\\\\]/g, '(?<$1>.+)') + '$';\n const match = interaction.customId.match(new RegExp(regexStr));\n if (match) {\n component = comp;\n if (match.groups) params = match.groups;\n break;\n }\n }\n }\n if (component) {\n try {\n await component.execute(interaction, this, params);\n } catch (error) {\n console.error(`[djs-next] Error executing component: \"${interaction.customId}\"`, error);\n const msg = { content: 'We ran into an internal error executing this component.', ephemeral: true };\n if (interaction.replied || interaction.deferred) await interaction.followUp(msg).catch(()=>null);\n else await interaction.reply(msg).catch(()=>null);\n }\n }\n }\n });\n\n this.on('messageCreate', async (message: Message) => {\n if (message.author.bot) return;\n\n // Global Middleware execution for Messages\n if (this._middleware) {\n try {\n const shouldContinue = await this._middleware(message, this);\n if (!shouldContinue) return;\n } catch (error) {\n console.error(`[djs-next] Middleware error (Message):`, error);\n return;\n }\n }\n\n let content = message.content.trim();\n let matchedPrefix = '';\n let isCommand = false;\n\n // 1. Check Mention Prefix\n const mentionRegex = new RegExp(`^<@!?${this.user?.id}>\\\\s*`);\n if (this._enableMentionPrefix && mentionRegex.test(content)) {\n matchedPrefix = content.match(mentionRegex)![0];\n isCommand = true;\n } else {\n // 2. Check Standard/No Prefixes\n // Sort by length descending so longer prefixes match first\n const sortedPrefs = [...this._prefixes].sort((a, b) => b.length - a.length);\n \n // If prefixes array is empty or contains an empty string, it means \"no prefix\" is supported!\n if (sortedPrefs.includes('')) {\n isCommand = true; \n }\n\n for (const p of sortedPrefs) {\n if (p !== '' && content.startsWith(p)) {\n matchedPrefix = p;\n isCommand = true;\n break;\n }\n }\n }\n\n if (!isCommand) return;\n\n const args = content.slice(matchedPrefix.length).trim().split(/ +/g);\n const commandName = args.shift()?.toLowerCase();\n if (!commandName) return;\n\n // Find the command\n let command = this.commands.get(commandName);\n if (!command) {\n // Check aliases\n command = this.commands.find(c => c.aliases?.includes(commandName) || false);\n }\n\n if (!command || !command.executeText) return;\n\n // Validation Checks (Developers/GuildOnly)\n if (command.developerOnly && !this._developers.includes(message.author.id)) return;\n if (command.guildOnly && !message.guild) return;\n\n if (command.userPermissions && message.member?.permissions) {\n const missing = message.member.permissions.missing(command.userPermissions);\n if (missing.length > 0) return;\n }\n if (command.botPermissions && message.guild?.members.me?.permissions) {\n const missing = message.guild.members.me.permissions.missing(command.botPermissions);\n if (missing.length > 0) return;\n }\n\n // Cooldowns\n if (command.cooldown) {\n if (!this.cooldowns.has(commandName)) this.cooldowns.set(commandName, new Collection());\n const now = Date.now();\n const timestamps = this.cooldowns.get(commandName)!;\n const cooldownAmount = command.cooldown * 1000;\n\n if (timestamps.has(message.author.id)) {\n const expirationTime = timestamps.get(message.author.id)! + cooldownAmount;\n if (now < expirationTime) {\n return void await message.reply(`Please wait, you are on a cooldown. You can use it again <t:${Math.round(expirationTime / 1000)}:R>.`);\n }\n }\n timestamps.set(message.author.id, now);\n setTimeout(() => timestamps.delete(message.author.id), cooldownAmount);\n }\n\n // Execute Text Command\n try {\n await command.executeText(message, args, this);\n } catch (error) {\n console.error(`[djs-next] Error executing text command: \"${commandName}\"`, error);\n await message.reply('We ran into an internal error executing this command.').catch(() => null);\n }\n });\n }\n\n public async start(token: string): Promise<void> {\n if (!token) throw new Error(\"[djs-next] A token must be provided to start the bot.\");\n\n this.config = await loadConfig();\n\n // Fallback options to config\n this._guildId = this._guildId || this.config.devGuildId;\n if (!this._commandsDir && this.config.directories?.commands) this._commandsDir = path.resolve(process.cwd(), this.config.directories.commands);\n if (!this._eventsDir && this.config.directories?.events) this._eventsDir = path.resolve(process.cwd(), this.config.directories.events);\n if (!this._componentsDir && this.config.directories?.components) this._componentsDir = path.resolve(process.cwd(), this.config.directories.components);\n if (!this._tasksDir && this.config.directories?.tasks) this._tasksDir = path.resolve(process.cwd(), this.config.directories.tasks);\n if (!this._localesDir && this.config.directories?.locales) this._localesDir = path.resolve(process.cwd(), this.config.directories.locales);\n\n if (this._localesDir) loadLocales(this._localesDir, this.config.defaultLocale);\n\n // Load middleware from root\n if (!this._middleware) {\n const exts = ['.js', '.mjs', '.cjs', '.ts', '.mts', '.cts'];\n const cwd = process.cwd();\n for (const ext of exts) {\n const mwPath = path.join(cwd, `middleware${ext}`);\n if (fs.existsSync(mwPath)) {\n try {\n const mwModule = await import(pathToFileURL(mwPath).href);\n this._middleware = mwModule.default?.middleware || mwModule.middleware || mwModule.default || mwModule;\n if (this._middleware) {\n console.log(`[djs-next] Loaded global middleware.`);\n break;\n }\n } catch (err) {\n console.error(`[djs-next] Error loading middleware file ${mwPath}:`, err);\n }\n }\n }\n }\n\n if (this._eventsDir) await loadEvents(this, this._eventsDir);\n if (this._componentsDir) this.components = await loadComponents(this._componentsDir);\n if (this._tasksDir) await loadTasks(this, this._tasksDir);\n\n if (this._commandsDir) {\n if (!this._clientId) throw new Error(\"[djs-next] You must provide a clientId to deploy commands.\");\n this.commands = await loadAndDeployCommands(this._commandsDir, token, this._clientId, this._guildId);\n }\n\n await this.login(token);\n console.log(`[djs-next] Bot is ready and logged in as ${this.user?.tag}!`);\n }\n\n public enableDevTools(prefix: 'dnxt' | 'nxt' = 'dnxt'): void {\n if (prefix !== 'dnxt' && prefix !== 'nxt') {\n throw new Error(`[djs-next] Developer Tools prefix must be either 'dnxt' or 'nxt'. Received: ${prefix}`);\n }\n\n this.on('messageCreate', async (message) => {\n await handleDNXT(message, this, prefix);\n });\n\n console.log(`[djs-next] 🛠️ Developer Tools enabled. Use \"${prefix}\" in chat. Ensure MessageContent intent is enabled!`);\n }\n\n public async enableHMR(): Promise<void> {\n try {\n const chokidar = await import('chokidar');\n console.log(`[djs-next] 🔄 HMR Enabled. Watching for file changes...`);\n\n const watcher = chokidar.watch([\n this._commandsDir, \n this._eventsDir, \n this._componentsDir, \n this._localesDir\n ].filter(Boolean) as string[], { ignoreInitial: true });\n\n watcher.on('change', async (filePath) => {\n console.log(`[djs-next] ♻️ File changed: ${filePath}. Reloading...`);\n // We will just naively re-run the loaders. \n // For events, we need to remove all listeners first to avoid memory leaks.\n this.removeAllListeners();\n this.commands.clear();\n this.components.clear();\n \n // Re-attach core listener\n this.attachCoreListeners();\n\n // Reload\n if (this._eventsDir) await loadEvents(this, this._eventsDir);\n if (this._componentsDir) this.components = await loadComponents(this._componentsDir);\n if (this._commandsDir && this._clientId) {\n this.commands = await loadAndDeployCommands(this._commandsDir, this.token!, this._clientId, this._guildId);\n }\n if (this._localesDir) loadLocales(this._localesDir, this.config.defaultLocale);\n \n console.log(`[djs-next] ✅ Hot Reload complete.`);\n });\n } catch (e) {\n console.warn(`[djs-next] chokidar not installed. HMR is disabled. Please run \"npm install chokidar\" to use this feature.`);\n }\n }\n}\n","import { Collection, REST, Routes } from 'discord.js';\nimport fs from 'fs';\nimport path from 'path';\nimport { pathToFileURL } from 'url';\nimport { FileCommand } from '../types.js';\nimport { getAllFiles } from './utils.js';\n\ninterface CommandNode {\n name: string;\n description: string;\n options: any[];\n execute?: Function;\n children: Map<string, CommandNode>;\n}\n\nexport async function loadAndDeployCommands(\n commandsDir: string, \n token: string, \n clientId: string,\n guildId?: string\n): Promise<Collection<string, FileCommand>> {\n const flatCommands = new Collection<string, FileCommand>();\n \n if (!fs.existsSync(commandsDir)) {\n console.warn(`[djs-next] Commands directory \"${commandsDir}\" does not exist.`);\n return flatCommands;\n }\n\n const commandFiles = getAllFiles(commandsDir);\n const rootNodes = new Map<string, CommandNode>();\n\n function getOrCreateNode(pathParts: string[]): CommandNode {\n let currentMap = rootNodes;\n let currentNode: CommandNode | undefined;\n\n for (const part of pathParts) {\n if (!currentMap.has(part)) {\n currentMap.set(part, {\n name: part,\n description: `${part} command`, // Fallback description\n options: [],\n children: new Map()\n });\n }\n currentNode = currentMap.get(part)!;\n currentMap = currentNode.children;\n }\n return currentNode!;\n }\n\n for (const file of commandFiles) {\n const relativePath = path.relative(commandsDir, file);\n const parsed = path.parse(relativePath);\n \n // Normalize path separators\n const dirParts = parsed.dir ? parsed.dir.split(path.sep) : [];\n const name = parsed.name;\n \n const pathParts = [...dirParts];\n if (name !== 'index') {\n pathParts.push(name);\n }\n\n if (pathParts.length === 0) continue;\n if (pathParts.length > 3) {\n console.warn(`[djs-next] Command path too deep (Discord allows max 3 levels): ${relativePath}`);\n continue;\n }\n\n const module = await import(pathToFileURL(file).href);\n const commandData: FileCommand = module.default || module.command || module;\n if (commandData) commandData.filepath = file;\n\n const node = getOrCreateNode(pathParts);\n if (commandData.description) node.description = commandData.description;\n if (commandData.options) node.options = commandData.options;\n if (commandData.execute) {\n node.execute = commandData.execute;\n // Map entire FileCommand object to a space-separated string (e.g. \"economy balance\")\n flatCommands.set(pathParts.join(' '), commandData);\n }\n }\n\n // Build JSON payloads for Discord\n function buildCommandJSON(node: CommandNode, depth: number): any {\n const json: any = {\n name: node.name,\n description: node.description,\n };\n\n if (node.children.size > 0) {\n json.options = [];\n for (const [_, childNode] of node.children) {\n const childJson = buildCommandJSON(childNode, depth + 1);\n \n // 1 = SUB_COMMAND, 2 = SUB_COMMAND_GROUP\n if (depth === 0) {\n childJson.type = childNode.children.size > 0 ? 2 : 1;\n } else if (depth === 1) {\n childJson.type = 1;\n }\n \n json.options.push(childJson);\n }\n } else if (node.options && node.options.length > 0) {\n json.options = node.options;\n }\n \n return json;\n }\n\n const commandsData = Array.from(rootNodes.values()).map(node => buildCommandJSON(node, 0));\n\n // Deploy commands\n const rest = new REST({ version: '10' }).setToken(token);\n\n try {\n console.log(`[djs-next] Started refreshing ${commandsData.length} File-System application (/) commands.`);\n\n let data: any;\n if (guildId) {\n data = await rest.put(\n Routes.applicationGuildCommands(clientId, guildId),\n { body: commandsData },\n );\n } else {\n data = await rest.put(\n Routes.applicationCommands(clientId),\n { body: commandsData },\n );\n }\n\n console.log(`[djs-next] Successfully reloaded ${data.length} File-System application (/) commands.`);\n } catch (error) {\n console.error(`[djs-next] Failed to deploy commands:`, error);\n }\n\n return flatCommands;\n}\n","import fs from 'fs';\nimport path from 'path';\n\n/**\n * Recursively gets all files in a directory\n */\nexport function getAllFiles(dirPath: string, arrayOfFiles: string[] = []): string[] {\n const files = fs.readdirSync(dirPath);\n\n files.forEach(file => {\n const fullPath = path.join(dirPath, file);\n if (fs.statSync(fullPath).isDirectory()) {\n arrayOfFiles = getAllFiles(fullPath, arrayOfFiles);\n } else {\n if (file.endsWith('.js') || file.endsWith('.ts') || file.endsWith('.mjs') || file.endsWith('.cjs')) {\n // Skip TypeScript declaration files\n if (!file.endsWith('.d.ts')) {\n arrayOfFiles.push(fullPath);\n }\n }\n }\n });\n\n return arrayOfFiles;\n}\n","import { Client } from 'discord.js';\nimport fs from 'fs';\nimport { pathToFileURL } from 'url';\nimport { Event } from '../types.js';\nimport { getAllFiles } from './utils.js';\n\nexport async function loadEvents(client: Client, eventsDir: string) {\n if (!fs.existsSync(eventsDir)) {\n console.warn(`[djs-next] Events directory \"${eventsDir}\" does not exist.`);\n return;\n }\n\n const eventFiles = getAllFiles(eventsDir);\n let loadedEvents = 0;\n\n for (const file of eventFiles) {\n const eventModule = await import(pathToFileURL(file).href);\n const eventData: Event<any> = eventModule.default?.event || eventModule.event || eventModule.default || eventModule;\n if (eventData) eventData.filepath = file;\n\n if (!eventData || !eventData.name || !eventData.execute) {\n console.warn(`[djs-next] The event at ${file} is missing a required \"name\" or \"execute\" property.`);\n continue;\n }\n\n if (eventData.once) {\n client.once(eventData.name, (...args) => eventData.execute(client, ...args));\n } else {\n client.on(eventData.name, (...args) => eventData.execute(client, ...args));\n }\n loadedEvents++;\n }\n\n if (loadedEvents > 0) {\n console.log(`[djs-next] Successfully loaded ${loadedEvents} events.`);\n }\n}\n","import { Collection } from 'discord.js';\nimport fs from 'fs';\nimport path from 'path';\nimport { pathToFileURL } from 'url';\nimport { FileComponent } from '../types.js';\nimport { getAllFiles } from './utils.js';\n\nexport async function loadComponents(componentsDir: string): Promise<Collection<string, FileComponent>> {\n const components = new Collection<string, FileComponent>();\n \n if (!fs.existsSync(componentsDir)) return components;\n\n const files = getAllFiles(componentsDir);\n\n for (const file of files) {\n const module = await import(pathToFileURL(file).href);\n const componentData: FileComponent = module.default || module.component || module;\n if (componentData) componentData.filepath = file;\n\n if (!componentData || !componentData.execute) continue;\n\n // Infer customId from filename if not explicitly provided\n const parsed = path.parse(file);\n const customId = componentData.customId || parsed.name;\n\n components.set(customId, componentData);\n }\n\n console.log(`[djs-next] Successfully loaded ${components.size} components.`);\n return components;\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { pathToFileURL } from 'url';\nimport { Client } from 'discord.js';\nimport { FileTask } from '../types.js';\nimport { getAllFiles } from './utils.js';\n\nexport async function loadTasks(client: Client, tasksDir: string) {\n if (!fs.existsSync(tasksDir)) return;\n\n const files = getAllFiles(tasksDir);\n let loaded = 0;\n\n for (const file of files) {\n const module = await import(pathToFileURL(file).href);\n const taskData: FileTask = module.default || module.task || module;\n if (taskData) taskData.filepath = file;\n\n if (!taskData || !taskData.interval || !taskData.execute) continue;\n\n const intervalId = setInterval(async () => {\n try {\n await taskData.execute(client);\n } catch (error) {\n console.error(`[djs-next] Background Task error at ${file}:`, error);\n }\n }, taskData.interval);\n\n if (!(client as any)._activeTasks) (client as any)._activeTasks = new Map();\n (client as any)._activeTasks.set(file, intervalId);\n\n loaded++;\n }\n\n if (loaded > 0) {\n console.log(`[djs-next] Successfully scheduled ${loaded} background tasks.`);\n }\n}\n","import path from 'path';\nimport fs from 'fs';\nimport { pathToFileURL } from 'url';\nimport { DJSNextConfig } from '../types.js';\n\nexport async function loadConfig(): Promise<DJSNextConfig> {\n const exts = ['.js', '.mjs', '.cjs', '.ts', '.mts', '.cts'];\n const cwd = process.cwd();\n \n for (const ext of exts) {\n const configPath = path.join(cwd, `djs-next.config${ext}`);\n if (fs.existsSync(configPath)) {\n try {\n const configModule = await import(pathToFileURL(configPath).href);\n return configModule.default || configModule;\n } catch (err) {\n console.error(`[djs-next] Error loading config file ${configPath}:`, err);\n return {};\n }\n }\n }\n return {};\n}\n\nexport function defineConfig(config: DJSNextConfig): DJSNextConfig {\n return config;\n}\n","import fs from 'fs';\nimport path from 'path';\n\nlet localesCache: Record<string, Record<string, any>> = {};\nlet defaultLoc = 'en';\n\nexport function loadLocales(localesDir: string, defaultLocale?: string) {\n if (defaultLocale) defaultLoc = defaultLocale;\n \n if (!fs.existsSync(localesDir)) return;\n\n const files = fs.readdirSync(localesDir);\n for (const file of files) {\n if (file.endsWith('.json')) {\n const lang = file.replace('.json', '');\n const content = fs.readFileSync(path.join(localesDir, file), 'utf8');\n try {\n localesCache[lang] = JSON.parse(content);\n } catch (e) {\n console.error(`[djs-next] Failed to parse locale file: ${file}`, e);\n }\n }\n }\n}\n\nexport function translate(key: string, locale: string = defaultLoc, variables?: Record<string, string | number>): string {\n // Fallback to default locale if the requested one is not found\n const dict = localesCache[locale] || localesCache[defaultLoc] || {};\n \n const keys = key.split('.');\n let value: any = dict;\n\n for (const k of keys) {\n if (value && typeof value === 'object') {\n value = value[k];\n } else {\n value = undefined;\n break;\n }\n }\n\n if (typeof value !== 'string') {\n return key; // return the key itself if string not found\n }\n\n if (variables) {\n for (const [varKey, varValue] of Object.entries(variables)) {\n value = value.replace(new RegExp(`{{s*${varKey}s*}}`, 'g'), String(varValue));\n }\n }\n\n return value;\n}\n\nexport function getLocalesCache() {\n return localesCache;\n}\n","import { Message, EmbedBuilder } from 'discord.js';\nimport { exec } from 'child_process';\nimport util from 'util';\nimport os from 'os';\nimport { DJSNextClient } from '../client.js';\nimport { loadEvents } from '../handlers/eventHandler.js';\nimport { loadComponents } from '../handlers/componentHandler.js';\nimport { loadAndDeployCommands } from '../handlers/commandHandler.js';\nimport { loadTasks } from '../handlers/taskHandler.js';\nimport { loadLocales } from '../utils/i18n.js';\n\nconst execAsync = util.promisify(exec);\n\nexport async function handleDNXT(message: Message, client: DJSNextClient, prefix: 'dnxt' | 'nxt' = 'dnxt') {\n if (message.author.bot) return;\n // Make sure only developers can use this\n if (!client['_developers'].includes(message.author.id)) return;\n\n if (!message.content.startsWith(prefix)) return;\n\n const args = message.content.slice(prefix.length).trim().split(/ +/);\n const command = args.shift()?.toLowerCase();\n\n // Root dnxt command (Stats)\n if (!command) {\n const mem = process.memoryUsage();\n const discordJsVersion = require('discord.js/package.json').version;\n const botPing = client.ws.ping;\n \n const text = \n `Module was loaded <t:${Math.floor((Date.now() - client.uptime!) / 1000)}:R>.\\n` +\n `DNXT framework plugin, discord.js \\`${discordJsVersion}\\`, \\`Node.js ${process.version}\\` on \\`${os.type()}\\`.\\n` +\n `Latencies: \\`${botPing}ms\\` websocket ping.\\n` +\n `Memory: \\`${(mem.rss / 1024 / 1024).toFixed(2)} MB\\` physical, \\`${(mem.heapUsed / 1024 / 1024).toFixed(2)} MB\\` heap.\\n` +\n `System: \\`${os.cpus().length}\\` thread(s), \\`${(os.uptime() / 60 / 60).toFixed(2)}\\` hrs system uptime.`;\n\n await message.reply(text);\n return;\n }\n\n // Evaluation (js, eval, py)\n if (command === 'js' || command === 'eval' || command === 'py') {\n let code = args.join(' ');\n if (code.startsWith('```js') || code.startsWith('```py')) code = code.replace(/^```[a-z]*|```$/g, '');\n else if (code.startsWith('```')) code = code.replace(/^```|```$/g, '');\n\n if (!code) return void await message.reply('❌ Please provide code to evaluate.');\n\n try {\n const start = process.hrtime.bigint();\n const { commands, components, config } = client;\n \n // eslint-disable-next-line no-eval\n let evaled = await eval(`(async () => { ${code} })()`);\n const end = process.hrtime.bigint();\n const timeMs = Number(end - start) / 1e6;\n\n if (typeof evaled !== 'string') evaled = util.inspect(evaled, { depth: 1 });\n\n await sendPaginatedText(message, `✅ **Evaluated in ${timeMs.toFixed(3)}ms**\\n`, evaled, 'js');\n } catch (err: any) {\n await sendPaginatedText(message, `❌ **Evaluation Error**\\n`, err.message, 'js');\n }\n return;\n }\n\n // Execute Shell (sh, shell, git)\n if (command === 'sh' || command === 'shell' || command === 'git') {\n const cmd = command === 'git' ? 'git ' + args.join(' ') : args.join(' ');\n if (!cmd) return void await message.reply('❌ Please provide a command to execute.');\n\n try {\n const start = process.hrtime.bigint();\n const { stdout, stderr } = await execAsync(cmd);\n const end = process.hrtime.bigint();\n const timeMs = Number(end - start) / 1e6;\n\n const result = stdout || stderr || 'No output.';\n await sendPaginatedText(message, `✅ **Executed in ${timeMs.toFixed(3)}ms**\\n`, result, 'sh');\n } catch (err: any) {\n await sendPaginatedText(message, `❌ **Shell Error**\\n`, err.message, 'sh');\n }\n return;\n }\n\n // Load / Unload / Reload\n if (command === 'reload' || command === 'load') {\n const target = args[0]?.toLowerCase();\n try {\n if (target === 'commands' && client['_commandsDir']) {\n client.commands.clear();\n client.commands = await loadAndDeployCommands(client['_commandsDir'], client.token!, client['_clientId']!, client['_guildId']);\n await message.reply('✅ Reloaded commands.');\n } else if (target === 'events' && client['_eventsDir']) {\n client.removeAllListeners();\n client['attachCoreListeners']();\n await loadEvents(client, client['_eventsDir']);\n await message.reply('✅ Reloaded events.');\n } else if (target === 'components' && client['_componentsDir']) {\n client.components.clear();\n client.components = await loadComponents(client['_componentsDir']);\n await message.reply('✅ Reloaded components.');\n } else if (target === 'locales' && client['_localesDir']) {\n loadLocales(client['_localesDir'], client.config.defaultLocale);\n await message.reply('✅ Reloaded locales.');\n } else if (target === 'all' || !target) {\n client.removeAllListeners();\n client['attachCoreListeners']();\n client.commands.clear();\n client.components.clear();\n if (client['_eventsDir']) await loadEvents(client, client['_eventsDir']);\n if (client['_componentsDir']) client.components = await loadComponents(client['_componentsDir']);\n if (client['_localesDir']) loadLocales(client['_localesDir'], client.config.defaultLocale);\n if (client['_commandsDir']) client.commands = await loadAndDeployCommands(client['_commandsDir'], client.token!, client['_clientId']!, client['_guildId']);\n await message.reply('✅ Reloaded all framework modules.');\n } else {\n await message.reply('❌ Unknown target. Valid targets: `commands, events, components, locales, all`');\n }\n } catch (err: any) {\n await message.reply(`❌ **Reload Error:** ${err.message}`);\n }\n return;\n }\n\n // Cat (Read File)\n if (command === 'cat') {\n const fs = await import('fs');\n const path = await import('path');\n const file = args.join(' ');\n if (!file) return void await message.reply('❌ Please provide a file to read.');\n \n try {\n const content = fs.readFileSync(path.resolve(process.cwd(), file), 'utf8');\n await sendPaginatedText(message, `📄 **${file}**\\n`, content, file.split('.').pop() || '');\n } catch (e: any) {\n await message.reply(`❌ **Error reading file:** ${e.message}`);\n }\n return;\n }\n\n // Sudo (Invoke command as another user)\n if (command === 'su' || command === 'sudo') {\n const targetUserId = args.shift();\n const cmd = args.join(' ');\n if (!targetUserId || !cmd) return void await message.reply(`❌ Usage: ${prefix} su <user_id> <command>`);\n \n try {\n const targetUser = await client.users.fetch(targetUserId.replace(/<@!?|>/g, ''));\n if (!targetUser) throw new Error('User not found.');\n \n // Create a mock message\n const mockMessage = Object.assign(Object.create(Object.getPrototypeOf(message)), message);\n mockMessage.author = targetUser;\n if (message.guild) {\n mockMessage.member = await message.guild.members.fetch(targetUser.id).catch(() => null);\n }\n mockMessage.content = cmd;\n \n client.emit('messageCreate', mockMessage as Message);\n await message.reply(`✅ Invoked \\`${cmd}\\` as **${targetUser.tag}**.`);\n } catch (e: any) {\n await message.reply(`❌ **Sudo Error:** ${e.message}`);\n }\n return;\n }\n\n // Source Command (dnxt source <command>)\n if (command === 'source' || command === 'src') {\n const target = args.join(' ');\n if (!target) return void await message.reply('❌ Please provide a command name.');\n const cmdData = client.commands.get(target);\n if (!cmdData || !cmdData.filepath) return void await message.reply('❌ Command not found or has no associated filepath.');\n \n try {\n const fs = await import('fs');\n const content = fs.readFileSync(cmdData.filepath, 'utf8');\n await sendPaginatedText(message, `📄 **Source of \\`${target}\\`**\\n`, content, cmdData.filepath.split('.').pop() || '');\n } catch (e: any) {\n await message.reply(`❌ **Error reading source:** ${e.message}`);\n }\n return;\n }\n\n // Curl (dnxt curl <url>)\n if (command === 'curl') {\n const url = args[0];\n if (!url) return void await message.reply('❌ Please provide a URL.');\n try {\n const res = await fetch(url);\n const text = await res.text();\n await sendPaginatedText(message, `🌐 **Fetched from \\`${url}\\`**\\n`, text, 'html');\n } catch (e: any) {\n await message.reply(`❌ **Curl Error:** ${e.message}`);\n }\n return;\n }\n\n // Debug Command (dnxt debug <command>)\n // In discord.py DNXT debug measures execution of a command.\n // In our case we will run a js eval and time it explicitly with heap usage.\n if (command === 'debug') {\n let code = args.join(' ');\n if (code.startsWith('```js') || code.startsWith('```py')) code = code.replace(/^```[a-z]*|```$/g, '');\n else if (code.startsWith('```')) code = code.replace(/^```|```$/g, '');\n if (!code) return void await message.reply('❌ Please provide code to debug.');\n \n try {\n const startMem = process.memoryUsage().heapUsed;\n const start = process.hrtime.bigint();\n const { commands, components, config } = client;\n \n // eslint-disable-next-line no-eval\n let evaled = await eval(`(async () => { ${code} })()`);\n \n const end = process.hrtime.bigint();\n const endMem = process.memoryUsage().heapUsed;\n const timeMs = Number(end - start) / 1e6;\n const memDiff = (endMem - startMem) / 1024 / 1024;\n \n if (typeof evaled !== 'string') evaled = util.inspect(evaled, { depth: 1 });\n \n await sendPaginatedText(message, `⏱️ **Debug Execution**\\nTime: \\`${timeMs.toFixed(3)}ms\\` | Heap Delta: \\`${memDiff.toFixed(3)}MB\\`\\n`, evaled, 'js');\n } catch (err: any) {\n await sendPaginatedText(message, `❌ **Debug Error**\\n`, err.message, 'js');\n }\n return;\n }\n\n // In Command (dnxt in <channel_id> <command>)\n if (command === 'in') {\n const channelId = args.shift()?.replace(/<#|>/g, '');\n const cmd = args.join(' ');\n if (!channelId || !cmd) return void await message.reply(`❌ Usage: ${prefix} in <channel> <command>`);\n try {\n const targetChannel = await client.channels.fetch(channelId);\n if (!targetChannel || !targetChannel.isTextBased()) throw new Error('Invalid Text Channel.');\n \n const mockMessage = Object.assign(Object.create(Object.getPrototypeOf(message)), message);\n mockMessage.channel = targetChannel;\n mockMessage.channelId = targetChannel.id;\n mockMessage.content = cmd;\n \n client.emit('messageCreate', mockMessage as Message);\n await message.reply(`✅ Redirected execution to <#${targetChannel.id}>.`);\n } catch (e: any) {\n await message.reply(`❌ **In Error:** ${e.message}`);\n }\n return;\n }\n\n // Tasks Command (dnxt tasks)\n if (command === 'tasks') {\n const tasks = (client as any)._activeTasks as Map<string, NodeJS.Timeout>;\n if (!tasks || tasks.size === 0) return void await message.reply('No active background tasks running.');\n \n let text = `⚙️ **Active Background Tasks (${tasks.size})**\\n`;\n for (const [name] of tasks.entries()) {\n text += `- \\`${name.split('/').pop()}\\`\\n`;\n }\n await sendPaginatedText(message, '', text, '');\n return;\n }\n\n // Cancel Command (dnxt cancel <task>)\n if (command === 'cancel') {\n const target = args.join(' ');\n if (!target) return void await message.reply(`❌ Usage: ${prefix} cancel <task_name>`);\n \n const tasks = (client as any)._activeTasks as Map<string, NodeJS.Timeout>;\n if (!tasks) return void await message.reply('No active tasks to cancel.');\n \n let found = false;\n for (const [name, intervalId] of tasks.entries()) {\n if (name.includes(target)) {\n clearInterval(intervalId);\n tasks.delete(name);\n found = true;\n await message.reply(`✅ Cancelled background task: \\`${name.split('/').pop()}\\``);\n break;\n }\n }\n if (!found) await message.reply('❌ Task not found.');\n return;\n }\n\n // Sync Command (dnxt sync)\n if (command === 'sync') {\n try {\n await message.reply('🔄 Force syncing slash commands...');\n await loadAndDeployCommands((client as any)._commandsDir, client.token!, (client as any)._clientId, (client as any)._guildId);\n await message.reply('✅ Slash commands synchronized globally/locally.');\n } catch (e: any) {\n await message.reply(`❌ **Sync Error:** ${e.message}`);\n }\n return;\n }\n\n // SQL Command (dnxt sql <query>)\n if (command === 'sql') {\n const query = args.join(' ');\n if (!query) return void await message.reply(`❌ Usage: ${prefix} sql <query>`);\n \n try {\n let res: any;\n if (client.db && typeof client.db.$queryRawUnsafe === 'function') {\n res = await client.db.$queryRawUnsafe(query); // Prisma fallback\n } else if (client.db && typeof client.db.query === 'function') {\n res = await client.db.query(query); // PG/MySQL fallback\n } else {\n return void await message.reply('❌ Your configured `client.db` does not expose a recognized raw SQL execution method (`$queryRawUnsafe` or `query`).');\n }\n const inspect = util.inspect(res, { depth: 2 });\n await sendPaginatedText(message, `🗄️ **SQL Query**\\n`, inspect, 'js');\n } catch (e: any) {\n await message.reply(`❌ **SQL Error:** ${e.message}`);\n }\n return;\n }\n\n // Voice Command (dnxt vc)\n if (command === 'vc' || command === 'voice') {\n if (!message.guild) return void await message.reply('❌ This command must be used in a server.');\n const me = message.guild.members.me;\n if (!me?.voice?.channel) return void await message.reply('❌ Bot is not currently in a voice channel.');\n \n const text = `🎙️ **Voice Debugger**\\n` +\n `Channel: <#${me.voice.channel.id}> (\\`${me.voice.channel.id}\\`)\\n` +\n `Muted: ${me.voice.mute} | Deafened: ${me.voice.deaf}\\n` +\n `Session ID: \\`${me.voice.sessionId || 'None'}\\``;\n await message.reply(text);\n return;\n }\n\n await message.reply(`❓ Unknown ${prefix} command. Available: \\`js, sh, git, cat, curl, su, in, source, debug, reload, tasks, cancel, sync, sql, vc\\``);\n}\n\nasync function sendPaginatedText(message: Message, header: string, content: string, language: string = '') {\n const maxLength = 1900;\n if (content.length <= maxLength) {\n await message.reply(`${header}\\`\\`\\`${language}\\n${content}\\n\\`\\`\\``);\n return;\n }\n\n const chunks: string[] = [];\n for (let i = 0; i < content.length; i += maxLength) {\n chunks.push(content.substring(i, i + maxLength));\n }\n\n let index = 0;\n const reply = await message.reply(`${header}\\`\\`\\`${language}\\n${chunks[index]}\\n\\`\\`\\`\\n*Page 1 of ${chunks.length}*`);\n\n await reply.react('◀️');\n await reply.react('▶️');\n await reply.react('⏹️');\n\n const collector = reply.createReactionCollector({\n filter: (reaction, user) => ['◀️', '▶️', '⏹️'].includes(reaction.emoji.name!) && user.id === message.author.id,\n time: 120000\n });\n\n collector.on('collect', async (reaction, user) => {\n await reaction.users.remove(user.id).catch(() => null);\n\n if (reaction.emoji.name === '◀️') {\n index = index > 0 ? index - 1 : index;\n } else if (reaction.emoji.name === '▶️') {\n index = index < chunks.length - 1 ? index + 1 : index;\n } else if (reaction.emoji.name === '⏹️') {\n collector.stop();\n return;\n }\n\n await reply.edit(`${header}\\`\\`\\`${language}\\n${chunks[index]}\\n\\`\\`\\`\\n*Page ${index + 1} of ${chunks.length}*`);\n });\n\n collector.on('end', () => {\n reply.reactions.removeAll().catch(() => null);\n });\n}\n","import {\n ActionRowBuilder,\n ButtonBuilder,\n ButtonStyle,\n CommandInteraction,\n EmbedBuilder,\n MessageComponentInteraction\n} from 'discord.js';\n\nexport async function paginate(\n interaction: CommandInteraction | MessageComponentInteraction,\n pages: EmbedBuilder[],\n time: number = 60000\n) {\n if (!interaction.deferred && !interaction.replied) {\n await interaction.deferReply();\n }\n\n if (pages.length === 1) {\n return interaction.editReply({ embeds: [pages[0]], components: [] });\n }\n\n let index = 0;\n\n const prevButton = new ButtonBuilder()\n .setCustomId('djs_prev')\n .setLabel('Previous')\n .setStyle(ButtonStyle.Primary)\n .setDisabled(true);\n\n const nextButton = new ButtonBuilder()\n .setCustomId('djs_next')\n .setLabel('Next')\n .setStyle(ButtonStyle.Primary);\n\n const row = new ActionRowBuilder<ButtonBuilder>().addComponents(prevButton, nextButton);\n\n const message = await interaction.editReply({\n embeds: [pages[index]],\n components: [row],\n });\n\n const collector = message.createMessageComponentCollector({\n filter: (i) => i.user.id === interaction.user.id,\n time\n });\n\n collector.on('collect', async (i) => {\n if (i.customId === 'djs_prev') {\n index = index > 0 ? index - 1 : index;\n } else if (i.customId === 'djs_next') {\n index = index < pages.length - 1 ? index + 1 : index;\n }\n\n prevButton.setDisabled(index === 0);\n nextButton.setDisabled(index === pages.length - 1);\n\n await i.update({\n embeds: [pages[index]],\n components: [new ActionRowBuilder<ButtonBuilder>().addComponents(prevButton, nextButton)]\n });\n });\n\n collector.on('end', async () => {\n prevButton.setDisabled(true);\n nextButton.setDisabled(true);\n await interaction.editReply({\n components: [new ActionRowBuilder<ButtonBuilder>().addComponents(prevButton, nextButton)]\n }).catch(() => {});\n });\n}\n","export * from './client.js';\nexport { DJSNextClientOptions, FileCommand, FileComponent, FileTask, Event as DJSNextEvent, DJSNextConfig } from './types.js';\nexport * from './utils/paginate.js';\nexport * from './utils/configLoader.js';\nexport * from './utils/i18n.js';\n// Re-export everything from discord.js so users don't need to install it explicitly\nexport * from 'discord.js';\n"],"mappings":"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","names":["Collection","fs","path","fs","path","fs","pathToFileURL","client","fs","pathToFileURL","args","Collection","fs","path","pathToFileURL","components","Collection","fs","pathToFileURL","path","fs","pathToFileURL","client","fs","pathToFileURL","path","fs","pathToFileURL","path","fs","pathToFileURL","config","fs","path","start","end","timeMs","fs","path","message","Collection","path","command","message","args","fs","pathToFileURL","prefix","message"]}
|
package/package.json
CHANGED
package/src/client.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Client, Collection, Interaction } from 'discord.js';
|
|
1
|
+
import { Client, Collection, Interaction, Message } from 'discord.js';
|
|
2
2
|
import { DJSNextClientOptions, FileCommand, FileComponent, DJSNextConfig } from './types.js';
|
|
3
3
|
import { loadAndDeployCommands } from './handlers/commandHandler.js';
|
|
4
4
|
import { loadEvents } from './handlers/eventHandler.js';
|
|
@@ -28,7 +28,9 @@ export class DJSNextClient<DB = any> extends Client {
|
|
|
28
28
|
private _clientId?: string;
|
|
29
29
|
private _guildId?: string;
|
|
30
30
|
private _developers: string[];
|
|
31
|
-
private _middleware?: (interaction: Interaction, client: Client) => Promise<boolean> | boolean;
|
|
31
|
+
private _middleware?: (interaction: Interaction | Message, client: Client) => Promise<boolean> | boolean;
|
|
32
|
+
private _prefixes: string[];
|
|
33
|
+
private _enableMentionPrefix: boolean;
|
|
32
34
|
|
|
33
35
|
constructor(options: DJSNextClientOptions) {
|
|
34
36
|
super(options);
|
|
@@ -43,7 +45,11 @@ export class DJSNextClient<DB = any> extends Client {
|
|
|
43
45
|
this._clientId = options.clientId;
|
|
44
46
|
this._guildId = options.guildId;
|
|
45
47
|
this._developers = options.developers || [];
|
|
46
|
-
this._middleware = options.middleware;
|
|
48
|
+
this._middleware = options.middleware as any;
|
|
49
|
+
|
|
50
|
+
const prefs = options.prefixes || [];
|
|
51
|
+
this._prefixes = Array.isArray(prefs) ? prefs : [prefs];
|
|
52
|
+
this._enableMentionPrefix = options.enableMentionPrefix ?? true;
|
|
47
53
|
|
|
48
54
|
this.attachCoreListeners();
|
|
49
55
|
}
|
|
@@ -180,6 +186,102 @@ export class DJSNextClient<DB = any> extends Client {
|
|
|
180
186
|
}
|
|
181
187
|
}
|
|
182
188
|
});
|
|
189
|
+
|
|
190
|
+
this.on('messageCreate', async (message: Message) => {
|
|
191
|
+
if (message.author.bot) return;
|
|
192
|
+
|
|
193
|
+
// Global Middleware execution for Messages
|
|
194
|
+
if (this._middleware) {
|
|
195
|
+
try {
|
|
196
|
+
const shouldContinue = await this._middleware(message, this);
|
|
197
|
+
if (!shouldContinue) return;
|
|
198
|
+
} catch (error) {
|
|
199
|
+
console.error(`[djs-next] Middleware error (Message):`, error);
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
let content = message.content.trim();
|
|
205
|
+
let matchedPrefix = '';
|
|
206
|
+
let isCommand = false;
|
|
207
|
+
|
|
208
|
+
// 1. Check Mention Prefix
|
|
209
|
+
const mentionRegex = new RegExp(`^<@!?${this.user?.id}>\\s*`);
|
|
210
|
+
if (this._enableMentionPrefix && mentionRegex.test(content)) {
|
|
211
|
+
matchedPrefix = content.match(mentionRegex)![0];
|
|
212
|
+
isCommand = true;
|
|
213
|
+
} else {
|
|
214
|
+
// 2. Check Standard/No Prefixes
|
|
215
|
+
// Sort by length descending so longer prefixes match first
|
|
216
|
+
const sortedPrefs = [...this._prefixes].sort((a, b) => b.length - a.length);
|
|
217
|
+
|
|
218
|
+
// If prefixes array is empty or contains an empty string, it means "no prefix" is supported!
|
|
219
|
+
if (sortedPrefs.includes('')) {
|
|
220
|
+
isCommand = true;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
for (const p of sortedPrefs) {
|
|
224
|
+
if (p !== '' && content.startsWith(p)) {
|
|
225
|
+
matchedPrefix = p;
|
|
226
|
+
isCommand = true;
|
|
227
|
+
break;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
if (!isCommand) return;
|
|
233
|
+
|
|
234
|
+
const args = content.slice(matchedPrefix.length).trim().split(/ +/g);
|
|
235
|
+
const commandName = args.shift()?.toLowerCase();
|
|
236
|
+
if (!commandName) return;
|
|
237
|
+
|
|
238
|
+
// Find the command
|
|
239
|
+
let command = this.commands.get(commandName);
|
|
240
|
+
if (!command) {
|
|
241
|
+
// Check aliases
|
|
242
|
+
command = this.commands.find(c => c.aliases?.includes(commandName) || false);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
if (!command || !command.executeText) return;
|
|
246
|
+
|
|
247
|
+
// Validation Checks (Developers/GuildOnly)
|
|
248
|
+
if (command.developerOnly && !this._developers.includes(message.author.id)) return;
|
|
249
|
+
if (command.guildOnly && !message.guild) return;
|
|
250
|
+
|
|
251
|
+
if (command.userPermissions && message.member?.permissions) {
|
|
252
|
+
const missing = message.member.permissions.missing(command.userPermissions);
|
|
253
|
+
if (missing.length > 0) return;
|
|
254
|
+
}
|
|
255
|
+
if (command.botPermissions && message.guild?.members.me?.permissions) {
|
|
256
|
+
const missing = message.guild.members.me.permissions.missing(command.botPermissions);
|
|
257
|
+
if (missing.length > 0) return;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// Cooldowns
|
|
261
|
+
if (command.cooldown) {
|
|
262
|
+
if (!this.cooldowns.has(commandName)) this.cooldowns.set(commandName, new Collection());
|
|
263
|
+
const now = Date.now();
|
|
264
|
+
const timestamps = this.cooldowns.get(commandName)!;
|
|
265
|
+
const cooldownAmount = command.cooldown * 1000;
|
|
266
|
+
|
|
267
|
+
if (timestamps.has(message.author.id)) {
|
|
268
|
+
const expirationTime = timestamps.get(message.author.id)! + cooldownAmount;
|
|
269
|
+
if (now < expirationTime) {
|
|
270
|
+
return void await message.reply(`Please wait, you are on a cooldown. You can use it again <t:${Math.round(expirationTime / 1000)}:R>.`);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
timestamps.set(message.author.id, now);
|
|
274
|
+
setTimeout(() => timestamps.delete(message.author.id), cooldownAmount);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// Execute Text Command
|
|
278
|
+
try {
|
|
279
|
+
await command.executeText(message, args, this);
|
|
280
|
+
} catch (error) {
|
|
281
|
+
console.error(`[djs-next] Error executing text command: "${commandName}"`, error);
|
|
282
|
+
await message.reply('We ran into an internal error executing this command.').catch(() => null);
|
|
283
|
+
}
|
|
284
|
+
});
|
|
183
285
|
}
|
|
184
286
|
|
|
185
287
|
public async start(token: string): Promise<void> {
|
package/src/types.ts
CHANGED
|
@@ -8,7 +8,8 @@ import {
|
|
|
8
8
|
AutocompleteInteraction,
|
|
9
9
|
MessageComponentInteraction,
|
|
10
10
|
ModalSubmitInteraction,
|
|
11
|
-
Interaction
|
|
11
|
+
Interaction,
|
|
12
|
+
Message
|
|
12
13
|
} from 'discord.js';
|
|
13
14
|
|
|
14
15
|
export interface DJSNextConfig {
|
|
@@ -32,7 +33,9 @@ export interface DJSNextClientOptions extends ClientOptions {
|
|
|
32
33
|
clientId?: string;
|
|
33
34
|
guildId?: string;
|
|
34
35
|
developers?: string[];
|
|
35
|
-
|
|
36
|
+
prefixes?: string[] | string;
|
|
37
|
+
enableMentionPrefix?: boolean;
|
|
38
|
+
middleware?: (interaction: Interaction | Message, client: Client) => Promise<boolean> | boolean;
|
|
36
39
|
config?: DJSNextConfig;
|
|
37
40
|
}
|
|
38
41
|
|
|
@@ -51,7 +54,9 @@ export interface FileCommand<DB = any> {
|
|
|
51
54
|
botPermissions?: PermissionResolvable[];
|
|
52
55
|
developerOnly?: boolean;
|
|
53
56
|
guildOnly?: boolean;
|
|
57
|
+
aliases?: string[];
|
|
54
58
|
execute?: (interaction: ChatInputCommandInteraction, client: Client & { db: DB; t: Function; config: DJSNextConfig }) => Promise<void> | void;
|
|
59
|
+
executeText?: (message: Message, args: string[], client: Client & { db: DB; t: Function; config: DJSNextConfig }) => Promise<void> | void;
|
|
55
60
|
autocomplete?: (interaction: AutocompleteInteraction, client: Client & { db: DB; t: Function; config: DJSNextConfig }) => Promise<void> | void;
|
|
56
61
|
}
|
|
57
62
|
|