require("dotenv").config(); const MariaDB = require('mariadb'); const fs = require('fs'); const express = require('express'); const path = require('path'); const log = require("./log") const app = express(); global.log = log; const Discord = require("discord.js") const client = new Discord.Client({intents: ["Guilds", "DirectMessages"]}) const pool = MariaDB.createPool({ host: process.env.DB_HOST, user: process.env.DB_USER, password: process.env.DB_PASS, database: process.env.DB_NAME, connectionLimit: 50 // Overkill but why not lol }); global.db_pool = pool; // For access in other files // Middleware to parse incoming JSON requests app.use(express.json()); // Middleware to log requests app.use((req, res, next) => { if (process.env.NODE_ENV === 'production') return next(); log.info('--- Incoming Request ---'); log.info(`Method: ${req.method}`); log.info(`URL: ${req.url}`); log.info('Headers:', req.headers); if (Object.keys(req.body).length > 0) { log.info('Body:', req.body); } log.info('------------------------'); next(); }); global.discord_client = client client.on("ready", async () => { log.info(`Logged into Discord as ${client.user.displayName}`); const commands = require("./commands") // Command registration log.info("Registering commands...") await (async () => { try { const rest = new Discord.REST().setToken(client.token); //Global //await rest.put(Discord.Routes.applicationGuildCommands(client.user.id, process.env.ADMIN_GUILD), { body: [] }) log.info(`Registering global commands`); rest.put(Discord.Routes.applicationCommands(client.user.id), { body: commands.global }).then(() => { log.info("Global commands registered") }).catch((error) => { log.error(error) }); //Admin // rest.put(Discord.Routes.applicationGuildCommands(client.user.id, process.env.ADMIN_GUILD), { body: commands.admin }).then(() => { // log.info("Admin commands registered") // }).catch((error) => { // log.error(error) // }); } catch (error) { log.error(error) } })(); app.listen(port, () => { log.info(`Listening on ${port}`) }) }); client.on("interactionCreate", async (interaction) => { if (!interaction.isCommand()) return; const command = require(`./commands/${interaction.commandName}`); if (!command) return; try { await command.execute(interaction); } catch (error) { log.error(error.stack); await interaction.reply({ content: 'There was an error while executing this command!', ephemeral: true }); } }); const port = process.env.SERVER_PORT || 3000; require("./migrations")(pool) .finally(() => { // Load all route modules from the 'routes' folder const routesPath = path.join(__dirname, 'routes'); fs.readdirSync(routesPath).forEach((file) => { const route = require(path.join(routesPath, file)); const routeName = `/${file.replace('.js', '')}`; // Use filename as route base app.use(routeName, route); log.info(`Using ${routeName}`) }); client.login(process.env.DISCORD_TOKEN); });