Skip to content

Commit 80fdf67

Browse files
authored
feat: add guildCreate event and server guard utilities (#16)
* feat: add guildCreate event and server guard utilities * fix: update ephemeral reply flag to use MessageFlags.Ephemeral for better compatibility with Discord.js
1 parent 21e704d commit 80fdf67

File tree

5 files changed

+61
-1
lines changed

5 files changed

+61
-1
lines changed

src/events/guild-create.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { Events } from 'discord.js';
2+
import { createEvent } from '../util/events.js';
3+
import { leaveIfNotAllowedServer } from '../util/server-guard.js';
4+
5+
export const guildCreateEvent = createEvent(
6+
{
7+
name: Events.GuildCreate,
8+
},
9+
async (guild) => {
10+
// Leave the server if it's not the allowed one
11+
await leaveIfNotAllowedServer(guild);
12+
}
13+
);

src/events/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { guildCreateEvent } from './guild-create.js';
12
import { hasVarEvent } from './has-var.js';
23
import { interactionCreateEvent } from './interaction-create.js';
34
import { justAskEvent } from './just-ask.js';
@@ -6,6 +7,7 @@ import type { DiscordEvent } from './types.js';
67

78
export const events = [
89
readyEvent,
10+
guildCreateEvent,
911
justAskEvent,
1012
hasVarEvent,
1113
interactionCreateEvent,

src/events/interaction-create.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,26 @@
1-
import { Events } from 'discord.js';
1+
import { Events, MessageFlags } from 'discord.js';
22
import { commands } from '../commands/index.js';
33
import { createEvent } from '../util/events.js';
4+
import { isAllowedServer } from '../util/server-guard.js';
45

56
export const interactionCreateEvent = createEvent(
67
{
78
name: Events.InteractionCreate,
89
},
910
async (interaction) => {
1011
if (interaction.isChatInputCommand() || interaction.isMessageContextMenuCommand()) {
12+
// Block commands from unauthorized servers
13+
if (!interaction.guildId || !isAllowedServer(interaction.guildId)) {
14+
console.log(`⚠️ Command blocked from unauthorized server: ${interaction.guildId}`);
15+
if (interaction.isRepliable()) {
16+
await interaction.reply({
17+
content: '❌ This bot is not authorized to operate in this server.',
18+
flags: MessageFlags.Ephemeral,
19+
});
20+
}
21+
return;
22+
}
23+
1124
console.log(`Interaction received: ${interaction.commandName}`);
1225
const command = commands.get(interaction.commandName);
1326

src/events/ready.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { config } from '../env.js';
33
import { fetchAndCachePublicChannelsMessages } from '../util/cache.js';
44
import { createEvent } from '../util/events.js';
55
import { syncGuidesToChannel } from '../util/post-guides.js';
6+
import { leaveIfNotAllowedServer } from '../util/server-guard.js';
67

78
export const readyEvent = createEvent(
89
{
@@ -11,6 +12,13 @@ export const readyEvent = createEvent(
1112
},
1213
async (client) => {
1314
console.log(`Ready! Logged in as ${client.user.tag}`);
15+
16+
// Check all guilds and leave any unauthorized ones
17+
console.log(`🔍 Checking ${client.guilds.cache.size} guild(s)...`);
18+
for (const guild of client.guilds.cache.values()) {
19+
await leaveIfNotAllowedServer(guild);
20+
}
21+
1422
if (config.fetchAndSyncMessages) {
1523
const guild = client.guilds.cache.get(config.serverId);
1624
if (guild) {

src/util/server-guard.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import type { Guild } from 'discord.js';
2+
import { config } from '../env.js';
3+
4+
/**
5+
* Checks if a guild is the allowed server
6+
*/
7+
export function isAllowedServer(guildId: string): boolean {
8+
return guildId === config.serverId;
9+
}
10+
11+
/**
12+
* Leaves a guild if it's not the allowed server
13+
* @returns true if the bot left the guild, false if it stayed
14+
*/
15+
export async function leaveIfNotAllowedServer(guild: Guild): Promise<boolean> {
16+
if (!isAllowedServer(guild.id)) {
17+
console.log(`⚠️ Bot added to unauthorized server: ${guild.name} (${guild.id})`);
18+
console.log(`🚪 Leaving server...`);
19+
await guild.leave();
20+
console.log(`✅ Left unauthorized server: ${guild.name}`);
21+
return true;
22+
}
23+
return false;
24+
}

0 commit comments

Comments
 (0)