import { getEnv } from '@/lib/env' const DISCORD_API = 'https://discord.com/api/v10' export type GuildMember = { userId: string roleIds: string[] nickname: string | null } /** * Fragt die Mitgliedschaft **serverseitig mit dem Bot-Token** ab. * * Das Zugangstoken des Nutzers aus dem OAuth-Ablauf wird dafür bewusst nicht * benutzt und nach dem Callback verworfen: OAuth klärt, wer jemand ist, der Bot * klärt, was er darf. Siehe docs/03-auth-und-rechte.md. * * `null` bedeutet: kein Mitglied der Guild. Ein Fehler der Discord-API wird * geworfen, damit ein Ausfall nicht wie eine abgelehnte Anmeldung aussieht. */ export async function fetchGuildMember(userId: string): Promise { const env = getEnv() const response = await fetch(`${DISCORD_API}/guilds/${env.DISCORD_GUILD_ID}/members/${userId}`, { headers: { authorization: `Bot ${env.DISCORD_BOT_TOKEN}` }, cache: 'no-store', }) if (response.status === 404) return null if (!response.ok) { throw new Error(`Discord-API antwortete mit ${response.status}`) } const body = (await response.json()) as { roles?: string[]; nick?: string | null } return { userId, roleIds: body.roles ?? [], nickname: body.nick ?? null, } }