diff --git a/.gitignore b/.gitignore index 3c0bb3d..40fb450 100644 --- a/.gitignore +++ b/.gitignore @@ -28,7 +28,7 @@ yarn-error.log* # local env files .env*.local -.env.prod +.env.production # vercel .vercel diff --git a/app/api/interactions/route.ts b/app/api/interactions/route.ts index d332df3..73da142 100644 --- a/app/api/interactions/route.ts +++ b/app/api/interactions/route.ts @@ -3,17 +3,17 @@ import { InteractionType, } from "discord-api-types/v10"; import { Bot } from "@/app/lib/discord/bot"; -import { discordClientPublicKey, discordToken } from "@/app/envs"; +import { getEnvironment } from "../../../envs"; import createClient from "edgedb"; import { verifyInteractionRequest } from "@/app/lib/discord/verify-interaction-request"; -const bot = new Bot(createClient(), discordToken); +const bot = new Bot(createClient(), getEnvironment().discordToken); await bot.initialize(); export async function POST(req: Request) { const verifyResult = await verifyInteractionRequest( req, - discordClientPublicKey + getEnvironment().discordClientPublicKey ); if (!verifyResult.isValid || !verifyResult.interaction) { diff --git a/app/envs.ts b/app/envs.ts deleted file mode 100644 index 5c6c14d..0000000 --- a/app/envs.ts +++ /dev/null @@ -1,30 +0,0 @@ -if (!process.env.DISCORD_CLIENT_ID) { - throw new Error("DISCORD_CLIENT_ID env var not configured"); -} -export const discordClientId = process.env.DISCORD_CLIENT_ID; - -if (!process.env.DISCORD_CLIENT_PUBLIC_KEY) { - throw new Error("DISCORD_CLIENT_PUBLIC_KEY env var not configured"); -} -export const discordClientPublicKey = process.env.DISCORD_CLIENT_PUBLIC_KEY; - -if (!process.env.DISCORD_TOKEN) { - throw new Error(`DISCORD_TOKEN env var not configured`); -} -export const discordToken = process.env.DISCORD_TOKEN; - -if (!process.env.DISCORD_GUILD_ID) { - throw new Error("DISCORD_GUILD_ID env var not configured"); -} -export const discordGuildId = process.env.DISCORD_GUILD_ID; - -if (!process.env.DISCORD_MODERATION_ACCESS_ROLES) { - throw new Error("DISCORD_MODERATION_ACCESS_ROLES env var not configured"); -} -export const authorizedRoleIds = - process.env.DISCORD_MODERATION_ACCESS_ROLES.split(","); - -if (!process.env.REVIEW_CHANNEL_ID) { - throw new Error("REVIEW_CHANNEL_ID env var not configured"); -} -export const reviewChannelId = process.env.REVIEW_CHANNEL_ID; diff --git a/app/lib/discord/auth.ts b/app/lib/discord/auth.ts index f9670b6..ebf735d 100644 --- a/app/lib/discord/auth.ts +++ b/app/lib/discord/auth.ts @@ -3,7 +3,7 @@ import { REST } from "@discordjs/rest"; import { Routes, APIGuildMember, APIUser } from "discord-api-types/v10"; import { client } from "../../lib/edgedb"; -import { discordGuildId, authorizedRoleIds } from "@/app/envs"; +import { getEnvironment } from "../../../envs"; import { getCurrentUser } from "./queries/getCurrentUser.query"; export async function discordSignin({ @@ -18,14 +18,18 @@ export async function discordSignin({ ); const discordUser = (await discordClient.get( - Routes.userGuildMember(discordGuildId) + Routes.userGuildMember(getEnvironment().discordGuildId) )) as APIGuildMember; if (!discordUser) { throw new Error("No guild member information for user"); } - if (!discordUser.roles.some((role) => authorizedRoleIds.includes(role))) { + if ( + !discordUser.roles.some((role) => + getEnvironment().authorizedRoleIds.includes(role) + ) + ) { throw new Error("Discord user does not have any authorized roles"); } diff --git a/app/lib/discord/bot.ts b/app/lib/discord/bot.ts index 3ee25a6..ce189a3 100644 --- a/app/lib/discord/bot.ts +++ b/app/lib/discord/bot.ts @@ -14,7 +14,7 @@ import { REST, RESTOptions } from "@discordjs/rest"; import { Client } from "edgedb"; import { InteractionPromise } from "./interactionPromise"; import { getHelpChannels } from "./queries/getHelpChannels.query"; -import { discordClientId } from "@/app/envs"; +import { getEnvironment } from "../../../envs"; export class Bot extends REST { public readonly edgedb: Client; @@ -27,7 +27,7 @@ export class Bot extends REST { constructor(edgedb: Client, token: string, options?: Partial<RESTOptions>) { super(options); - this.applicationId = discordClientId; + this.applicationId = getEnvironment().discordClientId; this.edgedb = edgedb; this.token = token; diff --git a/app/lib/discord/utils/reviewCard.ts b/app/lib/discord/utils/reviewCard.ts index f4790c7..1ae5288 100644 --- a/app/lib/discord/utils/reviewCard.ts +++ b/app/lib/discord/utils/reviewCard.ts @@ -6,7 +6,7 @@ import { } from "discord-api-types/v10"; import { Bot } from "../bot"; import { SuggestThreadReturns } from "../queries/suggestThread.query"; -import { reviewChannelId } from "@/app/envs"; +import { getEnvironment } from "../../../../envs"; const createReviewCard = async ( bot: Bot, @@ -34,6 +34,9 @@ const createReviewCard = async ( ], color: 0x0ccb93, }; + + const reviewChannelId = getEnvironment().reviewChannelId; + const message = (await bot.post(Routes.channelMessages(reviewChannelId), { body: { embeds: [embed], diff --git a/envs.ts b/envs.ts new file mode 100644 index 0000000..6128a36 --- /dev/null +++ b/envs.ts @@ -0,0 +1,58 @@ +export interface Environment { + discordClientId: string; + discordClientPublicKey: string; + discordToken: string; + discordGuildId: string; + authorizedRoleIds: string[]; + reviewChannelId: string; +} + +let environment: Environment | null = null; + +export function getEnvironment(): Environment { + if (environment) { + return environment; + } + + if (!process.env.DISCORD_CLIENT_ID) { + throw new Error("DISCORD_CLIENT_ID env var not configured"); + } + const discordClientId = process.env.DISCORD_CLIENT_ID; + + if (!process.env.DISCORD_CLIENT_PUBLIC_KEY) { + throw new Error("DISCORD_CLIENT_PUBLIC_KEY env var not configured"); + } + const discordClientPublicKey = process.env.DISCORD_CLIENT_PUBLIC_KEY; + + if (!process.env.DISCORD_TOKEN) { + throw new Error(`DISCORD_TOKEN env var not configured`); + } + const discordToken = process.env.DISCORD_TOKEN; + + if (!process.env.DISCORD_GUILD_ID) { + throw new Error("DISCORD_GUILD_ID env var not configured"); + } + const discordGuildId = process.env.DISCORD_GUILD_ID; + + if (!process.env.DISCORD_MODERATION_ACCESS_ROLES) { + throw new Error("DISCORD_MODERATION_ACCESS_ROLES env var not configured"); + } + const authorizedRoleIds = + process.env.DISCORD_MODERATION_ACCESS_ROLES.split(","); + + if (!process.env.REVIEW_CHANNEL_ID) { + throw new Error("REVIEW_CHANNEL_ID env var not configured"); + } + const reviewChannelId = process.env.REVIEW_CHANNEL_ID; + + environment = { + discordClientId, + discordClientPublicKey, + discordToken, + discordGuildId, + authorizedRoleIds, + reviewChannelId, + }; + + return environment; +}