// Discord OAuth2 Service const DISCORD_API = 'https://discord.com/api/v10'; export function getDiscordAuthUrl() { const params = new URLSearchParams({ client_id: process.env.DISCORD_CLIENT_ID, redirect_uri: process.env.DISCORD_REDIRECT_URI, response_type: 'code', scope: 'identify guilds.members.read' }); return `https://discord.com/oauth2/authorize?${params}`; } export async function exchangeCode(code) { const response = await fetch(`${DISCORD_API}/oauth2/token`, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: new URLSearchParams({ client_id: process.env.DISCORD_CLIENT_ID, client_secret: process.env.DISCORD_CLIENT_SECRET, grant_type: 'authorization_code', code, redirect_uri: process.env.DISCORD_REDIRECT_URI }) }); if (!response.ok) { const error = await response.text(); throw new Error(`Failed to exchange code: ${error}`); } return response.json(); } export async function getDiscordUser(accessToken) { const response = await fetch(`${DISCORD_API}/users/@me`, { headers: { Authorization: `Bearer ${accessToken}` } }); if (!response.ok) { throw new Error('Failed to get Discord user'); } return response.json(); } export async function getGuildMember(userId) { const response = await fetch( `${DISCORD_API}/guilds/${process.env.DISCORD_GUILD_ID}/members/${userId}`, { headers: { Authorization: `Bot ${process.env.DISCORD_BOT_TOKEN}` } } ); if (!response.ok) { if (response.status === 404) { return null; // User not in guild } throw new Error('Failed to get guild member'); } return response.json(); } export function getUserRole(memberRoles) { const adminRoleId = process.env.DISCORD_ADMIN_ROLE_ID; const modRoleId = process.env.DISCORD_MOD_ROLE_ID; if (memberRoles.includes(adminRoleId)) { return 'superadmin'; } if (memberRoles.includes(modRoleId)) { return 'moderator'; } return 'user'; }