diff --git a/src/commands/mod/ban.ts b/src/commands/mod/ban.ts
index 5f4f41c..6deb4ad 100644
--- a/src/commands/mod/ban.ts
+++ b/src/commands/mod/ban.ts
@@ -1,10 +1,11 @@
-import { CommandInteraction, GuildMember, ActionRowBuilder, ButtonBuilder, User, ButtonStyle } from "discord.js";
+import Discord, { CommandInteraction, GuildMember, ActionRowBuilder, ButtonBuilder, User, ButtonStyle } from "discord.js";
 import type { SlashCommandSubcommandBuilder } from "@discordjs/builders";
 import confirmationMessage from "../../utils/confirmationMessage.js";
 import EmojiEmbed from "../../utils/generateEmojiEmbed.js";
 import keyValueList from "../../utils/generateKeyValueList.js";
 import addPlurals from "../../utils/plurals.js";
 import client from "../../utils/client.js";
+import { LinkWarningFooter } from "../../utils/defaultEmbeds.js";
 
 
 const command = (builder: SlashCommandSubcommandBuilder) =>
@@ -12,11 +13,10 @@
         .setName("ban")
         .setDescription("Bans a user from the server")
         .addUserOption((option) => option.setName("user").setDescription("The user to ban").setRequired(true))
-        .addStringOption((option) => option.setName("reason").setDescription("The reason for the ban").setRequired(false))
         .addNumberOption((option) =>
             option
                 .setName("delete")
-                .setDescription("The days of messages to delete | Default: 0")
+                .setDescription("Delete this number of days of messages from the user | Default: 0")
                 .setMinValue(0)
                 .setMaxValue(7)
                 .setRequired(false)
@@ -42,9 +42,8 @@
                 }) +
                     `The user **will${notify ? "" : " not"}** be notified\n` +
                     `${addPlurals(
-                        (interaction.options.get("delete")?.value as number | null) ?? 0,
-                        "day"
-                    )} of messages will be deleted\n\n` +
+                        (interaction.options.get("delete")?.value as number | null) ?? 0, "day")
+                    } of messages will be deleted\n\n` +
                     `Are you sure you want to ban <@!${(interaction.options.getMember("user") as GuildMember).id}>?`
             )
             .addCustomBoolean(
@@ -52,7 +51,7 @@
                 "Notify user",
                 false,
                 undefined,
-                null,
+                "The user will be sent a DM",
                 "ICONS.NOTIFY." + (notify ? "ON" : "OFF"),
                 notify
             )
@@ -68,12 +67,15 @@
     if (timedOut) return;
     if (confirmation.success) {
         reason = reason.length ? reason : null
-        let dmd = false;
-        let dm;
+        let dmSent = false;
+        let dmMessage;
         const config = await client.database.guilds.read(interaction.guild!.id);
         try {
             if (notify) {
-                dm = await (interaction.options.getMember("user") as GuildMember).send({
+                const messageData: {
+                    embeds: EmojiEmbed[];
+                    components: ActionRowBuilder<ButtonBuilder>[];
+                } = {
                     embeds: [
                         new EmojiEmbed()
                             .setEmoji("PUNISH.BAN.RED")
@@ -83,25 +85,30 @@
                             )
                             .setStatus("Danger")
                     ],
-                    components: config.moderation.ban.text ? [
-                        new ActionRowBuilder().addComponents([
-                            new ButtonBuilder()
+                    components: []
+                };
+                if (config.moderation.ban.text && config.moderation.ban.link) {
+                    messageData.embeds[0]!.setFooter(LinkWarningFooter)
+                    messageData.components.push(new ActionRowBuilder<Discord.ButtonBuilder>()
+                            .addComponents(new ButtonBuilder()
                                 .setStyle(ButtonStyle.Link)
                                 .setLabel(config.moderation.ban.text)
-                                .setURL(config.moderation.ban.link!)
-                        ])
-                    ] : []
-                });
-                dmd = true;
+                                .setURL(config.moderation.ban.link)
+                            )
+                    )
+                }
+                dmMessage = await (interaction.options.getMember("user") as GuildMember).send(messageData);
+                dmSent = true;
             }
         } catch {
-            dmd = false;
+            dmSent = false;
         }
         try {
             const member = interaction.options.getMember("user") as GuildMember;
+            const days: number = interaction.options.get("delete")?.value as number | null ?? 0;
             member.ban({
-                days: Number(interaction.options.getNumber("delete") ?? 0),
-                reason: reason ?? "No reason provided"
+                deleteMessageSeconds: days * 24 * 60 * 60,
+                reason: reason ?? "*No reason provided*"
             });
             await client.database.history.create("ban", interaction.guild!.id, member.user, interaction.user, reason);
             const { log, NucleusColors, entry, renderUser, renderDelta } = client.logger;
@@ -117,10 +124,10 @@
                 list: {
                     memberId: entry(member.user.id, `\`${member.user.id}\``),
                     name: entry(member.user.id, renderUser(member.user)),
-                    banned: entry(new Date().getTime(), renderDelta(new Date().getTime())),
+                    banned: entry(new Date().getTime().toString(), renderDelta(new Date().getTime())),
                     bannedBy: entry(interaction.user.id, renderUser(interaction.user)),
                     reason: entry(reason, reason ? `\n> ${reason}` : "*No reason provided.*"),
-                    accountCreated: entry(member.user.createdAt, renderDelta(member.user.createdAt)),
+                    accountCreated: entry(member.user.createdAt.toString(), renderDelta(member.user.createdAt.getTime())),
                     serverMemberCount: interaction.guild!.memberCount
                 },
                 hidden: {
@@ -139,10 +146,10 @@
                 ],
                 components: []
             });
-            if (dmd && dm) await dm.delete();
+            if (dmSent && dmMessage) await dmMessage.delete();
             return;
         }
-        const failed = !dmd && notify;
+        const failed = !dmSent && notify;
         await interaction.editReply({
             embeds: [
                 new EmojiEmbed()
@@ -169,7 +176,7 @@
 
 const check = async (interaction: CommandInteraction) => {
     const member = interaction.member as GuildMember;
-    const me = interaction.guild!.me!;
+    const me = interaction.guild!.members.me!;
     let apply = interaction.options.getUser("user") as User | GuildMember;
     const memberPos = member.roles.cache.size > 1 ? member.roles.highest.position : 0;
     const mePos = me.roles.cache.size > 1 ? me.roles.highest.position : 0;
@@ -185,13 +192,13 @@
     // Check if Nucleus can ban the member
     if (!(mePos > applyPos)) throw new Error("I do not have a role higher than that member");
     // Check if Nucleus has permission to ban
-    if (!me.permissions.has("BAN_MEMBERS")) throw new Error("I do not have the *Ban Members* permission");
+    if (!me.permissions.has("BanMembers")) throw new Error("I do not have the *Ban Members* permission");
     // Do not allow banning Nucleus
-    if (member.id === interaction.guild!.me!.id) throw new Error("I cannot ban myself");
+    if (member.id === me.id) throw new Error("I cannot ban myself");
     // Allow the owner to ban anyone
     if (member.id === interaction.guild!.ownerId) return true;
     // Check if the user has ban_members permission
-    if (!member.permissions.has("BAN_MEMBERS")) throw new Error("You do not have the *Ban Members* permission");
+    if (!member.permissions.has("BanMembers")) throw new Error("You do not have the *Ban Members* permission");
     // Check if the user is below on the role list
     if (!(memberPos > applyPos)) throw new Error("You do not have a role higher than that member");
     // Allow ban
diff --git a/src/commands/mod/info.ts b/src/commands/mod/info.ts
index bed0f86..12c414f 100644
--- a/src/commands/mod/info.ts
+++ b/src/commands/mod/info.ts
@@ -8,9 +8,9 @@
     ButtonBuilder,
     MessageComponentInteraction,
     ModalSubmitInteraction,
-    SelectMenuInteraction,
     TextInputComponent,
-    ButtonStyle
+    ButtonStyle,
+    StringSelectMenuInteraction
 } from "discord.js";
 import type { SlashCommandSubcommandBuilder } from "@discordjs/builders";
 import EmojiEmbed from "../../utils/generateEmojiEmbed.js";
@@ -101,8 +101,15 @@
     let currentYear = new Date().getFullYear();
     let pageIndex: number | null = null;
     let history, current: TimelineSection;
+    history = await client.database.history.read(member.guild.id, member.id, currentYear);
+    history = history
+        .sort(
+            (a: { occurredAt: Date }, b: { occurredAt: Date }) =>
+                b.occurredAt.getTime() - a.occurredAt.getTime()
+        )
+        .reverse();
     let m: Message;
-    let refresh = true;
+    let refresh = false;
     let filteredTypes: string[] = [];
     let openFilterPane = false;
     let timedOut = false;
@@ -149,7 +156,7 @@
         const components = (
             openFilterPane
                 ? [
-                      new ActionRowBuilder().addComponents([
+                      new ActionRowBuilder<Discord.StringSelectMenuBuilder>().addComponents(
                           new Discord.SelectMenuBuilder()
                               .setOptions(
                                   Object.entries(types).map(([key, value]) => ({
@@ -163,11 +170,11 @@
                               .setMaxValues(Object.keys(types).length)
                               .setCustomId("filter")
                               .setPlaceholder("Select at least one event")
-                      ])
+                      )
                   ]
                 : []
         ).concat([
-            new ActionRowBuilder().addComponents([
+            new ActionRowBuilder<Discord.ButtonBuilder>().addComponents([
                 new ButtonBuilder()
                     .setCustomId("prevYear")
                     .setLabel((currentYear - 1).toString())
@@ -187,7 +194,7 @@
                     .setStyle(ButtonStyle.Secondary)
                     .setDisabled(currentYear === new Date().getFullYear())
             ]),
-            new ActionRowBuilder().addComponents([
+            new ActionRowBuilder<Discord.ButtonBuilder>().addComponents([
                 new ButtonBuilder()
                     .setLabel("Mod notes")
                     .setCustomId("modNotes")
@@ -258,7 +265,7 @@
         }
         i.deferUpdate();
         if (i.customId === "filter") {
-            filteredTypes = (i as SelectMenuInteraction).values;
+            filteredTypes = (i as StringSelectMenuInteraction).values;
             pageIndex = null;
             refresh = true;
         }
@@ -330,7 +337,7 @@
                     .setStatus("Success")
             ],
             components: [
-                new ActionRowBuilder().addComponents([
+                new ActionRowBuilder<Discord.ButtonBuilder>().addComponents([
                     new ButtonBuilder()
                         .setLabel(`${note ? "Modify" : "Create"} note`)
                         .setStyle(ButtonStyle.Primary)
@@ -353,11 +360,11 @@
         }
         if (i.customId === "modify") {
             await i.showModal(
-                new Discord.Modal()
+                new Discord.ModalBuilder()
                     .setCustomId("modal")
                     .setTitle("Editing moderator note")
                     .addComponents(
-                        new ActionRowBuilder<TextInputComponent>().addComponents(
+                        new ActionRowBuilder<Discord.TextInputComponent>().addComponents(
                             new TextInputComponent()
                                 .setCustomId("note")
                                 .setLabel("Note")
@@ -377,7 +384,7 @@
                         .setEmoji("GUILD.TICKET.OPEN")
                 ],
                 components: [
-                    new ActionRowBuilder().addComponents([
+                    new ActionRowBuilder<Discord.ButtonBuilder>().addComponents([
                         new ButtonBuilder()
                             .setLabel("Back")
                             .setEmoji(getEmojiByName("CONTROL.LEFT", "id"))
@@ -415,7 +422,7 @@
 
 const check = (interaction: CommandInteraction) => {
     const member = interaction.member as GuildMember;
-    if (!member.permissions.has("MODERATE_MEMBERS"))
+    if (!member.permissions.has("ModerateMembers"))
         throw new Error("You do not have the *Moderate Members* permission");
     return true;
 };
diff --git a/src/commands/mod/mute.ts b/src/commands/mod/mute.ts
index 1f541c8..db0d68b 100644
--- a/src/commands/mod/mute.ts
+++ b/src/commands/mod/mute.ts
@@ -263,7 +263,7 @@
         let errors = 0;
         try {
             if (config.moderation.mute.timeout) {
-                await member.timeout(muteTime * 1000, reason || "No reason provided");
+                await member.timeout(muteTime * 1000, reason || "*No reason provided*");
                 if (config.moderation.mute.role !== null) {
                     await member.roles.add(config.moderation.mute.role);
                     await client.database.eventScheduler.schedule("naturalUnmute", new Date().getTime() + muteTime * 1000, {
diff --git a/src/commands/mod/unmute.ts b/src/commands/mod/unmute.ts
index 2dd3a2a..0ce63d1 100644
--- a/src/commands/mod/unmute.ts
+++ b/src/commands/mod/unmute.ts
@@ -64,7 +64,7 @@
         }
         const member = interaction.options.getMember("user") as GuildMember;
         try {
-            member.timeout(0, reason ?? "No reason provided");
+            member.timeout(0, reason ?? "*No reason provided*");
         } catch {
             await interaction.editReply({
                 embeds: [
diff --git a/src/commands/mod/warn.ts b/src/commands/mod/warn.ts
index 2fc5a06..5125587 100644
--- a/src/commands/mod/warn.ts
+++ b/src/commands/mod/warn.ts
@@ -1,10 +1,11 @@
 import Discord, { CommandInteraction, GuildMember, ActionRowBuilder, ButtonBuilder, ButtonStyle } from "discord.js";
-import { SlashCommandSubcommandBuilder } from "@discordjs/builders";
+import type { SlashCommandSubcommandBuilder } from "@discordjs/builders";
 import confirmationMessage from "../../utils/confirmationMessage.js";
 import EmojiEmbed from "../../utils/generateEmojiEmbed.js";
 import keyValueList from "../../utils/generateKeyValueList.js";
 import { create, areTicketsEnabled } from "../../actions/createModActionTicket.js";
 import client from "../../utils/client.js";
+import { LinkWarningFooter } from "../../utils/defaultEmbeds.js";
 
 const command = (builder: SlashCommandSubcommandBuilder) =>
     builder
@@ -15,7 +16,7 @@
 const callback = async (interaction: CommandInteraction): Promise<unknown> => {
     const { log, NucleusColors, renderUser, entry } = client.logger;
     // TODO:[Modals] Replace this with a modal
-    let reason = null;
+    let reason: string | null = null;
     let notify = true;
     let createAppealTicket = false;
     let confirmation;
@@ -27,20 +28,18 @@
             .setTitle("Warn")
             .setDescription(
                 keyValueList({
-                    user: renderUser(interaction.options.getUser("user")),
+                    user: renderUser(interaction.options.getUser("user")!),
                     reason: reason ? "\n> " + reason.replaceAll("\n", "\n> ") : "*No reason provided*"
                 }) +
-                    `The user **will${notify ? "" : " not"}** be notified\n\n` +
                     `Are you sure you want to warn <@!${(interaction.options.getMember("user") as GuildMember).id}>?`
             )
             .setColor("Danger")
             .addCustomBoolean(
                 "appeal",
                 "Create appeal ticket",
-                !(await areTicketsEnabled(interaction.guild.id)),
-                async () =>
-                    await create(interaction.guild, interaction.options.getUser("user"), interaction.user, reason),
-                "An appeal ticket will be created when Confirm is clicked",
+                !(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",
                 createAppealTicket
             )
@@ -49,7 +48,7 @@
                 "Notify user",
                 false,
                 null,
-                null,
+                "The user will be sent a DM",
                 "ICONS.NOTIFY." + (notify ? "ON" : "OFF"),
                 notify
             )
@@ -60,53 +59,51 @@
         else if (confirmation.success !== undefined) success = true;
         else if (confirmation.newReason) reason = confirmation.newReason;
         else if (confirmation.components) {
-            notify = confirmation.components.notify.active;
-            createAppealTicket = confirmation.components.appeal.active;
+            notify = confirmation.components["notify"]!.active;
+            createAppealTicket = confirmation.components["appeal"]!.active;
         }
     } while (!timedOut && !success)
     if (timedOut) return;
     if (confirmation.success) {
-        let dmd = false;
+        let dmSent = false;
+        const config = await client.database.guilds.read(interaction.guild!.id);
         try {
             if (notify) {
-                const config = await client.database.guilds.read(interaction.guild.id);
-                await (interaction.options.getMember("user") as GuildMember).send({
+                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}` : ".") +
+                                `You have been warned in ${interaction.guild!.name}` +
+                                    (reason ? ` for:\n> ${reason}` : ".\n*No reason was provided*") +
                                     "\n\n" +
-                                    (confirmation.components.appeal.response
-                                        ? `You can appeal this here ticket: <#${confirmation.components.appeal.response}>`
+                                    (createAppealTicket
+                                        ? `You can appeal this in the ticket created in <#${confirmation.components!["appeal"]!.response}>`
                                         : "")
                             )
                             .setStatus("Danger")
-                            .setFooter({
-                                text: config.moderation.warn.text
-                                    ? "The button below is set by the server admins. Do not enter any passwords or other account details on the linked site."
-                                    : "",
-                                iconURL:
-                                    "https://cdn.discordapp.com/emojis/952295894370369587.webp?size=128&quality=lossless"
-                            })
                     ],
-                    components: config.moderation.warn.text
-                        ? [
-                              new ActionRowBuilder().addComponents([
-                                  new ButtonBuilder()
-                                      .setStyle(ButtonStyle.Link)
-                                      .setLabel(config.moderation.warn.text)
-                                      .setURL(config.moderation.warn.link)
-                              ])
-                          ]
-                        : []
-                });
-                dmd = true;
+                    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;
             }
-        } catch {
-            dmd = false;
+        } catch (e) {
+            dmSent = false;
         }
         const data = {
             meta: {
@@ -122,22 +119,22 @@
                     (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)),
-                reason: reason ? `\n> ${reason}` : "No reason provided"
+                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
+                guild: interaction.guild!.id
             }
         };
         await client.database.history.create(
             "warn",
-            interaction.guild.id,
+            interaction.guild!.id,
             (interaction.options.getMember("user") as GuildMember).user,
             interaction.user,
             reason
         );
         log(data);
-        const failed = !dmd && notify;
+        const failed = !dmSent && notify;
         if (!failed) {
             await interaction.editReply({
                 embeds: [
@@ -146,8 +143,8 @@
                         .setTitle("Warn")
                         .setDescription(
                             "The user was warned" +
-                                (confirmation.components.appeal.response
-                                    ? ` and an appeal ticket was opened in <#${confirmation.components.appeal.response}>`
+                                (createAppealTicket
+                                    ? ` and an appeal ticket was opened in <#${confirmation.components!["appeal"]!.response}>`
                                     : "")
                         )
                         .setStatus("Success")
@@ -157,7 +154,7 @@
         } else {
             const canSeeChannel = (interaction.options.getMember("user") as GuildMember)
                 .permissionsIn(interaction.channel as Discord.TextChannel)
-                .has("VIEW_CHANNEL");
+                .has("ViewChannel");
             const m = (await interaction.editReply({
                 embeds: [
                     new EmojiEmbed()
@@ -167,7 +164,7 @@
                         .setStatus("Danger")
                 ],
                 components: [
-                    new ActionRowBuilder().addComponents([
+                    new ActionRowBuilder<Discord.ButtonBuilder>().addComponents(
                         new Discord.ButtonBuilder().setCustomId("log").setLabel("Ignore and log").setStyle(ButtonStyle.Secondary),
                         new Discord.ButtonBuilder()
                             .setCustomId("here")
@@ -178,7 +175,8 @@
                             .setCustomId("ticket")
                             .setLabel("Create ticket")
                             .setStyle(canSeeChannel ? ButtonStyle.Primary : ButtonStyle.Secondary)
-                    ])
+                            .setDisabled(createAppealTicket)
+                    )
                 ]
             })) as Discord.Message;
             let component;
@@ -200,7 +198,7 @@
                 });
             }
             if (component.customId === "here") {
-                await interaction.channel.send({
+                await interaction.channel!.send({
                     embeds: [
                         new EmojiEmbed()
                             .setEmoji("PUNISH.WARN.RED")
@@ -220,8 +218,8 @@
                             .setTitle("Warn")
                             .setDescription(
                                 "The user was warned" +
-                                    (confirmation.response
-                                        ? ` and an appeal ticket was opened in <#${confirmation.response}>`
+                                    (createAppealTicket
+                                        ? ` and an appeal ticket was opened in <#${confirmation.components!["appeal"]!.response}>`
                                         : "")
                             )
                             .setStatus("Success")
@@ -241,8 +239,8 @@
                 });
             } else if (component.customId === "ticket") {
                 const ticketChannel = await create(
-                    interaction.guild,
-                    interaction.options.getUser("user"),
+                    interaction.guild!,
+                    interaction.options.getUser("user")!,
                     interaction.user,
                     reason,
                     "Warn Notification"
@@ -296,7 +294,7 @@
     // Allow the owner to warn anyone
     if (member.id === interaction.guild!.ownerId) return true;
     // Check if the user has moderate_members permission
-    if (!member.permissions.has("MODERATE_MEMBERS"))
+    if (!member.permissions.has("ModerateMembers"))
         throw new Error("You do not have the *Moderate Members* permission");
     // Check if the user is below on the role list
     if (!(memberPos > applyPos)) throw new Error("You do not have a role higher than that member");
