const passport = require('passport'); const DiscordStrategy = require('passport-discord').Strategy; const fs = require('fs').promises; const path = require('path'); const setupFilePath = path.join(__dirname, '../data', 'setup.json'); async function loadSetupData() { try { const setupFileContent = await fs.readFile(setupFilePath, 'utf-8'); return JSON.parse(setupFileContent); } catch (err) { console.error('Error reading setup.json:', err); return null; } } async function initializePassport() { const setupData = await loadSetupData(); if (!setupData || !setupData[0]) { console.error('Setup data is not loaded or has an incorrect structure.'); return; } const discordConfig = setupData[0].discord; if (!discordConfig || !discordConfig.clientID || !discordConfig.clientSecret) { console.error('Discord configuration is missing clientID or clientSecret.'); return; } const callbackURL = `http://${setupData[0].domain}/auth/discord/callback`; passport.use(new DiscordStrategy({ clientID: discordConfig.clientID, clientSecret: discordConfig.clientSecret, callbackURL: callbackURL, scope: ['identify', 'email'] }, async (accessToken, refreshToken, profile, done) => { try { const userFilePath = path.join(__dirname, '../data', 'user.json'); const data = await fs.readFile(userFilePath, 'utf8'); let users = JSON.parse(data); let existingUser = users.find(user => user.id === profile.id); if (existingUser) { return done(null, existingUser); } const newUser = { id: profile.id, name: profile.username, role: "user" }; users.push(newUser); await fs.writeFile(userFilePath, JSON.stringify(users, null, 2), 'utf8'); done(null, newUser); } catch (err) { console.error('Error handling user data:', err); done(err); } })); passport.serializeUser((user, done) => { console.log('Serializing user:', user); done(null, user.id); }); passport.deserializeUser(async (id, done) => { try { const userFilePath = path.join(__dirname, '../data', 'user.json'); const data = await fs.readFile(userFilePath, 'utf8'); const users = JSON.parse(data); const user = users.find(user => user.id === id); if (!user) { return done(null, false, { message: 'User not found.' }); } done(null, user); } catch (err) { console.error('Error deserializing user:', err); done(err); } }); } initializePassport(); module.exports = passport;