require('dotenv').config(); const express = require('express'); const cors = require('cors'); const app = express(); const port = process.env.PORT || 3001; app.use(cors()); app.use(express.json()); const axios = require('axios'); app.get('/auth/discord', (req, res) => { const url = `https://discord.com/api/oauth2/authorize?client_id=${process.env.DISCORD_CLIENT_ID}&redirect_uri=${encodeURIComponent('http://localhost:3002/auth/discord/callback')}&response_type=code&scope=identify%20guilds`; res.redirect(url); }); app.get('/auth/discord/callback', async (req, res) => { const code = req.query.code; if (!code) { return res.status(400).send('No code provided'); } try { const params = new URLSearchParams(); params.append('client_id', process.env.DISCORD_CLIENT_ID); params.append('client_secret', process.env.DISCORD_CLIENT_SECRET); params.append('grant_type', 'authorization_code'); params.append('code', code); params.append('redirect_uri', 'http://localhost:3002/auth/discord/callback'); const response = await axios.post('https://discord.com/api/oauth2/token', params, { headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, }); const { access_token } = response.data; const userResponse = await axios.get('https://discord.com/api/users/@me', { headers: { Authorization: `Bearer ${access_token}`, }, }); const guildsResponse = await axios.get('https://discord.com/api/users/@me/guilds', { headers: { Authorization: `Bearer ${access_token}`, }, }); const adminGuilds = guildsResponse.data.filter(guild => (guild.permissions & 0x8) === 0x8); const user = userResponse.data; fs.readFile('db.json', 'utf8', (err, data) => { if (err) { console.error(err); user.theme = 'light'; } else { const db = JSON.parse(data); user.theme = db.users && db.users[user.id] ? db.users[user.id].theme : 'light'; } const guilds = adminGuilds; res.redirect(`http://localhost:3000/dashboard?user=${encodeURIComponent(JSON.stringify(user))}&guilds=${encodeURIComponent(JSON.stringify(guilds))}`); }); } catch (error) { console.error('Error during Discord OAuth2 callback:', error); res.status(500).send('Internal Server Error'); } }); const fs = require('fs'); app.get('/api/servers/:guildId/settings', (req, res) => { const { guildId } = req.params; fs.readFile('db.json', 'utf8', (err, data) => { if (err) { console.error(err); return res.status(500).send('Internal Server Error'); } const db = JSON.parse(data); const settings = db[guildId] || { pingCommand: false }; res.json(settings); }); }); app.post('/api/servers/:guildId/settings', (req, res) => { const { guildId } = req.params; const { pingCommand } = req.body; fs.readFile('db.json', 'utf8', (err, data) => { if (err) { console.error(err); return res.status(500).send('Internal Server Error'); } const db = JSON.parse(data); db[guildId] = { pingCommand }; fs.writeFile('db.json', JSON.stringify(db, null, 2), (err) => { if (err) { console.error(err); return res.status(500).send('Internal Server Error'); } res.json({ success: true }); }); }); }); app.get('/api/servers/:guildId/bot-status', (req, res) => { const { guildId } = req.params; const guild = bot.client.guilds.cache.get(guildId); if (guild) { res.json({ isBotInServer: true }); } else { res.json({ isBotInServer: false }); } }); app.get('/api/client-id', (req, res) => { res.json({ clientId: process.env.DISCORD_CLIENT_ID }); }); app.post('/api/user/theme', (req, res) => { const { userId, theme } = req.body; fs.readFile('db.json', 'utf8', (err, data) => { if (err) { console.error(err); return res.status(500).send('Internal Server Error'); } const db = JSON.parse(data); if (!db.users) { db.users = {}; } if (!db.users[userId]) { db.users[userId] = {}; } db.users[userId].theme = theme; fs.writeFile('db.json', JSON.stringify(db, null, 2), (err) => { if (err) { console.error(err); return res.status(500).send('Internal Server Error'); } res.json({ success: true }); }); }); }); app.get('/', (req, res) => { res.send('Hello from the backend!'); }); const bot = require('../discord-bot'); bot.login(); app.listen(port, () => { console.log(`Server is running on port ${port}`); });