few changes
diff --git a/src/commands/mod/unban.ts b/src/commands/mod/unban.ts
index 3ffc001..f96a7bd 100644
--- a/src/commands/mod/unban.ts
+++ b/src/commands/mod/unban.ts
@@ -1,18 +1,102 @@
-import { CommandInteraction } from "discord.js";
+import { CommandInteraction, GuildMember, User } from "discord.js";
 import { SlashCommandSubcommandBuilder } from "@discordjs/builders";
 import { WrappedCheck } from "jshaiku";
+import generateEmojiEmbed from "../../utils/generateEmojiEmbed.js";
+import keyValueList from "../../utils/generateKeyValueList.js";
+import confirmationMessage from "../../utils/confirmationMessage.js";
 
 const command = (builder: SlashCommandSubcommandBuilder) =>
     builder
     .setName("unban")
     .setDescription("Unbans a user")
+    .addStringOption(option => option.setName("user").setDescription("The user to unban (Username or ID)").setRequired(true))
 
-const callback = (interaction: CommandInteraction) => {
-    interaction.reply("This command is not yet finished [mod/unban]");
+const callback = async (interaction: CommandInteraction) => { // TODO: User search
+    let bans = await interaction.guild.bans.fetch()
+    let user = interaction.options.getString("user")
+    let resolved = bans.find(ban => ban.user.id == user)
+    if (!resolved) resolved = bans.find(ban => ban.user.username.toLowerCase() == user.toLowerCase())
+    if (!resolved) resolved = bans.find(ban => ban.user.tag.toLowerCase() == user.toLowerCase())
+    if (!resolved) {
+        return interaction.reply({embeds: [new generateEmojiEmbed()
+            .setTitle("Unban")
+            .setDescription(`Could not find any user called \`${user}\``)
+            .setEmoji("PUNISH.UNBAN.RED")
+            .setStatus("Danger")
+        ], ephemeral: true})
+    }
+    // TODO:[Modals] Replace this with a modal
+    let confirmation = await new confirmationMessage(interaction)
+        .setEmoji("PUNISH.UNBAN.RED")
+        .setTitle("Unban")
+        .setDescription(keyValueList({
+            "user": `${resolved.user.username} [<@${resolved.user.id}>]`,
+        })
+        + `Are you sure you want to unban <@${resolved.user.id}>?`)
+        .setColor("Danger")
+    .send()
+    if (confirmation.success) {
+        try {
+            await interaction.guild.members.unban(resolved.user as User, "Unban");
+            let member = (resolved.user as User)
+            // @ts-ignore
+            const { log, NucleusColors, entry, renderUser, renderDelta } = interaction.user.client.logger
+            let data = {
+                meta: {
+                    type: 'memberUnban',
+                    displayName: 'Member Unbanned',
+                    calculateType: 'guildMemberPunish',
+                    color: NucleusColors.green,
+                    emoji: "PUNISH.BAN.GREEN",
+                    timestamp: new Date().getTime()
+                },
+                list: {
+                    id: entry(member.id, `\`${member.id}\``),
+                    name: entry(member.id, renderUser(member)),
+                    unbanned: entry(new Date().getTime(), renderDelta(new Date().getTime())),
+                    unbannedBy: entry(interaction.user.id, renderUser(interaction.user)),
+                    accountCreated: entry(member.createdAt, renderDelta(member.createdAt)),
+                },
+                hidden: {
+                    guild: interaction.guild.id
+                }
+            }
+            log(data, member.client);
+        } catch {
+            await interaction.editReply({embeds: [new generateEmojiEmbed()
+                .setEmoji("PUNISH.UNBAN.RED")
+                .setTitle(`Unban`)
+                .setDescription("Something went wrong and the user was not unbanned")
+                .setStatus("Danger")
+            ], components: []})
+        }
+        await interaction.editReply({embeds: [new generateEmojiEmbed()
+            .setEmoji(`PUNISH.UNBAN.GREEN`)
+            .setTitle(`Unban`)
+            .setDescription("The member was unbanned")
+            .setStatus("Success")
+        ], components: []})
+    } else {
+        await interaction.editReply({embeds: [new generateEmojiEmbed()
+            .setEmoji("PUNISH.UNBAN.GREEN")
+            .setTitle(`Unban`)
+            .setDescription("No changes were made")
+            .setStatus("Success")
+        ], components: []})
+    }
 }
 
 const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
-    return true;
+    let member = (interaction.member as GuildMember)
+    let me = (interaction.guild.me as GuildMember)
+    // Check if Nucleus can unban members
+    if (! interaction.guild.me.permissions.has("BAN_MEMBERS")) throw "I do not have the `ban_members` permission";
+    // Allow the owner to unban anyone
+    if ((interaction.member as GuildMember).id == interaction.guild.ownerId) return true
+    // Check if the user has ban_members permission
+    if (! (interaction.member as GuildMember).permissions.has("BAN_MEMBERS")) throw "You do not have the `ban_members` permission";
+    // Allow unban
+    return true
 }
 
 export { command, callback, check };
\ No newline at end of file