-
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathbot.js
375 lines (295 loc) · 10.6 KB
/
bot.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
/**
* @file Main File of the bot, responsible for registering events, commands, interactions etc.
* @author Naman Vrati
* @since 1.0.0
* @version 3.0.0
*/
// Declare constants which will be used throughout the bot.
const fs = require('fs');
const { Client, Collection, REST, Routes } = require('discord.js');
/**
* @type {import('./typings').ConfigurationFile} Config File.
*/
const config = require('./config.json');
const { internal } = config;
const { token, client_id, guild_id } = internal;
const { version } = require('./package.json');
// Additional Required Modules
const fileExists = require('./functions/fileExists');
// Initialize LeeksLazyLogger
const { Logger } = require('leekslazylogger');
// @ts-ignore
const log = new Logger({ keepSilent: true });
/**
* From v13, specifying the intents is compulsory.
* @type {import("./typings").Client}
* @description Main Application Client */
// @ts-ignore
const client = new Client({
// Please add all intents you need, more detailed information @ https://ziad87.net/intents/
intents: 45571,
});
/**********************************************************************/
// Error Notifier / Handler!
process.on('unhandledRejection', (error) => {
log.critical(
'**********************************************************************',
);
log.notice(
'YOU NEED TO INCLUDE THIS INFORMATION IF YOU ASK FOR HELP ABOUT THE BELOW ERROR:',
);
log.notice(
`NamVr Chat Economy v${version}, Node v${process.versions.node} on ${process.platform}`,
);
log.warn('NCE BOT ENCOUNTERED AN ERROR!');
if (error instanceof Error) log.warn(`Uncaught ${error.name}`);
log.error(error);
log.critical(
'**********************************************************************',
);
});
/**********************************************************************/
// Path Checking For Required Files!
const requiredFiles = [
'./config.json',
'./database/shop.json',
'./functions/banner.js',
'./database/users.json',
];
for (const path of requiredFiles) {
if (!fileExists(path)) {
log.warn('A REQUIRED FILE IS MISSING!');
log.error(
`ERROR: CAN'T FIND CONFIGURATION FILE (${path}) Please make sure it exists!`,
);
process.exit(1);
}
}
require('./functions/banner')();
/**********************************************************************/
// Below we will be making an event handler!
/**
* @description All event files of the event handler.
* @type {String[]}
*/
// Loop through all files and execute the event when it is actually emmited.
/**
* @type {String[]}
* @description All command categories aka folders.
*/
const eventFolders = fs.readdirSync('./events');
// Loop through all files and store commands in commands collection.
for (const folder of eventFolders) {
const eventFiles = fs
.readdirSync(`./events/${folder}`)
.filter((file) => file.endsWith('.js'));
for (const file of eventFiles) {
const event = require(`./events/${folder}/${file}`);
if (event.once) {
client.once(event.name, (...args) =>
event.execute(...args, client),
);
} else {
client.on(
event.name,
async (...args) => await event.execute(...args, client),
);
}
}
}
/**********************************************************************/
// Define Collection of Commands, Slash Commands and cooldowns
client.commands = new Collection();
client.slashCommands = new Collection();
client.buttonCommands = new Collection();
client.selectCommands = new Collection();
client.contextCommands = new Collection();
client.modalCommands = new Collection();
client.cooldowns = new Collection();
client.triggers = new Collection();
client.autocompleteInteractions = new Collection();
// Economy Cache Handler
client.economy = {
// You can extend properties as per your liking.
heat: 0,
};
/**********************************************************************/
// Registration of Message-Based Legacy Commands.
/**
* @type {String[]}
* @description All command categories aka folders.
*/
const commandFolders = fs.readdirSync('./commands');
// Loop through all files and store commands in commands collection.
for (const folder of commandFolders) {
const commandFiles = fs
.readdirSync(`./commands/${folder}`)
.filter((file) => file.endsWith('.js'));
for (const file of commandFiles) {
const command = require(`./commands/${folder}/${file}`);
client.commands.set(command.name, command);
}
}
/**********************************************************************/
// Registration of Slash-Command Interactions.
/**
* @type {String[]}
* @description All slash commands.
*/
const slashCommands = fs.readdirSync('./interactions/slash');
// Loop through all files and store slash-commands in slashCommands collection.
for (const module of slashCommands) {
const commandFiles = fs
.readdirSync(`./interactions/slash/${module}`)
.filter((file) => file.endsWith('.js'));
for (const commandFile of commandFiles) {
const command = require(`./interactions/slash/${module}/${commandFile}`);
client.slashCommands.set(command.data.name, command);
}
}
/**********************************************************************/
// Registration of Autocomplete Interactions.
/**
* @type {String[]}
* @description All autocomplete interactions.
*/
const autocompleteInteractions = fs.readdirSync('./interactions/autocomplete');
// Loop through all files and store autocomplete interactions in autocompleteInteractions collection.
for (const module of autocompleteInteractions) {
const files = fs
.readdirSync(`./interactions/autocomplete/${module}`)
.filter((file) => file.endsWith('.js'));
for (const interactionFile of files) {
const interaction = require(`./interactions/autocomplete/${module}/${interactionFile}`);
client.autocompleteInteractions.set(interaction.name, interaction);
}
}
/**********************************************************************/
// Registration of Context-Menu Interactions
/**
* @type {String[]}
* @description All Context Menu commands.
*/
const contextMenus = fs.readdirSync('./interactions/context-menus');
// Loop through all files and store context-menus in contextMenus collection.
for (const folder of contextMenus) {
const files = fs
.readdirSync(`./interactions/context-menus/${folder}`)
.filter((file) => file.endsWith('.js'));
for (const file of files) {
const menu = require(`./interactions/context-menus/${folder}/${file}`);
const keyName = `${folder.toUpperCase()} ${menu.data.name}`;
client.contextCommands.set(keyName, menu);
}
}
/**********************************************************************/
// Registration of Button-Command Interactions.
/**
* @type {String[]}
* @description All button commands.
*/
const buttonCommands = fs.readdirSync('./interactions/buttons');
// Loop through all files and store button-commands in buttonCommands collection.
for (const module of buttonCommands) {
const commandFiles = fs
.readdirSync(`./interactions/buttons/${module}`)
.filter((file) => file.endsWith('.js'));
for (const commandFile of commandFiles) {
const command = require(`./interactions/buttons/${module}/${commandFile}`);
client.buttonCommands.set(command.id, command);
}
}
/**********************************************************************/
// Registration of Modal-Command Interactions.
/**
* @type {String[]}
* @description All modal commands.
*/
const modalCommands = fs.readdirSync('./interactions/modals');
// Loop through all files and store modal-commands in modalCommands collection.
for (const module of modalCommands) {
const commandFiles = fs
.readdirSync(`./interactions/modals/${module}`)
.filter((file) => file.endsWith('.js'));
for (const commandFile of commandFiles) {
const command = require(`./interactions/modals/${module}/${commandFile}`);
client.modalCommands.set(command.id, command);
}
}
/**********************************************************************/
// Registration of select-menus Interactions
/**
* @type {String[]}
* @description All Select Menu commands.
*/
const selectMenus = fs.readdirSync('./interactions/select-menus');
// Loop through all files and store select-menus in selectMenus collection.
for (const module of selectMenus) {
const commandFiles = fs
.readdirSync(`./interactions/select-menus/${module}`)
.filter((file) => file.endsWith('.js'));
for (const commandFile of commandFiles) {
const command = require(`./interactions/select-menus/${module}/${commandFile}`);
client.selectCommands.set(command.id, command);
}
}
/**********************************************************************/
// Registration of Slash-Commands in Discord API
const rest = new REST({ version: '9' }).setToken(token);
const commandJsonData = [
...Array.from(client.slashCommands.values()).map((c) => c.data.toJSON()),
...Array.from(client.contextCommands.values()).map((c) => c.data),
];
(async () => {
try {
log.notice('Started refreshing application (/) commands.');
await rest.put(
/**
* By default, you will be using guild commands during development.
* Once you are done and ready to use global commands (which have 1 hour cache time),
* 1. Please uncomment the below (commented) line to deploy global commands.
* 2. Please comment the below (uncommented) line (for guild commands).
*/
Routes.applicationGuildCommands(client_id, guild_id),
/**
* Good advice for global commands, you need to execute them only once to update
* your commands to the Discord API. Please comment it again after running the bot once
* to ensure they don't get re-deployed on the next restart.
*/
// Routes.applicationGuildCommands(client_id)
{ body: commandJsonData },
);
log.success('Successfully reloaded application (/) commands.');
} catch (error) {
log.error(error);
}
})();
/**********************************************************************/
// Registration of Message Based Chat Triggers
/**
* @type {String[]}
* @description All trigger categories aka folders.
*/
const triggerFolders = fs.readdirSync('./triggers');
// Loop through all files and store triggers in triggers collection.
for (const folder of triggerFolders) {
const triggerFiles = fs
.readdirSync(`./triggers/${folder}`)
.filter((file) => file.endsWith('.js'));
for (const file of triggerFiles) {
const trigger = require(`./triggers/${folder}/${file}`);
client.triggers.set(trigger.name, trigger);
}
}
// Login into your client application with bot's token.
client.login(token);
/* ********************************************
*
* This discord bot handler was cloned
* from @NamVr/DiscordBot-Template
* https://github.com/NamVr/DiscordBot-Template
*
* All questions regarding handlers should be
* asked on the above repository.
*
** ********************************************/