Files
website/server/utils/discord.ts
2026-08-15 00:03:21 +02:00

82 lines
2.7 KiB
TypeScript

import { REST } from '@discordjs/rest';
import { Routes } from 'discord-api-types/v10';
import type { H3Event } from 'h3';
export type DiscordUser = {
id: string;
username: string;
discriminator: string;
avatar?: string;
};
type DiscordIds = { guildId: string; supporterRoleId: string | null; testerRoleId: string | null };
type DiscordInstance = {
rest: REST;
clientId: string;
clientSecret: string;
baseUrl: string;
ids: DiscordIds;
makeCallbackUrl: () => string;
};
let discordInstance: DiscordInstance | null = null;
export function useDiscord(event: H3Event): DiscordInstance | null {
if (!discordInstance) {
const config = useRuntimeConfig(event);
if (config.discordBotToken && config.discordGuildId && config.discordClientId && config.discordClientSecret) {
discordInstance = {
rest: new REST({ version: '10' }).setToken(config.discordBotToken),
baseUrl: 'https://discord.com/api/v10',
clientId: config.discordClientId,
clientSecret: config.discordClientSecret,
ids: {
guildId: config.discordGuildId,
testerRoleId: config.discordTesterRoleId ? config.discordTesterRoleId : null,
supporterRoleId: config.discordSupporterRoleId ? config.discordSupporterRoleId : null
},
makeCallbackUrl() {
return new URL('/account/connect/discord', config.public.baseUrl).toString();
}
};
}
}
return discordInstance;
}
export async function assignDiscordMemberSupporterRole(discord: DiscordInstance, memberId: string, roleId: string | null) {
if (discord.ids.supporterRoleId) {
await discord.rest.put(Routes.guildMemberRole(discord.ids.guildId, memberId, discord.ids.supporterRoleId));
}
if (roleId) {
await discord.rest.put(Routes.guildMemberRole(discord.ids.guildId, memberId, roleId));
}
}
export async function assignDiscordMemberTesterRole(discord: DiscordInstance, memberId: string) {
if (discord.ids.testerRoleId) {
await discord.rest.put(Routes.guildMemberRole(discord.ids.guildId, memberId, discord.ids.testerRoleId));
}
}
export async function removeDiscordMemberSupporterRole(discord: DiscordInstance, memberId: string, roleId: string | null) {
if (discord.ids.supporterRoleId) {
await discord.rest.delete(Routes.guildMemberRole(discord.ids.guildId, memberId, discord.ids.supporterRoleId));
}
if (roleId) {
await discord.rest.delete(Routes.guildMemberRole(discord.ids.guildId, memberId, roleId));
}
}
export async function removeDiscordMemberTesterRole(discord: DiscordInstance, memberId: string) {
if (discord.ids.testerRoleId) {
await discord.rest.delete(Routes.guildMemberRole(discord.ids.guildId, memberId, discord.ids.testerRoleId));
}
}
export async function getDiscordUser(discord: DiscordInstance, userId: string) {
return await discord.rest.get(Routes.user(userId)) as DiscordUser;
}