import { Client, GatewayIntentBits, Partials, REST, Routes } from 'discord.js'; import { discordBotToken, discordClientID, MongoDbUrl } from './config.json'; import Collection from './util/Collection'; import DiscordInteractionCommand from './util/DiscordInteractionCommand'; import DiscordEvent from './util/DiscordEvent'; import * as DiscordInteractionCommandsIndex from './discord/commands'; import * as DiscordEventsIndex from './discord/events'; import mongoose from 'mongoose'; export const DiscordInteractionCommands: Collection = new Collection(); export const DiscordEvents: Collection = new Collection(); // Instantiates a new Discord client const discordClient = new Client({ intents: [ GatewayIntentBits.DirectMessages, GatewayIntentBits.GuildIntegrations, GatewayIntentBits.GuildPresences, GatewayIntentBits.GuildMessages, GatewayIntentBits.Guilds, GatewayIntentBits.GuildInvites, GatewayIntentBits.GuildModeration, ], partials: [ Partials.GuildMember, Partials.Message, Partials.User, Partials.Channel, ], }); const discordREST = new REST().setToken(discordBotToken); // const stripeClient = new Stripe(stripeToken, { typescript: true }); export async function main() { // Connect to the databases try { //@ts-ignore mongoose.connection.once('open', () => { console.info('[Info - Database] Connected to MongoDB'); }); // TODO: Fetch the MongoDB URI from the config file await mongoose.connect(MongoDbUrl, {}); } catch (error) { console.error(`[Error - Database] Failed to connect to MongoDB: ${error}`); process.exit(1); } // Load Discord interaction commands for (const Command of Object.values(DiscordInteractionCommandsIndex)) { const instance = new Command(); DiscordInteractionCommands.add(instance.name, instance); console.info( `[Info - Discord] Loaded interaction command: ${instance.name}` ); } // Load Discord events for (const Event of Object.values(DiscordEventsIndex)) { const instance = new Event(discordClient); DiscordEvents.add(instance.name, instance); discordClient.on(instance.name, instance.execute); console.info(`[Info - Discord] Loaded event: ${instance.name}`); } await discordClient.login(discordBotToken); try { console.log( `Started refreshing ${DiscordInteractionCommands.size} application (/) commands.` ); const interactionCommandsData = []; for (const command of DiscordInteractionCommands.values()) { interactionCommandsData.push(command.builder.toJSON()); } // The put method is used to fully refresh all commands in the guild with the current set const data = await discordREST.put( Routes.applicationCommands(discordClientID), { body: interactionCommandsData } ); console.log( `Successfully reloaded ${interactionCommandsData?.length} application (/) commands.` ); } catch (error) { // And of course, make sure you catch and log any errors! console.error(error); } } main();