159 lines
6.4 KiB
JavaScript
159 lines
6.4 KiB
JavaScript
require("dotenv").config();
|
|
const sqlite3 = require('sqlite3').verbose();
|
|
const db = new sqlite3.Database(process.env.DB_PATH || 'database.db');
|
|
|
|
require('./migrations')(db).then(() => {
|
|
console.log('All migrations completed successfully');
|
|
}).catch(err => {
|
|
console.error('Error running migrations:', err);
|
|
});
|
|
|
|
const Discord = require("discord.js");
|
|
|
|
const fs = require('fs');
|
|
const path = require("path");
|
|
|
|
const client = new Discord.Client({
|
|
intents: [
|
|
Discord.IntentsBitField.Flags.Guilds,
|
|
Discord.IntentsBitField.Flags.GuildModeration,
|
|
Discord.IntentsBitField.Flags.GuildMembers
|
|
]
|
|
})
|
|
|
|
|
|
// Presence Loop
|
|
var presenceCounter = 0;
|
|
var presenceInterval = 60; // Default to 60 seconds, can be adjusted in presence.json
|
|
const presenceLoop = () => {
|
|
console.log("Doing presence update...");
|
|
try {
|
|
const presenceConfig = JSON.parse(fs.readFileSync('presence.json', 'utf8'));
|
|
if (!presenceConfig.presenceList || !Array.isArray(presenceConfig.presenceList) || presenceConfig.presenceList.length === 0) {
|
|
console.warn('Presence list is empty or not defined in presence.json');
|
|
return;
|
|
}
|
|
if (!presenceConfig.presenceList[presenceCounter]) {
|
|
presenceCounter = 0; // Reset counter if out of bounds
|
|
}
|
|
presenceInterval = presenceConfig.interval || 60; // Use interval from config or default to 60 seconds
|
|
console.log(`Setting presence to: ${presenceConfig.presenceList[presenceCounter]}; Counter: ${presenceCounter}; Waiting ${presenceInterval} seconds for next update...`);
|
|
client.user.setPresence({
|
|
activities: [
|
|
{
|
|
name: presenceConfig.presenceList[presenceCounter],
|
|
type: Discord.ActivityType.Custom
|
|
}
|
|
]
|
|
});
|
|
|
|
if (presenceConfig.random) {
|
|
console.log("Random presence enabled, selecting a random presence for next update.");
|
|
presenceCounter = Math.floor(Math.random() * presenceConfig.presenceList.length);
|
|
} else {
|
|
presenceCounter++;
|
|
}
|
|
} catch (err) {
|
|
console.error('Failed to load presence config:', err);
|
|
}
|
|
setTimeout(presenceLoop, presenceInterval * 1000); // Wait for the specified interval before next update
|
|
}
|
|
|
|
client.once("ready", async () => {
|
|
console.log(`Logged in as ${client.user.username} (${client.user.id})`);
|
|
|
|
// Register commands
|
|
const commands = require("./commands.js")
|
|
await (async () => {
|
|
const rest = new Discord.REST({ version: '10' }).setToken(client.token);
|
|
try {
|
|
//Global
|
|
console.log(`Registering global commands`);
|
|
await rest.put(Discord.Routes.applicationCommands(client.user.id), { body: commands.globalCommands })
|
|
console.log(`Registered global commands successfully`);
|
|
} catch (error) {
|
|
console.error(error);
|
|
}
|
|
|
|
if (process.env.REFRESH_ADMIN_GUILD_COMMANDS === 'true') {
|
|
// Unregister guild commands from all guilds
|
|
try {
|
|
console.log(`Unregistering guild commands from all guilds`);
|
|
const guilds = await client.guilds.fetch();
|
|
console.log(`Found ${guilds.size} guilds to unregister commands from`);
|
|
if (guilds.size === 0) {
|
|
console.log(`No guilds found, skipping unregistration`);
|
|
return;
|
|
}
|
|
for (const guild of guilds.values()) {
|
|
await rest.put(Discord.Routes.applicationGuildCommands(client.user.id, guild.id), { body: [] });
|
|
}
|
|
console.log(`Unregistered guild commands from all guilds successfully`);
|
|
} catch (error) {
|
|
console.error(error);
|
|
}
|
|
|
|
try {
|
|
//Guild
|
|
console.log(`Registering guild commands for admin guild`);
|
|
await rest.put(Discord.Routes.applicationGuildCommands(client.user.id, process.env.ADMIN_GUILD), { body: commands.adminGuildCommands })
|
|
console.log(`Registered guild commands for admin guild successfully`);
|
|
} catch (error) {
|
|
console.error(error);
|
|
}
|
|
}
|
|
})();
|
|
|
|
presenceLoop();
|
|
});
|
|
|
|
client.on("error", (error) => {
|
|
console.error("An error occurred:", error);
|
|
});
|
|
|
|
client.on("interactionCreate", async (interaction) => {
|
|
switch (interaction.type) {
|
|
case Discord.InteractionType.ApplicationCommand:
|
|
const command = require(`./interactions/commands/${interaction.commandName}.js`);
|
|
if (command) {
|
|
try {
|
|
await command.execute(interaction, db, client);
|
|
} catch (error) {
|
|
console.error(`Error executing command ${interaction.commandName}:`, error);
|
|
await interaction.reply({ content: 'There was an error while executing this command!', ephemeral: true });
|
|
}
|
|
} else {
|
|
console.warn(`Command ${interaction.commandName} not found.`);
|
|
await interaction.reply({ content: 'This command does not exist.', ephemeral: true });
|
|
}
|
|
break;
|
|
case Discord.InteractionType.ModalSubmit:
|
|
const modal = require(`./interactions/modals/${interaction.customId}.js`)(interaction, db, client);
|
|
if (modal) {
|
|
try {
|
|
await modal.execute();
|
|
} catch (error) {
|
|
console.error(`Error executing modal ${interaction.customId}:`, error);
|
|
await interaction.reply({ content: 'There was an error while processing this modal!', ephemeral: true });
|
|
}
|
|
} else {
|
|
console.warn(`Modal ${interaction.customId} not found.`);
|
|
await interaction.reply({ content: 'This modal does not exist.', ephemeral: true });
|
|
}
|
|
break;
|
|
default:
|
|
console.warn(`Unhandled interaction type: ${interaction.type}`);
|
|
await interaction.reply({ content: 'This interaction type is not supported.', ephemeral: true });
|
|
break;
|
|
}
|
|
});
|
|
|
|
client.on("guildMemberAdd", async (member) => {
|
|
require("./eventHandlers/guildMemberAdd.js")(member, db, client);
|
|
});
|
|
|
|
client.login(process.env.TOKEN).then(() => {
|
|
console.log("Bot is online!");
|
|
}).catch(err => {
|
|
console.error("Failed to log in:", err);
|
|
}); |