Files
GSM/discord.js
2026-01-07 02:41:37 +01:00

83 lines
2.0 KiB
JavaScript

// 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';
}