diff --git a/src/commands/user/about.ts b/src/commands/user/about.ts
index 82eda6a..59ba2e6 100644
--- a/src/commands/user/about.ts
+++ b/src/commands/user/about.ts
@@ -1,4 +1,4 @@
-import { LoadingEmbed } from './../../utils/defaultEmbeds.js';
+import { LoadingEmbed } from "./../../utils/defaultEmbeds.js";
 import Discord, { CommandInteraction, MessageActionRow, MessageButton } from "discord.js";
 import { SelectMenuOption, SlashCommandSubcommandBuilder } from "@discordjs/builders";
 import { WrappedCheck } from "jshaiku";
@@ -6,20 +6,20 @@
 import getEmojiByName from "../../utils/getEmojiByName.js";
 import generateKeyValueList from "../../utils/generateKeyValueList.js";
 import createPageIndicator from "../../utils/createPageIndicator.js";
-import client from "../../utils/client.js"
+import client from "../../utils/client.js";
 
 const command = (builder: SlashCommandSubcommandBuilder) =>
     builder
-    .setName("about")
-    .setDescription("Shows info about a user")
-    .addUserOption(option => option.setName("user").setDescription("The user to get info about | Default: Yourself"))
+        .setName("about")
+        .setDescription("Shows info about a user")
+        .addUserOption(option => option.setName("user").setDescription("The user to get info about | Default: Yourself"));
 
 
 class Embed {
     embed: Discord.MessageEmbed;
     title: string;
-    description: string = "";
-    pageId: number = 0;
+    description = "";
+    pageId = 0;
     setEmbed(embed: Discord.MessageEmbed) { this.embed = embed; return this; }
     setTitle(title: string) { this.title = title; return this; }
     setDescription(description: string) { this.description = description; return this; }
@@ -28,23 +28,23 @@
 
 
 const callback = async (interaction: CommandInteraction): Promise<any> => {
-    const { renderUser, renderDelta } = client.logger
-    let member = (interaction.options.getMember("user") || interaction.member) as Discord.GuildMember;
-    let flags: string[] = [];
+    const { renderUser, renderDelta } = client.logger;
+    const member = (interaction.options.getMember("user") || interaction.member) as Discord.GuildMember;
+    const flags: string[] = [];
     if ([
         "438733159748599813", // Pinea
         "317731855317336067", // Mini
         "261900651230003201", // Coded
-        "511655498676699136", // Zan
-    ].includes(member.user.id)) { flags.push("NUCLEUSDEVELOPER") }
-    if ((await client.guilds.cache.get("684492926528651336")?.members.fetch())?.filter(m => m.roles.cache.has("760896837866749972"))?.map(m => m.id).includes(member.user.id)) { flags.push("CLICKSDEVELOPER") }
+        "511655498676699136" // Zan
+    ].includes(member.user.id)) { flags.push("NUCLEUSDEVELOPER"); }
+    if ((await client.guilds.cache.get("684492926528651336")?.members.fetch())?.filter(m => m.roles.cache.has("760896837866749972"))?.map(m => m.id).includes(member.user.id)) { flags.push("CLICKSDEVELOPER"); }
     member.user.flags.toArray().map(flag => {
-        flags.push(flag.toString())
-    })
-    if (member.user.bot === true) { flags.push("BOT") }
+        flags.push(flag.toString());
+    });
+    if (member.user.bot === true) { flags.push("BOT"); }
     // Check if they are boosting the server
-    if (member.premiumSince) { flags.push("BOOSTER") }
-    let nameReplacements = {
+    if (member.premiumSince) { flags.push("BOOSTER"); }
+    const nameReplacements = {
         "NUCLEUSDEVELOPER": "**Nucleus Developer**",
         "CLICKSDEVELOPER": "Clicks Developer",
         "HOUSE_BRAVERY": "Hypesquad Bravery",
@@ -59,31 +59,31 @@
         "EARLY_VERIFIED_BOT_DEVELOPER": "Verified Bot Developer",
         "BOT": "Bot",
         "BOOSTER": "Server Booster"
-    }
-    let members = await interaction.guild.members.fetch()
-    let membersArray = [...members.values()]
-    membersArray.sort((a, b) => a.joinedTimestamp - b.joinedTimestamp)
-    let joinPos = membersArray.findIndex(m => m.id === member.user.id)
+    };
+    const members = await interaction.guild.members.fetch();
+    const membersArray = [...members.values()];
+    membersArray.sort((a, b) => a.joinedTimestamp - b.joinedTimestamp);
+    const joinPos = membersArray.findIndex(m => m.id === member.user.id);
 
-    let roles = member.roles.cache.filter(r => r.id !== interaction.guild.id).sort()
+    const roles = member.roles.cache.filter(r => r.id !== interaction.guild.id).sort();
     let s = "";
     let count = 0;
-    let ended = false
+    let ended = false;
     roles.map(item => {
         if (ended) return;
-        let string = `<@&${item.id}>, `
+        const string = `<@&${item.id}>, `;
         if(s.length + string.length > 1000) {
-            ended = true
-            s += `and ${roles.size - count} more`
-            return
-        };
-        count ++
+            ended = true;
+            s += `and ${roles.size - count} more`;
+            return;
+        }
+        count ++;
         s += string;
-    })
+    });
     if(s.length > 0 && !ended) s = s.slice(0, -2);
 
-    let perms = ""
-    let permsArray = {
+    let perms = "";
+    const permsArray = {
         "ADMINISTRATOR": "Administrator",
         "MANAGE_GUILD": "Manage Server",
         "MANAGE_ROLES": "Manage Roles",
@@ -96,15 +96,15 @@
         "MANAGE_MESSAGES": "Manage Messages",
         "VIEW_AUDIT_LOG": "View Audit Log",
         "MENTION_EVERYONE": "Mention Everyone"
-    }
+    };
     Object.keys(permsArray).map(perm => {
-        let hasPerm = member.permissions.has(perm as Discord.PermissionString)
-        perms += `${getEmojiByName("CONTROL." + (hasPerm ? "TICK" : "CROSS"))} ${permsArray[perm]}\n`
-    })
+        const hasPerm = member.permissions.has(perm as Discord.PermissionString);
+        perms += `${getEmojiByName("CONTROL." + (hasPerm ? "TICK" : "CROSS"))} ${permsArray[perm]}\n`;
+    });
 
     let selectPaneOpen = false;
 
-    let embeds = [
+    const embeds = [
         new Embed()
             .setEmbed(new EmojiEmbed()
                 .setTitle("User Info: General")
@@ -138,7 +138,7 @@
                     generateKeyValueList({
                         "member": renderUser(member.user),
                         "id": `\`${member.id}\``,
-                        "roles": `${member.roles.cache.size - 1}`,
+                        "roles": `${member.roles.cache.size - 1}`
                     }) + "\n" +
                     (s.length > 0 ? s : "*None*") + "\n"
                 )
@@ -152,37 +152,37 @@
                 .setDescription(
                     generateKeyValueList({
                         "member": renderUser(member.user),
-                        "id": `\`${member.id}\``,
+                        "id": `\`${member.id}\``
                     }) + "\n" + perms
                 )
                 .setThumbnail(await member.user.displayAvatarURL({dynamic: true}))
-            ).setTitle("Key Permissions").setDescription("Key permissions the user has").setPageId(2),
-    ]
-    let m
+            ).setTitle("Key Permissions").setDescription("Key permissions the user has").setPageId(2)
+    ];
+    let m;
     m = await interaction.reply({embeds: LoadingEmbed, fetchReply: true, ephemeral: true});
-    let page = 0
-    let breakReason = ""
+    let page = 0;
+    let breakReason = "";
     while (true) {
-        let em = new Discord.MessageEmbed(embeds[page].embed)
+        const em = new Discord.MessageEmbed(embeds[page].embed);
         em.setDescription(em.description + "\n" + createPageIndicator(embeds.length, page));
-        let selectPane = []
+        let selectPane = [];
 
         if (selectPaneOpen) {
-            let options = [];
+            const options = [];
             embeds.forEach(embed => {
                 options.push(new SelectMenuOption({
                     label: embed.title,
                     value: embed.pageId.toString(),
-                    description: embed.description || "",
-                }))
-            })
+                    description: embed.description || ""
+                }));
+            });
             selectPane = [new MessageActionRow().addComponents([
                 new Discord.MessageSelectMenu()
                     .addOptions(options)
                     .setCustomId("page")
                     .setMaxValues(1)
                     .setPlaceholder("Choose a page...")
-            ])]
+            ])];
         }
         await interaction.editReply({
             embeds: [em],
@@ -207,12 +207,12 @@
                     .setCustomId("close")
                     .setStyle("DANGER")
             ])])
-        })
-        let i
+        });
+        let i;
         try {
             i = await m.awaitMessageComponent({time: 300000});
-        } catch { breakReason = "Message timed out"; break }
-        i.deferUpdate()
+        } catch { breakReason = "Message timed out"; break; }
+        i.deferUpdate();
         if (i.component.customId === "left") {
             if (page > 0) page--;
             selectPaneOpen = false;
@@ -232,7 +232,7 @@
             break;
         }
     }
-    let em = new Discord.MessageEmbed(embeds[page].embed)
+    const em = new Discord.MessageEmbed(embeds[page].embed);
     em.setDescription(em.description + "\n" + createPageIndicator(embeds.length, page) + " | " + breakReason);
     await interaction.editReply({embeds: [em], components: [new MessageActionRow().addComponents([
         new MessageButton()
@@ -255,12 +255,12 @@
             .setCustomId("close")
             .setStyle("DANGER")
             .setDisabled(true)
-    ])]})
-}
+    ])]});
+};
 
 const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
     return true;
-}
+};
 
 export { command };
 export { callback };
diff --git a/src/commands/user/avatar.ts b/src/commands/user/avatar.ts
index e72506f..8f327a5 100644
--- a/src/commands/user/avatar.ts
+++ b/src/commands/user/avatar.ts
@@ -2,19 +2,18 @@
 import { SlashCommandSubcommandBuilder } from "@discordjs/builders";
 import { WrappedCheck } from "jshaiku";
 import EmojiEmbed from "../../utils/generateEmojiEmbed.js";
-import getEmojiByName from "../../utils/getEmojiByName.js";
 import generateKeyValueList from "../../utils/generateKeyValueList.js";
-import client from "../../utils/client.js"
+import client from "../../utils/client.js";
 
 const command = (builder: SlashCommandSubcommandBuilder) =>
     builder
-    .setName("avatar")
-    .setDescription("Shows the avatar of a user")
-    .addUserOption(option => option.setName("user").setDescription("The user to get the avatar of | Default: Yourself"))
+        .setName("avatar")
+        .setDescription("Shows the avatar of a user")
+        .addUserOption(option => option.setName("user").setDescription("The user to get the avatar of | Default: Yourself"));
 
-const callback = async (interaction: CommandInteraction): Promise<any> => {
-    const { renderUser } = client.logger
-    let member = (interaction.options.getMember("user") || interaction.member) as Discord.GuildMember;
+const callback = async (interaction: CommandInteraction): Promise<void> => {
+    const { renderUser } = client.logger;
+    const member = (interaction.options.getMember("user") || interaction.member) as Discord.GuildMember;
     await interaction.reply({embeds: [new EmojiEmbed()
         .setTitle("User Info")
         .setStatus("Success")
@@ -22,16 +21,16 @@
         .setDescription(
             generateKeyValueList({
                 "member": renderUser(member.user),
-                "url": member.user.displayAvatarURL({dynamic: true}),
+                "url": member.user.displayAvatarURL({dynamic: true})
             })
         )
         .setImage(await member.user.displayAvatarURL({dynamic: true}))
     ], ephemeral: true, fetchReply: true});
-}
+};
 
-const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
+const check = (_interaction: CommandInteraction, _defaultCheck: WrappedCheck) => {
     return true;
-}
+};
 
 export { command };
 export { callback };
diff --git a/src/commands/user/track.ts b/src/commands/user/track.ts
index c2e0986..48733fc 100644
--- a/src/commands/user/track.ts
+++ b/src/commands/user/track.ts
@@ -1,6 +1,8 @@
-import { LoadingEmbed } from './../../utils/defaultEmbeds.js';
+import { LoadingEmbed } from "./../../utils/defaultEmbeds.js";
 import Discord, { CommandInteraction, GuildMember, Message, MessageActionRow, MessageButton } from "discord.js";
 import { SelectMenuOption, SlashCommandSubcommandBuilder } from "@discordjs/builders";
+// eslint-disable-next-line @typescript-eslint/ban-ts-comment
+// @ts-ignore
 import { WrappedCheck } from "jshaiku";
 import EmojiEmbed from "../../utils/generateEmojiEmbed.js";
 import getEmojiByName from "../../utils/getEmojiByName.js";
@@ -9,91 +11,92 @@
 
 const command = (builder: SlashCommandSubcommandBuilder) =>
     builder
-    .setName("track")
-    .setDescription("Moves a user along a role track")
-    .addUserOption(option => option.setName("user").setDescription("The user to manage").setRequired(true))
+        .setName("track")
+        .setDescription("Moves a user along a role track")
+        .addUserOption(option => option.setName("user").setDescription("The user to manage").setRequired(true));
 
-const generateFromTrack = (position: number, active: any, size: number, disabled: any) => {
-    active = active ? "ACTIVE" : "INACTIVE"
-    disabled = disabled ? "GREY." : ""
-    if (position === 0 && size === 1) return "TRACKS.SINGLE." + disabled + active
-    if (position === size - 1) return "TRACKS.VERTICAL.BOTTOM." + disabled + active
-    if (position === 0) return "TRACKS.VERTICAL.TOP." + disabled + active
-    return "TRACKS.VERTICAL.MIDDLE." + disabled + active
-}
+const generateFromTrack = (position: number, active: string | boolean, size: number, disabled: string | boolean) => {
+    active = active ? "ACTIVE" : "INACTIVE";
+    disabled = disabled ? "GREY." : "";
+    if (position === 0 && size === 1) return "TRACKS.SINGLE." + disabled + active;
+    if (position === size - 1) return "TRACKS.VERTICAL.BOTTOM." + disabled + active;
+    if (position === 0) return "TRACKS.VERTICAL.TOP." + disabled + active;
+    return "TRACKS.VERTICAL.MIDDLE." + disabled + active;
+};
 
-const callback = async (interaction: CommandInteraction): Promise<any> => {
+const callback = async (interaction: CommandInteraction): Promise<void | unknown> => {
     const { renderUser } = client.logger;
     const member = interaction.options.getMember("user") as GuildMember;
     const guild = interaction.guild;
-    let config = await client.database.guilds.read(guild.id);
-    await interaction.reply({embeds: LoadingEmbed, ephemeral: true})
-    let track = 0
+    if (!guild) return;
+    const config = await client.database.guilds.read(guild.id);
+    await interaction.reply({embeds: LoadingEmbed, ephemeral: true});
+    let track = 0;
     let generated;
-    const roles = await guild.roles.fetch()
-    let memberRoles = await member.roles
-    let managed
+    const roles = await guild.roles.fetch();
+    const memberRoles = await member.roles;
+    let managed: boolean;
     while (true) {
-        let data = config.tracks[track]
-        if (data.manageableBy !== undefined) managed = data.manageableBy.some(element => {return memberRoles.cache.has(element)})
-        else managed = false
-        let dropdown = new Discord.MessageSelectMenu().addOptions(config.tracks.map((option, index) => {
-            let hasRoleInTrack = option.track.some(element => {return memberRoles.cache.has(element)})
+        const data = config.tracks[track];
+        if (data.manageableBy !== undefined) managed = data.manageableBy.some((element: string) => {return memberRoles.cache.has(element);});
+        else managed = false;
+        const dropdown = new Discord.MessageSelectMenu().addOptions(config.tracks.map((option, index) => {
+            const hasRoleInTrack = option.track.some((element: string) => {return memberRoles.cache.has(element);});
             return new SelectMenuOption({
                 default: index === track,
                 label: option.name,
                 value: index.toString(),
                 description: option.track.length === 0 ? "No" : addPlural(option.track.length, "role"),
                 emoji: client.emojis.resolve(getEmojiByName("TRACKS.SINGLE." + (hasRoleInTrack ? "ACTIVE" : "INACTIVE"), "id"))
-            })
-        })).setCustomId("select").setMaxValues(1)
-        let allowed = []
-        generated = "**Track:** " + data.name + "\n" + "**Member:** " + renderUser(member.user) + "\n"
-        generated += (data.nullable ? "Members do not need a role in this track" : "A role in this track is required") + "\n"
-        generated += (data.retainPrevious ? "When promoted, the user keeps previous roles" : "Members will lose their current role when promoted") + "\n"
+            });
+        })).setCustomId("select").setMaxValues(1);
+        const allowed = [];
+        generated = "**Track:** " + data.name + "\n" + "**Member:** " + renderUser(member.user) + "\n";
+        generated += (data.nullable ? "Members do not need a role in this track" : "A role in this track is required") + "\n";
+        generated += (data.retainPrevious ? "When promoted, the user keeps previous roles" : "Members will lose their current role when promoted") + "\n";
         generated += "\n" + data.track.map((role, index) => {
-            let allow = (roles.get(role).position >= (interaction.member as GuildMember).roles.highest.position) && !managed
-            allowed.push(!allow)
+            const allow = (roles.get(role).position >= (interaction.member as GuildMember).roles.highest.position) && !managed;
+            allowed.push(!allow);
             return getEmojiByName(generateFromTrack(
                 index,
                 memberRoles.cache.has(role),
                 data.track.length,
                 allow
             )) + " " +
-            roles.get(role).name + " [<@&" + roles.get(role).id + ">]"
-        }).join("\n")
-        let selected = [];
+            roles.get(role).name + " [<@&" + roles.get(role).id + ">]";
+        }).join("\n");
+        const selected = [];
         for (let i = 0; i < data.track.length; i++) {
-            if (memberRoles.cache.has(data.track[i])) selected.push(data.track[i])
+            if (memberRoles.cache.has(data.track[i])) selected.push(data.track[i]);
         }
-        let conflict = data.retainPrevious ? false : selected.length > 1;
-        let conflictDropdown
-        let currentRoleIndex
+        const conflict = data.retainPrevious ? false : selected.length > 1;
+        let conflictDropdown;
+        let currentRoleIndex;
         if (conflict) {
-            generated += `\n\n${getEmojiByName(`PUNISH.WARN.${managed ? "YELLOW" : "RED"}`)} This user has ${selected.length} roles from this track. `
-            conflictDropdown = []
+            generated += `\n\n${getEmojiByName(`PUNISH.WARN.${managed ? "YELLOW" : "RED"}`)} This user has ${selected.length} roles from this track. `;
+            conflictDropdown = [];
             if (
                 (roles.get(selected[0]).position < memberRoles.highest.position) || managed
             ) {
-                generated +=  `In order to promote or demote this user, you must select which role the member should keep.`
+                generated +=  "In order to promote or demote this user, you must select which role the member should keep.";
                 selected.forEach(role => {
                     conflictDropdown.push(new SelectMenuOption({
                         label: roles.get(role).name,
-                        value: roles.get(role).id,
-                    }))
-                })
+                        value: roles.get(role).id
+                    }));
+                });
                 conflictDropdown = [new Discord.MessageSelectMenu()
                     .addOptions(conflictDropdown)
                     .setCustomId("conflict")
                     .setMaxValues(1)
-                    .setPlaceholder("Select a role to keep")]
+                    .setPlaceholder("Select a role to keep")];
             } else {
-                generated += "You don't have permission to manage one or more of the users roles, and therefore can't select one to keep."
+                generated += "You don't have permission to manage one or more of the users roles, and therefore can't select one to keep.";
             }
         } else {
-            currentRoleIndex = selected.length === 0 ? -1 : data.track.indexOf(selected[0].toString())
+            currentRoleIndex = selected.length === 0 ? -1 : data.track.indexOf(selected[0].toString());
         }
-        let m = await interaction.editReply({embeds: [new EmojiEmbed()
+        const m = await interaction.editReply({embeds: [new EmojiEmbed()
             .setEmoji("TRACKS.ICON")
             .setTitle("Tracks")
             .setDescription(`${generated}`)
@@ -101,82 +104,82 @@
         ], components: [
             new MessageActionRow().addComponents(dropdown)
         ]
-        .concat(conflict && conflictDropdown.length ? [new MessageActionRow().addComponents(conflictDropdown)] : [])
-        .concat([
-            new MessageActionRow().addComponents([
-                new MessageButton()
-                    .setEmoji(getEmojiByName("CONTROL.UP", "id"))
-                    .setLabel("Move up")
-                    .setCustomId("promote")
-                    .setStyle("SUCCESS")
-                    .setDisabled(conflict || currentRoleIndex === 0 || (currentRoleIndex === -1 ? false : !allowed[currentRoleIndex - 1])),
-                new MessageButton()
-                    .setEmoji(getEmojiByName("CONTROL.DOWN", "id"))
-                    .setLabel("Move down")
-                    .setCustomId("demote")
-                    .setStyle("DANGER")
-                    .setDisabled(conflict || (
-                        data.nullable ? currentRoleIndex <= -1 :
-                        currentRoleIndex === data.track.length - 1 || currentRoleIndex <= -1
-                    ) || !allowed[currentRoleIndex]),
-            ])
-        ])})
+            .concat(conflict && conflictDropdown.length ? [new MessageActionRow().addComponents(conflictDropdown)] : [])
+            .concat([
+                new MessageActionRow().addComponents([
+                    new MessageButton()
+                        .setEmoji(getEmojiByName("CONTROL.UP", "id"))
+                        .setLabel("Move up")
+                        .setCustomId("promote")
+                        .setStyle("SUCCESS")
+                        .setDisabled(conflict || currentRoleIndex === 0 || (currentRoleIndex === -1 ? false : !allowed[currentRoleIndex - 1])),
+                    new MessageButton()
+                        .setEmoji(getEmojiByName("CONTROL.DOWN", "id"))
+                        .setLabel("Move down")
+                        .setCustomId("demote")
+                        .setStyle("DANGER")
+                        .setDisabled(conflict || (
+                            data.nullable ? currentRoleIndex <= -1 :
+                                currentRoleIndex === data.track.length - 1 || currentRoleIndex <= -1
+                        ) || !allowed[currentRoleIndex])
+                ])
+            ])});
         let component;
         try {
             component = await (m as Message).awaitMessageComponent({time: 300000});
         } catch (e) {
-            return
+            return;
         }
-        component.deferUpdate()
+        component.deferUpdate();
         if (component.customId === "conflict") {
-            let rolesToRemove = selected.filter(role => role !== component.values[0])
-            await member.roles.remove(rolesToRemove)
+            const rolesToRemove = selected.filter(role => role !== component.values[0]);
+            await member.roles.remove(rolesToRemove);
         } else if (component.customId === "promote") {
             if (
                 currentRoleIndex === -1 ? allowed[data.track.length - 1] :
-                allowed[currentRoleIndex - 1] && allowed[currentRoleIndex]
+                    allowed[currentRoleIndex - 1] && allowed[currentRoleIndex]
             ) {
                 if (currentRoleIndex === -1) {
-                    await member.roles.add(data.track[data.track.length - 1])
+                    await member.roles.add(data.track[data.track.length - 1]);
                 } else if (currentRoleIndex < data.track.length) {
-                    if (!data.retainPrevious) await member.roles.remove(data.track[currentRoleIndex])
-                    await member.roles.add(data.track[currentRoleIndex - 1])
+                    if (!data.retainPrevious) await member.roles.remove(data.track[currentRoleIndex]);
+                    await member.roles.add(data.track[currentRoleIndex - 1]);
                 }
             }
         } else if (component.customId === "demote") {
             if(allowed[currentRoleIndex]) {
                 if (currentRoleIndex === data.track.length - 1) {
-                    if (data.nullable) await member.roles.remove(data.track[currentRoleIndex])
+                    if (data.nullable) await member.roles.remove(data.track[currentRoleIndex]);
                 } else if (currentRoleIndex > -1) {
-                    await member.roles.remove(data.track[currentRoleIndex])
-                    await member.roles.add(data.track[currentRoleIndex + 1])
+                    await member.roles.remove(data.track[currentRoleIndex]);
+                    await member.roles.add(data.track[currentRoleIndex + 1]);
                 }
             }
         } else if (component.customId === "select") {
-            track = component.values[0]
+            track = component.values[0];
         }
     }
-}
+};
 
-const check = async (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
-    let tracks = (await client.database.guilds.read(interaction.guild.id)).tracks
-    if (tracks.length === 0) throw "This server does not have any tracks"
-    let member = (interaction.member as GuildMember)
+const check = async (interaction: CommandInteraction, _defaultCheck: WrappedCheck) => {
+    const tracks = (await client.database.guilds.read(interaction.guild.id)).tracks;
+    if (tracks.length === 0) throw "This server does not have any tracks";
+    const member = (interaction.member as GuildMember);
     // Allow the owner to promote anyone
-    if (member.id === interaction.guild.ownerId) return true
+    if (member.id === interaction.guild.ownerId) return true;
     // Check if the user can manage any of the tracks
-    let managed = false
+    let managed = false;
     for (const element of tracks) {
-        if (!element.track.manageableBy) continue
-        if (!element.track.manageableBy.some(role => member.roles.cache.has(role))) continue
+        if (!element.track.manageableBy) continue;
+        if (!element.track.manageableBy.some(role => member.roles.cache.has(role))) continue;
         managed = true;
         break;
-    };
+    }
     // Check if the user has manage_roles permission
     if (!managed && ! member.permissions.has("MANAGE_ROLES")) throw "You do not have the *Manage Roles* permission";
     // Allow track
     return true;
-}
+};
 
 export { command };
 export { callback };
