-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
bot.js
156 lines (137 loc) · 6.26 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
const fs = require('node:fs');
const { Client, Intents, Collection } = require('discord.js');
const { token } = require('../config.json');
// Create a new client instance
const client = new Client({ intents: [Intents.FLAGS.GUILDS] });
// Reading event files
const eventFiles = fs.readdirSync('./src/events').filter(file => file.endsWith('.js'));
for (const file of eventFiles) {
const event = require(`./events/${file}`);
if (event.once) client.once(event.name, (...args) => event.execute(...args));
else client.on(event.name, (...args) => event.execute(...args));
}
// Reading command files
client.commands = new Collection();
const commandFiles = fs.readdirSync('./src/commands').filter(file => file.endsWith('.js'));
for (const file of commandFiles) {
const command = require(`./commands/${file}`);
client.commands.set(command.data.name, command);
}
// Reading button files
const buttons = new Collection();
const buttonFiles = fs.readdirSync('./src/buttons').filter(file => file.endsWith('.js'));
for (const file of buttonFiles) {
const button = require(`./buttons/${file}`);
buttons.set(button.id, button);
}
// Reading select menu files
const selectMenus = new Collection();
const selectMenuFiles = fs.readdirSync('./src/selectMenus').filter(file => file.endsWith('.js'));
for (const file of selectMenuFiles) {
const selectMenu = require(`./selectMenus/${file}`);
selectMenus.set(selectMenu.id, selectMenu);
}
// Reading context menu files
const contextMenus = new Collection();
const contextMenuFiles = fs.readdirSync('./src/contextMenus').filter(file => file.endsWith('.js'));
for (const file of contextMenuFiles) {
const contextMenu = require(`./contextMenus/${file}`);
contextMenus.set(contextMenu.id, contextMenu);
}
// Runs when an interaction is created
client.on('interactionCreate', async interaction => {
// Returns if bot is not ready
if (!(new (require('./database'))().getConnection())) return;
// Import mysql database
const database = new (require('./database'))();
const { models } = database.getConnection();
// Add interaction to database
database.addInteraction(interaction);
// Lookup if user or guild banned
const bannedUser = await models.UserBan.findOne({ where: { userId: interaction.user.id, pardonModId: null } });
if (bannedUser) return database.reply(interaction, 'USER_BANNED', { 'REASON': bannedUser.reason, 'BAN_ID': bannedUser.banId });
if (interaction.inGuild()) {
const bannedGuild = await models.GuildBan.findOne({ where: { guildId: interaction.guildId, pardonModId: null } });
if (bannedGuild) return database.reply(interaction, 'GUILD_BANNED', { 'REASON': bannedUser.reason, 'BAN_ID': bannedGuild.banId });
}
if (interaction.isCommand()) {
// Get the command name of the interaction
const { commandName } = interaction;
// Returns if command does not exists
if (!interaction.client.commands.has(commandName)) return;
// Defer reply to prevent timeout errors
await interaction.deferReply({ ephemeral: true });
// Lookup if command is disabled by an admin
const disabledCommand = await models.DisabledCommands.findOne({ where: { commandName: commandName } });
if (disabledCommand) return database.reply(interaction, 'COMMAND_DISABLED', { 'REASON': disabledCommand.reason });
try {
// Execute the individual command file
client.commands.get(commandName).execute(interaction);
}
catch (error) {
// Prints the error to the console
console.error(`Error at ${interaction.id}:\n${error.stack}`);
// Update the result with the interaction database entry
database.reply(interaction, 'ERROR', { 'STACK': error.stack });
}
}
else if (interaction.isButton()) {
// Get the custom id of the button interaction
const customId = interaction.customId.split(',')[0];
// Returns if button does not exits
if (!buttons.has(customId)) return;
// Lookup if button is disabled by an admin
const disabledCommand = await models.DisabledCommands.findOne({ where: { commandName: buttons.get(customId).linkedCommand } });
if (disabledCommand) return database.reply(interaction, 'COMMAND_DISABLED', { 'REASON': disabledCommand.reason });
try {
// Execute the individual button interaction
buttons.get(customId).execute(interaction);
}
catch (error) {
// Prints the error to the console
console.error(`Error at ${interaction.id}:\n${error.stack}`);
// Update the result with the interaction database entry
database.reply(interaction, 'ERROR', { 'STACK': error.stack });
}
}
else if (interaction.isSelectMenu()) {
// Get the custom id of the select menu interaction
const customId = interaction.customId.split(',')[0];
// Returns if select menu does not exits
if (!selectMenus.has(customId)) return;
// Lookup if select menu is disabled by an admin
const disabledCommand = await models.DisabledCommands.findOne({ where: { commandName: selectMenus.get(customId).linkedCommand } });
if (disabledCommand) return database.reply(interaction, 'COMMAND_DISABLED', { 'REASON': disabledCommand.reason });
try {
// Execute the individual select menu interaction
selectMenus.get(customId).execute(interaction);
}
catch (error) {
// Prints the error to the console
console.error(`Error at ${interaction.id}:\n${error.stack}`);
// Update the result with the interaction database entry
database.reply(interaction, 'ERROR', { 'STACK': error.stack });
}
}
else if (interaction.isContextMenu()) {
// Get the custom id of the context menu interaction
const customId = interaction.customId.split(',')[0];
// Returns if context menu does not exits
if (!contextMenus.has(customId)) return;
// Lookup if context menu is disabled by an admin
const disabledCommand = await models.DisabledCommands.findOne({ where: { commandName: contextMenus.get(customId).linkedCommand } });
if (disabledCommand) return database.reply(interaction, 'COMMAND_DISABLED', { 'REASON': disabledCommand.reason });
try {
// Execute the individual context menu interaction
contextMenus.get(customId).execute(interaction);
}
catch (error) {
// Prints the error to the console
console.error(`Error at ${interaction.id}:\n${error.stack}`);
// Update the result with the interaction database entry
database.reply(interaction, 'ERROR', { 'STACK': error.stack });
}
}
});
// Login to Discord with the bot's token
client.login(token);