diff --git a/src/actions/tickets/create.ts b/src/actions/tickets/create.ts
index f724728..ca5147a 100644
--- a/src/actions/tickets/create.ts
+++ b/src/actions/tickets/create.ts
@@ -6,50 +6,84 @@
 
 function capitalize(s: string) {
     s = s.replace(/([A-Z])/g, " $1");
-    return s.length < 3 ? s.toUpperCase() : s[0].toUpperCase() + s.slice(1).toLowerCase();
+    return s.length < 3
+        ? s.toUpperCase()
+        : s[0].toUpperCase() + s.slice(1).toLowerCase();
 }
 
 export default async function (interaction) {
-    const { log, NucleusColors, entry, renderUser, renderChannel, renderDelta } = client.logger;
+    const {
+        log,
+        NucleusColors,
+        entry,
+        renderUser,
+        renderChannel,
+        renderDelta
+    } = client.logger;
 
     const config = await client.database.guilds.read(interaction.guild.id);
     if (!config.tickets.enabled || !config.tickets.category) {
-        return await interaction.reply({embeds: [new EmojiEmbed()
-            .setTitle("Tickets are disabled")
-            .setDescription("Please enable tickets in the configuration to use this command.")
-            .setFooter({text: interaction.member.permissions.has("MANAGE_GUILD") ? "You can enable it by running /settings tickets" : ""})
-            .setStatus("Danger")
-            .setEmoji("CONTROL.BLOCKCROSS")
-        ], ephemeral: true});
+        return await interaction.reply({
+            embeds: [
+                new EmojiEmbed()
+                    .setTitle("Tickets are disabled")
+                    .setDescription(
+                        "Please enable tickets in the configuration to use this command."
+                    )
+                    .setFooter({
+                        text: interaction.member.permissions.has("MANAGE_GUILD")
+                            ? "You can enable it by running /settings tickets"
+                            : ""
+                    })
+                    .setStatus("Danger")
+                    .setEmoji("CONTROL.BLOCKCROSS")
+            ],
+            ephemeral: true
+        });
     }
-    const category = interaction.guild.channels.cache.get(config.tickets.category) as Discord.CategoryChannel;
+    const category = interaction.guild.channels.cache.get(
+        config.tickets.category
+    ) as Discord.CategoryChannel;
     let count = 0;
-    category.children.forEach(element => {
+    category.children.forEach((element) => {
         if (!(element.type === "GUILD_TEXT")) return;
-        if ((element as Discord.TextChannel).topic.includes(`${interaction.member.user.id}`)) {
+        if (
+            (element as Discord.TextChannel).topic.includes(
+                `${interaction.member.user.id}`
+            )
+        ) {
             if ((element as Discord.TextChannel).topic.endsWith("Active")) {
                 count++;
             }
         }
     });
     if (count >= config.tickets.maxTickets) {
-        return await interaction.reply({embeds: [new EmojiEmbed()
-            .setTitle("Create Ticket")
-            .setDescription(`You have reached the maximum amount of tickets (${config.tickets.maxTickets}). Please close one of your active tickets before creating a new one.`)
-            .setStatus("Danger")
-            .setEmoji("CONTROL.BLOCKCROSS")
-        ], ephemeral: true});
+        return await interaction.reply({
+            embeds: [
+                new EmojiEmbed()
+                    .setTitle("Create Ticket")
+                    .setDescription(
+                        `You have reached the maximum amount of tickets (${config.tickets.maxTickets}). Please close one of your active tickets before creating a new one.`
+                    )
+                    .setStatus("Danger")
+                    .setEmoji("CONTROL.BLOCKCROSS")
+            ],
+            ephemeral: true
+        });
     }
     let ticketTypes;
     let custom = false;
-    if (config.tickets.customTypes && config.tickets.useCustom) { ticketTypes = config.tickets.customTypes; custom = true; }
-    else if (config.tickets.types) ticketTypes = toHexArray(config.tickets.types, tickets);
+    if (config.tickets.customTypes && config.tickets.useCustom) {
+        ticketTypes = config.tickets.customTypes;
+        custom = true;
+    } else if (config.tickets.types)
+        ticketTypes = toHexArray(config.tickets.types, tickets);
     else ticketTypes = [];
     let chosenType;
     let splitFormattedTicketTypes = [];
     if (ticketTypes.length > 0) {
         let formattedTicketTypes = [];
-        formattedTicketTypes = ticketTypes.map(type => {
+        formattedTicketTypes = ticketTypes.map((type) => {
             if (custom) {
                 return new MessageButton()
                     .setLabel(type)
@@ -60,28 +94,43 @@
                     .setLabel(capitalize(type))
                     .setStyle("PRIMARY")
                     .setCustomId(type)
-                    .setEmoji(getEmojiByName(("TICKETS." + type.toString().toUpperCase()), "id"));
+                    .setEmoji(
+                        getEmojiByName(
+                            "TICKETS." + type.toString().toUpperCase(),
+                            "id"
+                        )
+                    );
             }
         });
         for (let i = 0; i < formattedTicketTypes.length; i += 5) {
-            splitFormattedTicketTypes.push(new MessageActionRow().addComponents(formattedTicketTypes.slice(i, i + 5)));
+            splitFormattedTicketTypes.push(
+                new MessageActionRow().addComponents(
+                    formattedTicketTypes.slice(i, i + 5)
+                )
+            );
         }
-        const m = await interaction.reply({embeds: [new EmojiEmbed()
-            .setTitle("Create Ticket")
-            .setDescription("Select a ticket type")
-            .setStatus("Success")
-            .setEmoji("GUILD.TICKET.OPEN")
-        ], ephemeral: true, fetchReply: true, components: splitFormattedTicketTypes});
+        const m = await interaction.reply({
+            embeds: [
+                new EmojiEmbed()
+                    .setTitle("Create Ticket")
+                    .setDescription("Select a ticket type")
+                    .setStatus("Success")
+                    .setEmoji("GUILD.TICKET.OPEN")
+            ],
+            ephemeral: true,
+            fetchReply: true,
+            components: splitFormattedTicketTypes
+        });
         let component;
         try {
-            component = await m.awaitMessageComponent({time: 300000});
+            component = await m.awaitMessageComponent({ time: 300000 });
         } catch (e) {
             return;
         }
         chosenType = component.customId;
         splitFormattedTicketTypes = [];
         formattedTicketTypes = [];
-        formattedTicketTypes = ticketTypes.map(type => {
+        formattedTicketTypes = ticketTypes.map((type) => {
             if (custom) {
                 return new MessageButton()
                     .setLabel(type)
@@ -93,31 +142,57 @@
                     .setLabel(capitalize(type))
                     .setStyle(chosenType === type ? "SUCCESS" : "SECONDARY")
                     .setCustomId(type)
-                    .setEmoji(getEmojiByName(("TICKETS." + type.toString().toUpperCase()), "id"))
+                    .setEmoji(
+                        getEmojiByName(
+                            "TICKETS." + type.toString().toUpperCase(),
+                            "id"
+                        )
+                    )
                     .setDisabled(true);
             }
         });
         for (let i = 0; i < formattedTicketTypes.length; i += 5) {
-            splitFormattedTicketTypes.push(new MessageActionRow().addComponents(formattedTicketTypes.slice(i, i + 5)));
+            splitFormattedTicketTypes.push(
+                new MessageActionRow().addComponents(
+                    formattedTicketTypes.slice(i, i + 5)
+                )
+            );
         }
-        component.update({embeds: [new EmojiEmbed()
-            .setTitle("Create Ticket")
-            .setDescription("Select a ticket type")
-            .setStatus("Success")
-            .setEmoji("GUILD.TICKET.OPEN")
-        ], components: splitFormattedTicketTypes});
+        component.update({
+            embeds: [
+                new EmojiEmbed()
+                    .setTitle("Create Ticket")
+                    .setDescription("Select a ticket type")
+                    .setStatus("Success")
+                    .setEmoji("GUILD.TICKET.OPEN")
+            ],
+            components: splitFormattedTicketTypes
+        });
     } else {
         chosenType = null;
-        await interaction.reply({embeds: [new EmojiEmbed()
-            .setTitle("Create Ticket")
-            .setEmoji("GUILD.TICKET.OPEN")
-        ], ephemeral: true, components: splitFormattedTicketTypes});
+        await interaction.reply({
+            embeds: [
+                new EmojiEmbed()
+                    .setTitle("Create Ticket")
+                    .setEmoji("GUILD.TICKET.OPEN")
+            ],
+            ephemeral: true,
+            components: splitFormattedTicketTypes
+        });
     }
-    const overwrites = [{
-        id: interaction.member,
-        allow: ["VIEW_CHANNEL", "SEND_MESSAGES", "ATTACH_FILES", "ADD_REACTIONS", "READ_MESSAGE_HISTORY"],
-        type: "member"
-    }] as Discord.OverwriteResolvable[];
+    const overwrites = [
+        {
+            id: interaction.member,
+            allow: [
+                "VIEW_CHANNEL",
+                "SEND_MESSAGES",
+                "ATTACH_FILES",
+                "ADD_REACTIONS",
+                "READ_MESSAGE_HISTORY"
+            ],
+            type: "member"
+        }
+    ] as Discord.OverwriteResolvable[];
     overwrites.push({
         id: interaction.guild.roles.everyone,
         deny: ["VIEW_CHANNEL"],
@@ -126,60 +201,93 @@
     if (config.tickets.supportRole !== null) {
         overwrites.push({
             id: interaction.guild.roles.cache.get(config.tickets.supportRole),
-            allow: ["VIEW_CHANNEL", "SEND_MESSAGES", "ATTACH_FILES", "ADD_REACTIONS", "READ_MESSAGE_HISTORY"],
+            allow: [
+                "VIEW_CHANNEL",
+                "SEND_MESSAGES",
+                "ATTACH_FILES",
+                "ADD_REACTIONS",
+                "READ_MESSAGE_HISTORY"
+            ],
             type: "role"
         });
     }
 
     let c;
     try {
-        c = await interaction.guild.channels.create(interaction.member.user.username, {
-            type: "GUILD_TEXT",
-            topic: `${interaction.member.user.id} Active`,
-            parent: config.tickets.category,
-            nsfw: false,
-            permissionOverwrites: (overwrites as Discord.OverwriteResolvable[]),
-            reason: "Creating ticket"
-        });
-    } catch (e) {
-        return await interaction.editReply({embeds: [new EmojiEmbed()
-            .setTitle("Create Ticket")
-            .setDescription("Failed to create ticket")
-            .setStatus("Danger")
-            .setEmoji("CONTROL.BLOCKCROSS")
-        ]});
-    }
-    try {
-        await c.send(
+        c = await interaction.guild.channels.create(
+            interaction.member.user.username,
             {
-                content: (`<@${interaction.member.user.id}>` + (config.tickets.supportRole !== null ? ` • <@&${config.tickets.supportRole}>` : "")),
-                allowedMentions: {
-                    users: [(interaction.member as Discord.GuildMember).id],
-                    roles: (config.tickets.supportRole !== null ? [config.tickets.supportRole] : [])
-                }
+                type: "GUILD_TEXT",
+                topic: `${interaction.member.user.id} Active`,
+                parent: config.tickets.category,
+                nsfw: false,
+                permissionOverwrites:
+                    overwrites as Discord.OverwriteResolvable[],
+                reason: "Creating ticket"
             }
         );
-        let content = interaction.options ? interaction.options.getString("message") || "" : "";
+    } catch (e) {
+        return await interaction.editReply({
+            embeds: [
+                new EmojiEmbed()
+                    .setTitle("Create Ticket")
+                    .setDescription("Failed to create ticket")
+                    .setStatus("Danger")
+                    .setEmoji("CONTROL.BLOCKCROSS")
+            ]
+        });
+    }
+    try {
+        await c.send({
+            content:
+                `<@${interaction.member.user.id}>` +
+                (config.tickets.supportRole !== null
+                    ? ` • <@&${config.tickets.supportRole}>`
+                    : ""),
+            allowedMentions: {
+                users: [(interaction.member as Discord.GuildMember).id],
+                roles:
+                    config.tickets.supportRole !== null
+                        ? [config.tickets.supportRole]
+                        : []
+            }
+        });
+        let content = interaction.options
+            ? interaction.options.getString("message") || ""
+            : "";
         if (content) content = `**Message:**\n> ${content}\n`;
-        const emoji = custom ? "" : getEmojiByName("TICKETS." + chosenType.toUpperCase());
-        await c.send({ embeds: [new EmojiEmbed()
-            .setTitle("New Ticket")
-            .setDescription(
-                `Ticket created by <@${interaction.member.user.id}>\n` +
-                `**Support type:** ${chosenType !== null ? (emoji) + " " + capitalize(chosenType) : "General"}\n` +
-                `**Ticket ID:** \`${c.id}\`\n${content}\n` +
-                "Type `/ticket close` to close this ticket."
-            )
-            .setStatus("Success")
-            .setEmoji("GUILD.TICKET.OPEN")
-        ], components: [new MessageActionRow().addComponents([new MessageButton()
-            .setLabel("Close")
-            .setStyle("DANGER")
-            .setCustomId("closeticket")
-            .setEmoji(getEmojiByName("CONTROL.CROSS", "id"))
-        ])]});
+        const emoji = custom
+            ? ""
+            : getEmojiByName("TICKETS." + chosenType.toUpperCase());
+        await c.send({
+            embeds: [
+                new EmojiEmbed()
+                    .setTitle("New Ticket")
+                    .setDescription(
+                        `Ticket created by <@${interaction.member.user.id}>\n` +
+                            `**Support type:** ${
+                                chosenType !== null
+                                    ? emoji + " " + capitalize(chosenType)
+                                    : "General"
+                            }\n` +
+                            `**Ticket ID:** \`${c.id}\`\n${content}\n` +
+                            "Type `/ticket close` to close this ticket."
+                    )
+                    .setStatus("Success")
+                    .setEmoji("GUILD.TICKET.OPEN")
+            ],
+            components: [
+                new MessageActionRow().addComponents([
+                    new MessageButton()
+                        .setLabel("Close")
+                        .setStyle("DANGER")
+                        .setCustomId("closeticket")
+                        .setEmoji(getEmojiByName("CONTROL.CROSS", "id"))
+                ])
+            ]
+        });
         const data = {
-            meta:{
+            meta: {
                 type: "ticketCreate",
                 displayName: "Ticket Created",
                 calculateType: "ticketUpdate",
@@ -188,8 +296,14 @@
                 timestamp: new Date().getTime()
             },
             list: {
-                ticketFor: entry(interaction.member.user.id, renderUser(interaction.member.user)),
-                created: entry(new Date().getTime(), renderDelta(new Date().getTime())),
+                ticketFor: entry(
+                    interaction.member.user.id,
+                    renderUser(interaction.member.user)
+                ),
+                created: entry(
+                    new Date().getTime(),
+                    renderDelta(new Date().getTime())
+                ),
                 ticketChannel: entry(c.id, renderChannel(c))
             },
             hidden: {
@@ -197,11 +311,19 @@
             }
         };
         log(data);
-    } catch (e) { console.log(e);}
-    await interaction.editReply({embeds: [new EmojiEmbed()
-        .setTitle("Create Ticket")
-        .setDescription(`Ticket created. You can view it here: <#${c.id}>`)
-        .setStatus("Success")
-        .setEmoji("GUILD.TICKET.OPEN")
-    ], components: splitFormattedTicketTypes});
-}
\ No newline at end of file
+    } catch (e) {
+        console.log(e);
+    }
+    await interaction.editReply({
+        embeds: [
+            new EmojiEmbed()
+                .setTitle("Create Ticket")
+                .setDescription(
+                    `Ticket created. You can view it here: <#${c.id}>`
+                )
+                .setStatus("Success")
+                .setEmoji("GUILD.TICKET.OPEN")
+        ],
+        components: splitFormattedTicketTypes
+    });
+}
diff --git a/src/actions/tickets/delete.ts b/src/actions/tickets/delete.ts
index e5c017f..6509c03 100644
--- a/src/actions/tickets/delete.ts
+++ b/src/actions/tickets/delete.ts
@@ -4,31 +4,53 @@
 import getEmojiByName from "../../utils/getEmojiByName.js";
 
 export default async function (interaction) {
-    const { log, NucleusColors, entry, renderUser, renderChannel, renderDelta } = client.logger;
+    const {
+        log,
+        NucleusColors,
+        entry,
+        renderUser,
+        renderChannel,
+        renderDelta
+    } = client.logger;
 
     const config = await client.database.guilds.read(interaction.guild.id);
     let thread = false;
     if (interaction.channel instanceof Discord.ThreadChannel) thread = true;
     const threadChannel = interaction.channel as Discord.ThreadChannel;
-    const channel = (interaction.channel as Discord.TextChannel);
-    if (!channel.parent || config.tickets.category !== channel.parent.id || (thread ? (threadChannel.parent.parent.id !== config.tickets.category) : false)) {
-        return interaction.reply({embeds: [new EmojiEmbed()
-            .setTitle("Deleting Ticket...")
-            .setDescription("This ticket is not in your tickets category, so cannot be deleted. You cannot run close in a thread.")
-            .setStatus("Danger")
-            .setEmoji("CONTROL.BLOCKCROSS")
-        ], ephemeral: true});
+    const channel = interaction.channel as Discord.TextChannel;
+    if (
+        !channel.parent ||
+        config.tickets.category !== channel.parent.id ||
+        (thread
+            ? threadChannel.parent.parent.id !== config.tickets.category
+            : false)
+    ) {
+        return interaction.reply({
+            embeds: [
+                new EmojiEmbed()
+                    .setTitle("Deleting Ticket...")
+                    .setDescription(
+                        "This ticket is not in your tickets category, so cannot be deleted. You cannot run close in a thread."
+                    )
+                    .setStatus("Danger")
+                    .setEmoji("CONTROL.BLOCKCROSS")
+            ],
+            ephemeral: true
+        });
     }
     const status = channel.topic.split(" ")[1];
     if (status === "Archived") {
-        await interaction.reply({embeds: [new EmojiEmbed()
-            .setTitle("Delete Ticket")
-            .setDescription("Your ticket is being deleted...")
-            .setStatus("Danger")
-            .setEmoji("GUILD.TICKET.CLOSE")
-        ]});
+        await interaction.reply({
+            embeds: [
+                new EmojiEmbed()
+                    .setTitle("Delete Ticket")
+                    .setDescription("Your ticket is being deleted...")
+                    .setStatus("Danger")
+                    .setEmoji("GUILD.TICKET.CLOSE")
+            ]
+        });
         const data = {
-            meta:{
+            meta: {
                 type: "ticketDeleted",
                 displayName: "Ticket Deleted",
                 calculateType: "ticketUpdate",
@@ -37,9 +59,24 @@
                 timestamp: new Date().getTime()
             },
             list: {
-                ticketFor: entry(channel.topic.split(" ")[0], renderUser((await interaction.guild.members.fetch(channel.topic.split(" ")[0])).user)),
-                deletedBy: entry(interaction.member.user.id, renderUser(interaction.member.user)),
-                deleted: entry(new Date().getTime(), renderDelta(new Date().getTime()))
+                ticketFor: entry(
+                    channel.topic.split(" ")[0],
+                    renderUser(
+                        (
+                            await interaction.guild.members.fetch(
+                                channel.topic.split(" ")[0]
+                            )
+                        ).user
+                    )
+                ),
+                deletedBy: entry(
+                    interaction.member.user.id,
+                    renderUser(interaction.member.user)
+                ),
+                deleted: entry(
+                    new Date().getTime(),
+                    renderDelta(new Date().getTime())
+                )
             },
             hidden: {
                 guild: interaction.guild.id
@@ -49,12 +86,15 @@
         interaction.channel.delete();
         return;
     } else if (status === "Active") {
-        await interaction.reply({embeds: [new EmojiEmbed()
-            .setTitle("Close Ticket")
-            .setDescription("Your ticket is being closed...")
-            .setStatus("Warning")
-            .setEmoji("GUILD.TICKET.ARCHIVED")
-        ]});
+        await interaction.reply({
+            embeds: [
+                new EmojiEmbed()
+                    .setTitle("Close Ticket")
+                    .setDescription("Your ticket is being closed...")
+                    .setStatus("Warning")
+                    .setEmoji("GUILD.TICKET.ARCHIVED")
+            ]
+        });
         const overwrites = [
             {
                 id: channel.topic.split(" ")[0],
@@ -69,15 +109,23 @@
         ] as Discord.OverwriteResolvable[];
         if (config.tickets.supportRole !== null) {
             overwrites.push({
-                id: interaction.guild.roles.cache.get(config.tickets.supportRole),
-                allow: ["VIEW_CHANNEL", "SEND_MESSAGES", "ATTACH_FILES", "ADD_REACTIONS", "READ_MESSAGE_HISTORY"],
+                id: interaction.guild.roles.cache.get(
+                    config.tickets.supportRole
+                ),
+                allow: [
+                    "VIEW_CHANNEL",
+                    "SEND_MESSAGES",
+                    "ATTACH_FILES",
+                    "ADD_REACTIONS",
+                    "READ_MESSAGE_HISTORY"
+                ],
                 type: "role"
             });
         }
-        channel.edit({permissionOverwrites: overwrites});
+        channel.edit({ permissionOverwrites: overwrites });
         channel.setTopic(`${channel.topic.split(" ")[0]} Archived`);
         const data = {
-            meta:{
+            meta: {
                 type: "ticketClosed",
                 displayName: "Ticket Closed",
                 calculateType: "ticketUpdate",
@@ -86,9 +134,24 @@
                 timestamp: new Date().getTime()
             },
             list: {
-                ticketFor: entry(channel.topic.split(" ")[0], renderUser((await interaction.guild.members.fetch(channel.topic.split(" ")[0])).user)),
-                closedBy: entry(interaction.member.user.id, renderUser(interaction.member.user)),
-                closed: entry(new Date().getTime(), renderDelta(new Date().getTime())),
+                ticketFor: entry(
+                    channel.topic.split(" ")[0],
+                    renderUser(
+                        (
+                            await interaction.guild.members.fetch(
+                                channel.topic.split(" ")[0]
+                            )
+                        ).user
+                    )
+                ),
+                closedBy: entry(
+                    interaction.member.user.id,
+                    renderUser(interaction.member.user)
+                ),
+                closed: entry(
+                    new Date().getTime(),
+                    renderDelta(new Date().getTime())
+                ),
                 ticketChannel: entry(channel.id, renderChannel(channel))
             },
             hidden: {
@@ -96,26 +159,43 @@
             }
         };
         log(data);
-        await interaction.editReply({embeds: [new EmojiEmbed()
-            .setTitle("Close Ticket")
-            .setDescription("This ticket has been closed.\nType `/ticket close` again to delete it.\n\nNote: Check `/privacy` for details about transcripts.")
-            .setStatus("Warning")
-            .setEmoji("GUILD.TICKET.ARCHIVED")
-        ], components: [
-            new MessageActionRow().addComponents([
-                new MessageButton()
-                    .setLabel("Delete")
-                    .setStyle("DANGER")
-                    .setCustomId("closeticket")
-                    .setEmoji(getEmojiByName("CONTROL.CROSS", "id"))
-            ].concat(client.database.premium.hasPremium(interaction.guild.id) ? [
-                new MessageButton()
-                    .setLabel("Create Transcript and Delete")
-                    .setStyle("PRIMARY")
-                    .setCustomId("createtranscript")
-                    .setEmoji(getEmojiByName("CONTROL.DOWNLOAD", "id"))
-            ] : []))
-        ]});
+        await interaction.editReply({
+            embeds: [
+                new EmojiEmbed()
+                    .setTitle("Close Ticket")
+                    .setDescription(
+                        "This ticket has been closed.\nType `/ticket close` again to delete it.\n\nNote: Check `/privacy` for details about transcripts."
+                    )
+                    .setStatus("Warning")
+                    .setEmoji("GUILD.TICKET.ARCHIVED")
+            ],
+            components: [
+                new MessageActionRow().addComponents(
+                    [
+                        new MessageButton()
+                            .setLabel("Delete")
+                            .setStyle("DANGER")
+                            .setCustomId("closeticket")
+                            .setEmoji(getEmojiByName("CONTROL.CROSS", "id"))
+                    ].concat(
+                        client.database.premium.hasPremium(interaction.guild.id)
+                            ? [
+                                  new MessageButton()
+                                      .setLabel("Create Transcript and Delete")
+                                      .setStyle("PRIMARY")
+                                      .setCustomId("createtranscript")
+                                      .setEmoji(
+                                          getEmojiByName(
+                                              "CONTROL.DOWNLOAD",
+                                              "id"
+                                          )
+                                      )
+                              ]
+                            : []
+                    )
+                )
+            ]
+        });
         return;
     }
 }
@@ -127,19 +207,22 @@
     if (!tickets) return;
     const ticketChannels = tickets.children;
     let deleted = 0;
-    ticketChannels.forEach(element => {
+    ticketChannels.forEach((element) => {
         if (element.type !== "GUILD_TEXT") return;
         if (element.topic.split(" ")[0] === member) {
             try {
                 element.delete();
-            } catch { /* Errors if the channel does not exist (deleted already) */ }
+            } catch {
+                /* Errors if the channel does not exist (deleted already) */
+            }
             deleted++;
         }
     });
     if (deleted) {
-        const { log, NucleusColors, entry, renderUser, renderDelta } = member.client.logger;
+        const { log, NucleusColors, entry, renderUser, renderDelta } =
+            member.client.logger;
         const data = {
-            meta:{
+            meta: {
                 type: "ticketPurge",
                 displayName: "Tickets Purged",
                 calculateType: "ticketUpdate",
@@ -150,7 +233,10 @@
             list: {
                 ticketFor: entry(member, renderUser(member)),
                 deletedBy: entry(null, "Member left server"),
-                deleted: entry(new Date().getTime(), renderDelta(new Date().getTime())),
+                deleted: entry(
+                    new Date().getTime(),
+                    renderDelta(new Date().getTime())
+                ),
                 ticketsDeleted: deleted
             },
             hidden: {
@@ -161,4 +247,4 @@
     }
 }
 
-export { purgeByUser };
\ No newline at end of file
+export { purgeByUser };
