diff --git a/src/commands/mod/warn.ts b/src/commands/mod/warn.ts
index 5125587..1c5223f 100644
--- a/src/commands/mod/warn.ts
+++ b/src/commands/mod/warn.ts
@@ -14,6 +14,7 @@
         .addUserOption((option) => option.setName("user").setDescription("The user to warn").setRequired(true));
 
 const callback = async (interaction: CommandInteraction): Promise<unknown> => {
+    if (interaction.guild === null) return;
     const { log, NucleusColors, renderUser, entry } = client.logger;
     // TODO:[Modals] Replace this with a modal
     let reason: string | null = null;
@@ -37,7 +38,7 @@
             .addCustomBoolean(
                 "appeal",
                 "Create appeal ticket",
-                !(await areTicketsEnabled(interaction.guild!.id)),
+                !(await areTicketsEnabled(interaction.guild.id)),
                 async () => await create(interaction.guild!, interaction.options.getUser("user")!, interaction.user, reason),
                 "An appeal ticket will be created",
                 "CONTROL.TICKET",
@@ -64,79 +65,166 @@
         }
     } while (!timedOut && !success)
     if (timedOut) return;
-    if (confirmation.success) {
-        let dmSent = false;
-        const config = await client.database.guilds.read(interaction.guild!.id);
-        try {
-            if (notify) {
-                const messageData: {
-                    embeds: EmojiEmbed[];
-                    components: ActionRowBuilder<ButtonBuilder>[];
-                } = {
-                    embeds: [
-                        new EmojiEmbed()
-                            .setEmoji("PUNISH.WARN.RED")
-                            .setTitle("Warned")
-                            .setDescription(
-                                `You have been warned in ${interaction.guild!.name}` +
-                                    (reason ? ` for:\n> ${reason}` : ".\n*No reason was provided*") +
-                                    "\n\n" +
-                                    (createAppealTicket
-                                        ? `You can appeal this in the ticket created in <#${confirmation.components!["appeal"]!.response}>`
-                                        : "")
-                            )
-                            .setStatus("Danger")
-                    ],
-                    components: []
-                };
-                if (config.moderation.warn.text && config.moderation.warn.link) {
-                    messageData.embeds[0]!.setFooter(LinkWarningFooter)
-                    messageData.components.push(new ActionRowBuilder<Discord.ButtonBuilder>()
-                            .addComponents(new ButtonBuilder()
-                                .setStyle(ButtonStyle.Link)
-                                .setLabel(config.moderation.warn.text)
-                                .setURL(config.moderation.warn.link)
-                            )
-                    )
-                }
-                await (interaction.options.getMember("user") as GuildMember).send(messageData);
-                dmSent = true;
+    if (!confirmation.success) {
+        await interaction.editReply({
+            embeds: [
+                new EmojiEmbed()
+                    .setEmoji("PUNISH.WARN.GREEN")
+                    .setTitle("Warn")
+                    .setDescription("No changes were made")
+                    .setStatus("Success")
+            ],
+            components: []
+        });
+        return;
+    }
+    let dmSent = false;
+    const config = await client.database.guilds.read(interaction.guild.id);
+    try {
+        if (notify) {
+            const messageData: {
+                embeds: EmojiEmbed[];
+                components: ActionRowBuilder<ButtonBuilder>[];
+            } = {
+                embeds: [
+                    new EmojiEmbed()
+                        .setEmoji("PUNISH.WARN.RED")
+                        .setTitle("Warned")
+                        .setDescription(
+                            `You have been warned in ${interaction.guild.name}` +
+                                (reason ? ` for:\n> ${reason}` : ".\n*No reason was provided*") +
+                                "\n\n" +
+                                (createAppealTicket
+                                    ? `You can appeal this in the ticket created in <#${confirmation.components!["appeal"]!.response}>`
+                                    : "")
+                        )
+                        .setStatus("Danger")
+                ],
+                components: []
+            };
+            if (config.moderation.warn.text && config.moderation.warn.link) {
+                messageData.embeds[0]!.setFooter(LinkWarningFooter)
+                messageData.components.push(new ActionRowBuilder<Discord.ButtonBuilder>()
+                        .addComponents(new ButtonBuilder()
+                            .setStyle(ButtonStyle.Link)
+                            .setLabel(config.moderation.warn.text)
+                            .setURL(config.moderation.warn.link)
+                        )
+                )
             }
-        } catch (e) {
-            dmSent = false;
+            await (interaction.options.getMember("user") as GuildMember).send(messageData);
+            dmSent = true;
         }
-        const data = {
-            meta: {
-                type: "memberWarn",
-                displayName: "Member warned",
-                calculateType: "guildMemberPunish",
-                color: NucleusColors.yellow,
-                emoji: "PUNISH.WARN.YELLOW",
-                timestamp: new Date().getTime()
-            },
-            list: {
-                user: entry(
-                    (interaction.options.getMember("user") as GuildMember).user.id,
-                    renderUser((interaction.options.getMember("user") as GuildMember).user)
-                ),
-                warnedBy: entry(interaction.member!.user.id, renderUser(interaction.member!.user as Discord.User)),
-                reason: reason ? `\n> ${reason}` : "*No reason provided*"
-            },
-            hidden: {
-                guild: interaction.guild!.id
-            }
-        };
-        await client.database.history.create(
-            "warn",
-            interaction.guild!.id,
-            (interaction.options.getMember("user") as GuildMember).user,
-            interaction.user,
-            reason
-        );
-        log(data);
-        const failed = !dmSent && notify;
-        if (!failed) {
-            await interaction.editReply({
+    } catch (e) {
+        dmSent = false;
+    }
+    const data = {
+        meta: {
+            type: "memberWarn",
+            displayName: "Member warned",
+            calculateType: "guildMemberPunish",
+            color: NucleusColors.yellow,
+            emoji: "PUNISH.WARN.YELLOW",
+            timestamp: new Date().getTime()
+        },
+        list: {
+            user: entry(
+                (interaction.options.getMember("user") as GuildMember).user.id,
+                renderUser((interaction.options.getMember("user") as GuildMember).user)
+            ),
+            warnedBy: entry(interaction.member!.user.id, renderUser(interaction.member!.user as Discord.User)),
+            reason: reason ? `\n> ${reason}` : "*No reason provided*"
+        },
+        hidden: {
+            guild: interaction.guild.id
+        }
+    };
+    await client.database.history.create(
+        "warn",
+        interaction.guild.id,
+        (interaction.options.getMember("user") as GuildMember).user,
+        interaction.user,
+        reason
+    );
+    log(data);
+    const failed = !dmSent && notify;
+    if (!failed) {
+        await interaction.editReply({
+            embeds: [
+                new EmojiEmbed()
+                    .setEmoji("PUNISH.WARN.GREEN")
+                    .setTitle("Warn")
+                    .setDescription(
+                        "The user was warned" +
+                            (createAppealTicket
+                                ? ` and an appeal ticket was opened in <#${confirmation.components!["appeal"]!.response}>`
+                                : "")
+                    )
+                    .setStatus("Success")
+            ],
+            components: []
+        });
+    } else {
+        const canSeeChannel = (interaction.options.getMember("user") as GuildMember)
+            .permissionsIn(interaction.channel as Discord.TextChannel)
+            .has("ViewChannel");
+        const m = (await interaction.editReply({
+            embeds: [
+                new EmojiEmbed()
+                    .setEmoji("PUNISH.WARN.RED")
+                    .setTitle("Warn")
+                    .setDescription("The user's DMs are not open\n\nWhat would you like to do?")
+                    .setStatus("Danger")
+            ],
+            components: [
+                new ActionRowBuilder<Discord.ButtonBuilder>().addComponents(
+                    new Discord.ButtonBuilder().setCustomId("log").setLabel("Ignore and log").setStyle(ButtonStyle.Secondary),
+                    new Discord.ButtonBuilder()
+                        .setCustomId("here")
+                        .setLabel("Warn here")
+                        .setStyle(canSeeChannel ? ButtonStyle.Primary : ButtonStyle.Secondary)
+                        .setDisabled(!canSeeChannel),
+                    new Discord.ButtonBuilder()
+                        .setCustomId("ticket")
+                        .setLabel("Create ticket")
+                        .setStyle(canSeeChannel ? ButtonStyle.Primary : ButtonStyle.Secondary)
+                        .setDisabled(createAppealTicket)
+                )
+            ]
+        })) as Discord.Message;
+        let component;
+        try {
+            component = await m.awaitMessageComponent({
+                filter: (m) => m.user.id === interaction.user.id,
+                time: 300000
+            });
+        } catch (e) {
+            return await interaction.editReply({
+                embeds: [
+                    new EmojiEmbed()
+                        .setEmoji("PUNISH.WARN.GREEN")
+                        .setTitle("Warn")
+                        .setDescription("No changes were made")
+                        .setStatus("Success")
+                ],
+                components: []
+            });
+        }
+        if (component.customId === "here") {
+            await interaction.channel!.send({
+                embeds: [
+                    new EmojiEmbed()
+                        .setEmoji("PUNISH.WARN.RED")
+                        .setTitle("Warn")
+                        .setDescription("You have been warned" + (reason ? ` for:\n> ${reason}` : "."))
+                        .setStatus("Danger")
+                ],
+                content: `<@!${(interaction.options.getMember("user") as GuildMember).id}>`,
+                allowedMentions: {
+                    users: [(interaction.options.getMember("user") as GuildMember).id]
+                }
+            });
+            return await interaction.editReply({
                 embeds: [
                     new EmojiEmbed()
                         .setEmoji("PUNISH.WARN.GREEN")
@@ -151,139 +239,53 @@
                 ],
                 components: []
             });
-        } else {
-            const canSeeChannel = (interaction.options.getMember("user") as GuildMember)
-                .permissionsIn(interaction.channel as Discord.TextChannel)
-                .has("ViewChannel");
-            const m = (await interaction.editReply({
+        } else if (component.customId === "log") {
+            await interaction.editReply({
                 embeds: [
                     new EmojiEmbed()
-                        .setEmoji("PUNISH.WARN.RED")
+                        .setEmoji("PUNISH.WARN.GREEN")
                         .setTitle("Warn")
-                        .setDescription("The user's DMs are not open\n\nWhat would you like to do?")
-                        .setStatus("Danger")
+                        .setDescription("The warn was logged")
+                        .setStatus("Success")
                 ],
-                components: [
-                    new ActionRowBuilder<Discord.ButtonBuilder>().addComponents(
-                        new Discord.ButtonBuilder().setCustomId("log").setLabel("Ignore and log").setStyle(ButtonStyle.Secondary),
-                        new Discord.ButtonBuilder()
-                            .setCustomId("here")
-                            .setLabel("Warn here")
-                            .setStyle(canSeeChannel ? ButtonStyle.Primary : ButtonStyle.Secondary)
-                            .setDisabled(!canSeeChannel),
-                        new Discord.ButtonBuilder()
-                            .setCustomId("ticket")
-                            .setLabel("Create ticket")
-                            .setStyle(canSeeChannel ? ButtonStyle.Primary : ButtonStyle.Secondary)
-                            .setDisabled(createAppealTicket)
-                    )
-                ]
-            })) as Discord.Message;
-            let component;
-            try {
-                component = await m.awaitMessageComponent({
-                    filter: (m) => m.user.id === interaction.user.id,
-                    time: 300000
-                });
-            } catch (e) {
+                components: []
+            });
+        } else if (component.customId === "ticket") {
+            const ticketChannel = await create(
+                interaction.guild,
+                interaction.options.getUser("user")!,
+                interaction.user,
+                reason,
+                "Warn Notification"
+            );
+            if (ticketChannel === null) {
                 return await interaction.editReply({
                     embeds: [
                         new EmojiEmbed()
-                            .setEmoji("PUNISH.WARN.GREEN")
-                            .setTitle("Warn")
-                            .setDescription("No changes were made")
-                            .setStatus("Success")
-                    ],
-                    components: []
-                });
-            }
-            if (component.customId === "here") {
-                await interaction.channel!.send({
-                    embeds: [
-                        new EmojiEmbed()
                             .setEmoji("PUNISH.WARN.RED")
                             .setTitle("Warn")
-                            .setDescription("You have been warned" + (reason ? ` for:\n> ${reason}` : "."))
+                            .setDescription("A ticket could not be created")
                             .setStatus("Danger")
                     ],
-                    content: `<@!${(interaction.options.getMember("user") as GuildMember).id}>`,
-                    allowedMentions: {
-                        users: [(interaction.options.getMember("user") as GuildMember).id]
-                    }
-                });
-                return await interaction.editReply({
-                    embeds: [
-                        new EmojiEmbed()
-                            .setEmoji("PUNISH.WARN.GREEN")
-                            .setTitle("Warn")
-                            .setDescription(
-                                "The user was warned" +
-                                    (createAppealTicket
-                                        ? ` and an appeal ticket was opened in <#${confirmation.components!["appeal"]!.response}>`
-                                        : "")
-                            )
-                            .setStatus("Success")
-                    ],
-                    components: []
-                });
-            } else if (component.customId === "log") {
-                await interaction.editReply({
-                    embeds: [
-                        new EmojiEmbed()
-                            .setEmoji("PUNISH.WARN.GREEN")
-                            .setTitle("Warn")
-                            .setDescription("The warn was logged")
-                            .setStatus("Success")
-                    ],
-                    components: []
-                });
-            } else if (component.customId === "ticket") {
-                const ticketChannel = await create(
-                    interaction.guild!,
-                    interaction.options.getUser("user")!,
-                    interaction.user,
-                    reason,
-                    "Warn Notification"
-                );
-                if (ticketChannel === null) {
-                    return await interaction.editReply({
-                        embeds: [
-                            new EmojiEmbed()
-                                .setEmoji("PUNISH.WARN.RED")
-                                .setTitle("Warn")
-                                .setDescription("A ticket could not be created")
-                                .setStatus("Danger")
-                        ],
-                        components: []
-                    });
-                }
-                await interaction.editReply({
-                    embeds: [
-                        new EmojiEmbed()
-                            .setEmoji("PUNISH.WARN.GREEN")
-                            .setTitle("Warn")
-                            .setDescription(`A ticket was created in <#${ticketChannel}>`)
-                            .setStatus("Success")
-                    ],
                     components: []
                 });
             }
+            await interaction.editReply({
+                embeds: [
+                    new EmojiEmbed()
+                        .setEmoji("PUNISH.WARN.GREEN")
+                        .setTitle("Warn")
+                        .setDescription(`A ticket was created in <#${ticketChannel}>`)
+                        .setStatus("Success")
+                ],
+                components: []
+            });
         }
-    } else {
-        await interaction.editReply({
-            embeds: [
-                new EmojiEmbed()
-                    .setEmoji("PUNISH.WARN.GREEN")
-                    .setTitle("Warn")
-                    .setDescription("No changes were made")
-                    .setStatus("Success")
-            ],
-            components: []
-        });
     }
 };
 
 const check = (interaction: CommandInteraction) => {
+    if (!interaction.guild) return;
     const member = interaction.member as GuildMember;
     const apply = interaction.options.getMember("user") as GuildMember | null;
     if (apply === null) throw new Error("That member is not in the server");
@@ -292,7 +294,7 @@
     // Do not allow warning bots
     if (member.user.bot) throw new Error("I cannot warn bots");
     // Allow the owner to warn anyone
-    if (member.id === interaction.guild!.ownerId) return true;
+    if (member.id === interaction.guild.ownerId) return true;
     // Check if the user has moderate_members permission
     if (!member.permissions.has("ModerateMembers"))
         throw new Error("You do not have the *Moderate Members* permission");
