diff --git a/src/commands/mod/slowmode.ts b/src/commands/mod/slowmode.ts
index b91f065..8bec805 100644
--- a/src/commands/mod/slowmode.ts
+++ b/src/commands/mod/slowmode.ts
@@ -1,57 +1,53 @@
-import humanizeDuration from 'humanize-duration';
-import { CommandInteraction, GuildMember, TextChannel } from "discord.js";
+import { CommandInteraction } from "discord.js";
 import { SlashCommandSubcommandBuilder } from "@discordjs/builders";
 import { WrappedCheck } from "jshaiku";
-import keyValueList from "../../utils/generateKeyValueList.js";
-import confirmationMessage from "../../utils/confirmationMessage.js";
-import generateEmojiEmbed from "../../utils/generateEmojiEmbed.js";
+import humanizeDuration from 'humanize-duration';
 
 const command = (builder: SlashCommandSubcommandBuilder) =>
     builder
     .setName("slowmode")
     .setDescription("Manages slowmode in a channel")
-    .addStringOption(option => option.setName("time").setDescription("The delay between messages").setRequired(false).addChoices([
-        ["Off", "0"],
-        ["5 seconds", "5"], ["10 seconds", "10"], ["15 seconds", "15"], ["30 seconds", "30"],
-        ["1 minute", "60"], ["2 minutes", "120"], ["5 minutes", "300"], ["10 minutes", "600"],
-        ["15 minutes", "900"], ["30 minutes", "1800"],
-        ["1 hour", "3600"], ["2 hours", "7200"], ["6 hours", "21600"]
-    ]))
+    .addIntegerOption(option => option.setName("seconds").setDescription("The seconds between messages").setRequired(false))
+    .addIntegerOption(option => option.setName("minutes").setDescription("The minutes between messages").setRequired(false))
+    .addIntegerOption(option => option.setName("hours").setDescription("The hours between messages").setRequired(false))
 
-const callback = async (interaction: CommandInteraction) => {
-    let time = parseInt(interaction.options.getString("time") ?? "0");
-    if (time === 0 && (interaction.channel as TextChannel).rateLimitPerUser === 0) { time = 10 }
+const callback = (interaction: CommandInteraction) => {
+    let seconds = interaction.option.getInteger("seconds")
+    let minutes = interaction.option.getInteger("minutes")
+    let hours = interaction.option.getInteger("hours")
+    let totalTime = seconds + (minutes * 60) + (hours * 60 * 60)
+
     let confirmation = await new confirmationMessage(interaction)
-        .setEmoji("CHANNEL.SLOWMODE.RED")
+        .setEmoji("PUNISH.SLOWMODE.RED")
         .setTitle("Slowmode")
         .setDescription(keyValueList({
-            "time": time ? humanizeDuration(time * 1000, { round: true }) : "No delay",
+            "delay": `${totalTime ? humanizeDuration(totalTime * 1000) : "*No delay*"}`
         })
-        + `Are you sure you want to set the slowmode in this channel?`)
+        + `Are you sure you want to enable slowmode in this channel?`)
         .setColor("Danger")
 //        pluralize("day", interaction.options.getInteger("delete"))
 //        const pluralize = (word: string, count: number) => { return count === 1 ? word : word + "s" }
     .send()
     if (confirmation.success) {
         try {
-            (interaction.channel as TextChannel).setRateLimitPerUser(time)
-        } catch (e) {
-            await interaction.editReply({embeds: [new generateEmojiEmbed()
-                .setEmoji("CHANNEL.SLOWMODE.RED")
+            await interaction.setRateLimitPerUser(totalTime, "Nucleus slowmode")
+        } catch {
+            return await interaction.editReply({embeds: [new generateEmojiEmbed()
+                .setEmoji("PUNISH.SLOWMODE.RED")
                 .setTitle(`Slowmode`)
-                .setDescription("An error occurred while setting the slowmode")
+                .setDescription("Something went wrong and the slowmode could not be set.")
                 .setStatus("Danger")
             ], components: []})
         }
         await interaction.editReply({embeds: [new generateEmojiEmbed()
-            .setEmoji(`CHANNEL.SLOWMODE.GREEN`)
+            .setEmoji("PUNISH.NICKNAME.GREEN")
             .setTitle(`Slowmode`)
             .setDescription("The channel slowmode was set successfully")
             .setStatus("Success")
         ], components: []})
     } else {
         await interaction.editReply({embeds: [new generateEmojiEmbed()
-            .setEmoji("CHANNEL.SLOWMODE.GREEN")
+            .setEmoji("PUNISH.SLOWMODE.GREEN")
             .setTitle(`Slowmode`)
             .setDescription("No changes were made")
             .setStatus("Success")
@@ -61,9 +57,12 @@
 
 const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
     let member = (interaction.member as GuildMember)
-    // Check if Nucleus can set the slowmode
-    if (! interaction.guild.me.permissions.has("MANAGE_CHANNELS")) throw "I do not have the `manage_channels` permission";
-    // Check if the user has manage_channel permission
+    let me = (interaction.guild.me as GuildMember)
+    // Check if Nucleus can edit the channel
+    if (! interaction.guild.me.permission.has("MANAGE_CHANNELS")) throw "I do not have permission to edit this channel"
+    // Allow the owner to set any channel
+    if (member.id == interaction.guild.ownerId) return true
+    // Check if the user has manage_channels permission
     if (! member.permissions.has("MANAGE_CHANNELS")) throw "You do not have the `manage_channels` permission";
     // Allow slowmode
     return true
