Skip to content

Commit 7e4e1b3

Browse files
committed
Changed loadVariables
1 parent 99faee4 commit 7e4e1b3

6 files changed

Lines changed: 36 additions & 43 deletions

File tree

package-lock.json

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,6 @@
2929
"dotenv": "^17.4.2",
3030
"pg": "^8.20.0",
3131
"tsx": "^4.21.0",
32-
"zod": "^4.3.6"
32+
"zod": "^4.4.3"
3333
}
3434
}

src/commands/reload.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import "../libs/loadVariables.js";
12
import {
23
SlashCommandBuilder,
34
ChatInputCommandInteraction,
@@ -8,7 +9,6 @@ import {
89
} from "discord.js";
910
import { Command } from "../libs/loadCommands.js";
1011
import { loadCommands } from "../libs/loadCommands.js";
11-
import { loadVariables } from "../libs/loadVariables.js";
1212

1313
const reloadCommand: Command = {
1414
data: new SlashCommandBuilder()
@@ -20,10 +20,9 @@ const reloadCommand: Command = {
2020
await interaction.deferReply({ flags: MessageFlags.Ephemeral });
2121

2222
try {
23-
const config = loadVariables();
2423
const client = interaction.client as Client & { commands?: Collection<string, Command> };
2524

26-
await loadCommands(client, config.clientId, config.botToken, config.guildId);
25+
await loadCommands(client, process.env.CLIENT_ID, process.env.BOT_TOKEN, process.env.GUILD_ID);
2726

2827
await interaction.editReply("Commands reloaded successfully.");
2928
} catch (error) {

src/events/guildMemberUpdate.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1+
import "../libs/loadVariables.js"
12
import { Client, EmbedBuilder, Events, GuildMember, TextChannel } from "discord.js";
2-
import { loadVariables } from "../libs/loadVariables.js";
33
import {
44
registerBoost,
55
removeBoost,
@@ -35,7 +35,6 @@ export default {
3535
};
3636

3737
async function onBoostStart(member: GuildMember): Promise<void> {
38-
const config = loadVariables();
3938
const guild = member.guild;
4039

4140
const record = await registerBoost(
@@ -50,7 +49,7 @@ async function onBoostStart(member: GuildMember): Promise<void> {
5049
await clearPendingCustomRoleDeletion(record.id);
5150
await assignLevelRoles(member, record.boostCounts ?? 1);
5251

53-
const greetChannel = guild.channels.cache.get(config.greetChannelId) as
52+
const greetChannel = guild.channels.cache.get(process.env.GREET_CHANNEL_ID) as
5453
| TextChannel
5554
| undefined;
5655
if (greetChannel) {
@@ -71,7 +70,7 @@ async function onBoostStart(member: GuildMember): Promise<void> {
7170
await greetChannel.send({ embeds: [embed] });
7271
}
7372

74-
const logChannel = guild.channels.cache.get(config.logChannelId) as
73+
const logChannel = guild.channels.cache.get(process.env.GREET_CHANNEL_ID) as
7574
| TextChannel
7675
| undefined;
7776
if (logChannel) {
@@ -104,7 +103,6 @@ async function onBoostStart(member: GuildMember): Promise<void> {
104103
}
105104

106105
async function onBoostEnd(member: GuildMember): Promise<void> {
107-
const config = loadVariables();
108106
const guild = member.guild;
109107

110108
const result = await removeBoost(member.id, guild.id);
@@ -113,7 +111,7 @@ async function onBoostEnd(member: GuildMember): Promise<void> {
113111
await removeAllLevelRoles(member);
114112
await scheduleCustomRoleDeletionAfterGrace(member.id, guild.id);
115113

116-
const logChannel = guild.channels.cache.get(config.logChannelId) as
114+
const logChannel = guild.channels.cache.get(process.env.LOG_CHANNEL_ID) as
117115
| TextChannel
118116
| undefined;
119117
if (logChannel) {

src/index.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1+
import "./libs/loadVariables.js"
12
import {
23
Client,
34
GatewayIntentBits,
45
Partials,
56
Collection
67
} from "discord.js";
78
import * as dotenv from "dotenv/config";
8-
import { loadVariables } from "./libs/loadVariables.js";
99
import { Command, loadCommands } from "./libs/loadCommands.js";
1010
import path from "path";
1111
import fs from 'fs';
@@ -16,8 +16,6 @@ const __dirname = fileURLToPath(new URL('.', import.meta.url));
1616

1717
dotenv;
1818

19-
const config = loadVariables();
20-
2119
const client = new Client({
2220
intents: [
2321
GatewayIntentBits.Guilds,
@@ -57,10 +55,10 @@ for (const file of eventFiles) {
5755
logger.startup(`Loaded event ${file.replace(/\.[jt]s$/, '')}`);
5856
}
5957

60-
await loadCommands(client, config.clientId, config.botToken, config.guildId)
58+
await loadCommands(client, process.env.CLIENT_ID, process.env.BOT_TOKEN, process.env.GUILD_ID);
6159

6260
try {
63-
client.login(config.botToken);
61+
client.login(process.env.BOT_TOKEN);
6462
} catch (err) {
6563
console.log(err)
6664
}

src/libs/loadVariables.ts

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,28 @@
1+
import { z } from "zod";
12
import { logger } from "./logger.js";
23

3-
export interface Config {
4-
botToken: string;
5-
clientId: string;
6-
guildId: string | undefined;
7-
greetChannelId: string;
8-
logChannelId: string;
9-
databaseUrl: string;
10-
}
4+
const envSchema = z.object({
5+
BOT_TOKEN: z.string().min(1),
6+
CLIENT_ID: z.string().min(1),
7+
GUILD_ID: z.string().optional(),
8+
GREET_CHANNEL_ID: z.string().min(1),
9+
LOG_CHANNEL_ID: z.string().min(1),
10+
DATABASE_URL: z.string().min(1),
11+
});
1112

12-
function requireEnv(key: string): string {
13-
const value = process.env[key];
14-
console.log("here")
15-
if (!value) {
16-
logger.fatal(`Missing required environment variable: ${key}`);
13+
declare global {
14+
namespace NodeJS {
15+
interface ProcessEnv extends z.infer<typeof envSchema> {}
1716
}
18-
return value as string;
1917
}
2018

21-
export function loadVariables(): Config {
22-
return {
23-
botToken: requireEnv("BOT_TOKEN"),
24-
clientId: requireEnv("CLIENT_ID"),
25-
guildId: process.env.GUILD_ID?.toString() ?? undefined,
26-
greetChannelId: requireEnv("GREET_CHANNEL_ID"),
27-
logChannelId: requireEnv("LOG_CHANNEL_ID"),
28-
databaseUrl: requireEnv("DATABASE_URL"),
29-
};
30-
}
19+
const result = envSchema.safeParse(process.env);
20+
21+
if (!result.success) {
22+
result.error.issues.forEach((issue) => {
23+
logger.fatal(`Missing or invalid env var: ${issue.path.join(".")}${issue.message}`);
24+
});
25+
process.exit(1);
26+
}
27+
28+
Object.assign(process.env, result.data);

0 commit comments

Comments
 (0)