resetting linux lol
diff --git a/src/events/channelCreate.ts b/src/events/channelCreate.ts
index 3bde0f2..2d48255 100644
--- a/src/events/channelCreate.ts
+++ b/src/events/channelCreate.ts
@@ -55,7 +55,7 @@
                 timestamp: channel.createdTimestamp
             },
             list: {
-                id: entry(channel.id, `\`${channel.id}\``),
+                channelId: entry(channel.id, `\`${channel.id}\``),
                 name: entry(channel.name, renderChannel(channel)),
                 type: entry(channel.type, readableType),
                 category: entry(channel.parent ? channel.parent.id : null, channel.parent ? channel.parent.name : "Uncategorised"),
diff --git a/src/events/channelDelete.ts b/src/events/channelDelete.ts
index 2188141..5c7139a 100644
--- a/src/events/channelDelete.ts
+++ b/src/events/channelDelete.ts
@@ -39,7 +39,7 @@
             }
         }
         let list = {
-            id: entry(channel.id, `\`${channel.id}\``),
+            channelIid: entry(channel.id, `\`${channel.id}\``),
             name: entry(channel.id, `${channel.name}`),
             topic: null,
             type: entry(channel.type, readableType),
diff --git a/src/events/channelUpdate.ts b/src/events/channelUpdate.ts
index 560ca11..50a3de1 100644
--- a/src/events/channelUpdate.ts
+++ b/src/events/channelUpdate.ts
@@ -18,7 +18,7 @@
         let readableType:string;
         let displayName:string ;
         let changes = {
-            id: entry(nc.id, `\`${nc.id}\``),
+            channelId: entry(nc.id, `\`${nc.id}\``),
             channel: entry(nc.id, renderChannel(nc)),
             edited: entry(new Date().getTime(), renderDelta(new Date().getTime())),
             editedBy: entry(audit.executor.id, renderUser((await nc.guild.members.fetch(audit.executor.id)).user)),
diff --git a/src/events/emojiCreate.ts b/src/events/emojiCreate.ts
index 1048869..25d1b62 100644
--- a/src/events/emojiCreate.ts
+++ b/src/events/emojiCreate.ts
@@ -16,7 +16,7 @@
                 timestamp: emoji.createdTimestamp
             },
             list: {
-                id: entry(emoji.id, `\`${emoji.id}\``),
+                emojiId: entry(emoji.id, `\`${emoji.id}\``),
                 emoji: entry(emoji.name, renderEmoji(emoji)),
                 createdBy: entry(audit.executor.id, renderUser(audit.executor)),
                 created: entry(emoji.createdTimestamp, renderDelta(emoji.createdTimestamp))
diff --git a/src/events/emojiDelete.ts b/src/events/emojiDelete.ts
index 02bec0d..2dcb685 100644
--- a/src/events/emojiDelete.ts
+++ b/src/events/emojiDelete.ts
@@ -16,7 +16,7 @@
                 timestamp: audit.createdTimestamp,
             },
             list: {
-                id: entry(emoji.id, `\`${emoji.id}\``),
+                emojiId: entry(emoji.id, `\`${emoji.id}\``),
                 emoji: entry(emoji.name, renderEmoji(emoji)),
                 deletedBy: entry(audit.executor.id, renderUser(audit.executor)),
                 created: entry(emoji.createdTimestamp, renderDelta(emoji.createdTimestamp)),
diff --git a/src/events/emojiUpdate.ts b/src/events/emojiUpdate.ts
index eb39cb9..79fb171 100644
--- a/src/events/emojiUpdate.ts
+++ b/src/events/emojiUpdate.ts
@@ -12,7 +12,7 @@
         if (audit.executor.id == client.user.id) return;
 
         let changes = {
-            id: entry(ne.id, `\`${ne.id}\``),
+            emojiId: entry(ne.id, `\`${ne.id}\``),
             emoji: entry(ne.id, renderEmoji(ne)),
             edited: entry(ne.createdTimestamp, renderDelta(ne.createdTimestamp)),
             editedBy: entry(audit.executor.id, renderUser((await ne.guild.members.fetch(audit.executor.id)).user)),
diff --git a/src/events/guildBanAdd.ts b/src/events/guildBanAdd.ts
index a1848fd..05b98ed 100644
--- a/src/events/guildBanAdd.ts
+++ b/src/events/guildBanAdd.ts
@@ -22,7 +22,7 @@
                 timestamp: new Date().getTime()
             },
             list: {
-                id: entry(ban.user.id, `\`${ban.user.id}\``),
+                memberId: entry(ban.user.id, `\`${ban.user.id}\``),
                 name: entry(ban.user.id, renderUser(ban.user)),
                 banned: entry(new Date().getTime(), renderDelta(new Date().getTime())),
                 bannedBy: entry(audit.executor.id, renderUser(audit.executor)),
diff --git a/src/events/guildBanRemove.ts b/src/events/guildBanRemove.ts
index 59fbf7a..85dc2af 100644
--- a/src/events/guildBanRemove.ts
+++ b/src/events/guildBanRemove.ts
@@ -23,7 +23,7 @@
                 timestamp: new Date().getTime()
             },
             list: {
-                id: entry(ban.user.id, `\`${ban.user.id}\``),
+                memberId: entry(ban.user.id, `\`${ban.user.id}\``),
                 name: entry(ban.user.id, renderUser(ban.user)),
                 unbanned: entry(new Date().getTime(), renderDelta(new Date().getTime())),
                 unbannedBy: entry(audit.executor.id, renderUser(audit.executor)),
diff --git a/src/events/guildMemberUpdate.ts b/src/events/guildMemberUpdate.ts
index 2175aaf..dab89fa 100644
--- a/src/events/guildMemberUpdate.ts
+++ b/src/events/guildMemberUpdate.ts
@@ -23,7 +23,7 @@
                     timestamp: new Date().getTime()
                 },
                 list: {
-                    id: entry(after.id, `\`${after.id}\``),
+                    memberId: entry(after.id, `\`${after.id}\``),
                     before: entry(before.nickname, before.nickname ? before.nickname : '*None*'),
                     after: entry(after.nickname, after.nickname ? after.nickname : '*None*'),
                     updated: entry(new Date().getTime(), renderDelta(new Date().getTime())),
diff --git a/src/events/memberJoin.ts b/src/events/memberJoin.ts
index f3c4d18..2031b12 100644
--- a/src/events/memberJoin.ts
+++ b/src/events/memberJoin.ts
@@ -21,7 +21,7 @@
                 timestamp: member.joinedTimestamp
             },
             list: {
-                id: entry(member.id, `\`${member.id}\``),
+                memberId: entry(member.id, `\`${member.id}\``),
                 name: entry(member.id, renderUser(member.user)),
                 joined: entry(member.joinedAt, renderDelta(member.joinedAt)),
                 accountCreated: entry(member.user.createdAt, renderDelta(member.user.createdAt)),
diff --git a/src/events/memberLeave.ts b/src/events/memberLeave.ts
index 43e78bd..b9d6e84 100644
--- a/src/events/memberLeave.ts
+++ b/src/events/memberLeave.ts
@@ -31,7 +31,7 @@
                     timestamp: new Date().getTime()
                 },
                 list: {
-                    id: entry(member.id, `\`${member.id}\``),
+                    memberId: entry(member.id, `\`${member.id}\``),
                     name: entry(member.id, renderUser(member.user)),
                     joined: entry(member.joinedAt, renderDelta(member.joinedAt)),
                     kicked: entry(new Date().getTime(), renderDelta(new Date().getTime())),
@@ -57,7 +57,7 @@
                     timestamp: new Date().getTime()
                 },
                 list: {
-                    id: entry(member.id, `\`${member.id}\``),
+                    memberId: entry(member.id, `\`${member.id}\``),
                     name: entry(member.id, renderUser(member.user)),
                     joined: entry(member.joinedTimestamp, renderDelta(member.joinedAt)),
                     left: entry(new Date().getTime(), renderDelta(new Date().getTime())),
diff --git a/src/events/messageChecks.ts b/src/events/messageChecks.ts
index 4e99c61..2755ff1 100644
--- a/src/events/messageChecks.ts
+++ b/src/events/messageChecks.ts
@@ -1,9 +1,11 @@
 import { LinkCheck, MalwareCheck, NSFWCheck, SizeCheck, TestString, TestImage } from '../automations/unscan.js'
 import { Message } from 'discord.js'
+import client from '../utils/client.js'
 
 export const event = 'messageCreate'
 
 export async function callback(client, message) {
+    const { log, NucleusColors, entry, renderUser } = client.logger
     if (message.author.bot) return
     if (message.channel.type === 'dm') return
 
@@ -16,8 +18,7 @@
             !message.author.roles.cache.some(role => config.filters.invite.allowed.roles.includes(role.id))
         ) {
             if ((/(?:https?:\/\/)?discord(?:app)?\.(?:com\/invite|gg)\/[a-zA-Z0-9]+\/?/.test(content))) {
-                message.delete();
-                return toLog(message, 'invite', content.match(/(?:https?:\/\/)?discord(?:app)?\.(?:com\/invite|gg)\/[a-zA-Z0-9]+\/?/))
+                return message.delete();
             }
         }
     }
@@ -34,22 +35,19 @@
                 if(/\.+(webp|png|jpg|jpeg|bmp)/.test(url)) {
                     if (config.filters.images.NSFW && !message.channel.nsfw) {
                         if (await NSFWCheck(url)) {
-                            await message.delete()
-                            return toLog(message, 'NSFW', url)
+                            return await message.delete()
                         }
                     }
                     if (config.filters.images.size) {
                         if(!url.match(/\.+(webp|png|jpg)$/gi)) return
                         if(!await SizeCheck(element)) {
-                            await message.delete()
-                            return toLog(message, 'size', url)
+                            return await message.delete()
                         }
                     }
                 }
                 if (config.filters.malware) {
                     if (!MalwareCheck(url)) {
-                        await message.delete()
-                        return toLog(message, 'malware', url)
+                        return await message.delete()
                     }
                 }
             }
@@ -58,15 +56,13 @@
     if(!message) return;
 
     if (await LinkCheck(message)) {
-        await message.delete()
-        return toLog(message, 'link')
+        return await message.delete()
     }
 
     if (config.filters.wordFilter.enabled) {
         let check = TestString(content, config.filters.wordFilter.words.loose, config.filters.wordFilter.words.strict)
-        if(check != "none") {
-            await message.delete()
-            return toLog(message, 'wordFilter', content)
+        if(check !== null) {
+            return await message.delete()
         }
     }
 
@@ -75,26 +71,19 @@
         !message.author.roles.cache.some(role => config.filters.pings.allowed.roles.includes(role.id))
     ) {
         if (config.filters.pings.everyone && message.mentions.everyone) {
-            message.delete();
-            return toLog(message, 'mention everyone')
+            return message.delete();
         }
         if (config.filters.pings.roles) {
             for(let role of message.mentions.roles) {
                 if(!message) return;
                 if (!config.filters.pings.allowed.roles.includes(role.id)) {
-                    message.delete();
-                    return toLog(message, 'mention role')
+                    return message.delete();
                 }
             }
         }
         if(!message) return;
         if (message.mentions.users.size >= config.filters.pings.mass && config.filters.pings.mass) {
-            message.delete();
-            return toLog(message, 'Mass Pings')
+            return message.delete();
         }
     }
 }
-
-async function toLog(message: Message, reason: string, data?: any) {
-    // log(message.guild.id, {type: reason, data: data})
-}
diff --git a/src/events/messageDelete.ts b/src/events/messageDelete.ts
index 229b126..f0fbb57 100644
--- a/src/events/messageDelete.ts
+++ b/src/events/messageDelete.ts
@@ -25,7 +25,7 @@
                 start: content ? `**Message:**\n\`\`\`${content}\`\`\`` : '**Message:** *Message had no content*',
             },
             list: {
-                id: entry(message.id, `\`${message.id}\``),
+                messageId: entry(message.id, `\`${message.id}\``),
                 sentBy: entry(message.author.id, renderUser(message.author)),
                 sentIn: entry(message.channel.id, renderChannel(message.channel)),
                 deleted: entry(new Date().getTime(), renderDelta(new Date().getTime())),
diff --git a/src/events/messageEdit.ts b/src/events/messageEdit.ts
index 0d42fb9..3502963 100644
--- a/src/events/messageEdit.ts
+++ b/src/events/messageEdit.ts
@@ -7,7 +7,37 @@
         newMessage.reference = newMessage.reference || {}
         let newContent = newMessage.cleanContent.replaceAll("`", "‘")
         let oldContent = oldMessage.cleanContent.replaceAll("`", "‘")
-        if (newContent == oldContent) return;
+        if (newContent == oldContent) {
+            if (!oldMessage.flags.has("CROSSPOSTED") && newMessage.flags.has("CROSSPOSTED")) {
+                let data = {
+                    meta: {
+                        type: 'messageAnnounce',
+                        displayName: 'Message Published',
+                        calculateType: 'messageAnnounce',
+                        color: NucleusColors.yellow,
+                        emoji: 'MESSAGE.CREATE',
+                        timestamp: newMessage.editedTimestamp
+                    },
+                    separate: {
+                        end: `[[Jump to message]](${newMessage.url})`
+                    },
+                    list: {
+                        messageId: entry(newMessage.id, `\`${newMessage.id}\``),
+                        sentBy: entry(newMessage.author.id, renderUser(newMessage.author)),
+                        sentIn: entry(newMessage.channel.id, renderChannel(newMessage.channel)),
+                        sent: entry(new Date(newMessage.createdTimestamp), renderDelta(new Date(newMessage.createdTimestamp))),
+                        published: entry(new Date(newMessage.editedTimestamp), renderDelta(new Date(newMessage.editedTimestamp))),
+                        mentions: renderNumberDelta(oldMessage.mentions.users.size, newMessage.mentions.users.size),
+                        attachments: renderNumberDelta(oldMessage.attachments.size, newMessage.attachments.size)
+                    },
+                    hidden: {
+                        guild: newMessage.channel.guild.id
+                    }
+                }
+                log(data);
+            }
+            return
+        };
         if (newContent.length > 256) newContent = newContent.substring(0, 253) + '...'
         if (oldContent.length > 256) oldContent = oldContent.substring(0, 253) + '...'
         let data = {
@@ -25,7 +55,7 @@
                 end: `[[Jump to message]](${newMessage.url})`
             },
             list: {
-                id: entry(newMessage.id, `\`${newMessage.id}\``),
+                messageId: entry(newMessage.id, `\`${newMessage.id}\``),
                 sentBy: entry(newMessage.author.id, renderUser(newMessage.author)),
                 sentIn: entry(newMessage.channel.id, renderChannel(newMessage.channel)),
                 sent: entry(new Date(newMessage.createdTimestamp), renderDelta(new Date(newMessage.createdTimestamp))),
diff --git a/src/events/roleCreate.ts b/src/events/roleCreate.ts
index 61d0a87..6fded26 100644
--- a/src/events/roleCreate.ts
+++ b/src/events/roleCreate.ts
@@ -17,7 +17,7 @@
                 timestamp: role.createdTimestamp
             },
             list: {
-                id: entry(role.id, `\`${role.id}\``),
+                roleId: entry(role.id, `\`${role.id}\``),
                 role: entry(role.name, renderRole(role)),
                 createdBy: entry(audit.executor.id, renderUser(audit.executor)),
                 created: entry(role.createdTimestamp, renderDelta(role.createdTimestamp))
diff --git a/src/events/roleDelete.ts b/src/events/roleDelete.ts
index b0cb0f7..6a23d9e 100644
--- a/src/events/roleDelete.ts
+++ b/src/events/roleDelete.ts
@@ -19,7 +19,7 @@
                 timestamp: audit.createdTimestamp,
             },
             list: {
-                id: entry(role.id, `\`${role.id}\``),
+                roleId: entry(role.id, `\`${role.id}\``),
                 role: entry(role.name, role.name),
                 color: entry(role.hexColor, `\`${role.hexColor}\``),
                 showInMemberList: entry(role.hoist, role.hoist ? `${getEmojiByName("CONTROL.TICK")} Yes` : `${getEmojiByName("CONTROL.CROSS")} No`),
diff --git a/src/events/roleUpdate.ts b/src/events/roleUpdate.ts
index 982d915..baf4399 100644
--- a/src/events/roleUpdate.ts
+++ b/src/events/roleUpdate.ts
@@ -11,7 +11,7 @@
         if (audit.executor.id == client.user.id) return;
 
         let changes = {
-            id: entry(nr.id, `\`${nr.id}\``),
+            roleId: entry(nr.id, `\`${nr.id}\``),
             role: entry(nr.id, renderRole(nr)),
             edited: entry(nr.createdTimestamp, renderDelta(nr.createdTimestamp)),
             editedBy: entry(audit.executor.id, renderUser((await nr.guild.members.fetch(audit.executor.id)).user)),
diff --git a/src/events/stickerCreate.ts b/src/events/stickerCreate.ts
new file mode 100644
index 0000000..b9511b0
--- /dev/null
+++ b/src/events/stickerCreate.ts
@@ -0,0 +1,30 @@
+export const event = 'stickerCreate'
+
+export async function callback(client, emoji) {
+    try {
+        const { getAuditLog, log, NucleusColors, entry, renderUser, renderDelta } = emoji.client.logger
+        let auditLog = await getAuditLog(emoji.guild, 'STICKER_CREATE');
+        let audit = auditLog.entries.filter(entry => entry.target.id == emoji.id).first();
+        if (audit.executor.id == client.user.id) return;
+        let data = {
+            meta: {
+                type: 'stickerCreate',
+                displayName: 'Sticker Created',
+                calculateType: 'stickerUpdate',
+                color: NucleusColors.green,
+                emoji: "GUILD.EMOJI.CREATE",
+                timestamp: emoji.createdTimestamp
+            },
+            list: {
+                stickerId: entry(emoji.id, `\`${emoji.id}\``),
+                emoji: entry(emoji.name, `\`:${emoji.name}:\``),
+                createdBy: entry(audit.executor.id, renderUser(audit.executor)),
+                created: entry(emoji.createdTimestamp, renderDelta(emoji.createdTimestamp))
+            },
+            hidden: {
+                guild: emoji.guild.id
+            }
+        }
+        log(data);
+    } catch {}
+}
diff --git a/src/events/stickerDelete.ts b/src/events/stickerDelete.ts
new file mode 100644
index 0000000..7490851
--- /dev/null
+++ b/src/events/stickerDelete.ts
@@ -0,0 +1,31 @@
+export const event = 'stickerDelete'
+
+export async function callback(client, emoji) {
+    try{
+        const { getAuditLog, log, NucleusColors, entry, renderUser, renderDelta } = emoji.client.logger
+        let auditLog = await getAuditLog(emoji.guild, 'STICKER_DELETE');
+        let audit = auditLog.entries.filter(entry => entry.target.id == emoji.id).first();
+        if (audit.executor.id == client.user.id) return;
+        let data = {
+            meta: {
+                type: 'stickerDelete',
+                displayName: 'Sticker Deleted',
+                calculateType: 'stickerUpdate',
+                color: NucleusColors.red,
+                emoji: "GUILD.EMOJI.DELETE",
+                timestamp: audit.createdTimestamp,
+            },
+            list: {
+                stickerId:entry(emoji.id, `\`${emoji.id}\``),
+                sticker: entry(emoji.name, `\`${emoji.name}\``),
+                deletedBy: entry(audit.executor.id, renderUser(audit.executor)),
+                created: entry(emoji.createdTimestamp, renderDelta(emoji.createdTimestamp)),
+                deleted: entry(audit.createdTimestamp, renderDelta(audit.createdTimestamp)),
+            },
+            hidden: {
+                guild: emoji.guild.id
+            }
+        }
+        log(data);
+    } catch {}
+}
diff --git a/src/events/stickerUpdate.ts b/src/events/stickerUpdate.ts
new file mode 100644
index 0000000..7cb745f
--- /dev/null
+++ b/src/events/stickerUpdate.ts
@@ -0,0 +1,34 @@
+export const event = 'stickerUpdate';
+
+export async function callback(client, oe, ne) {
+    try {
+        const { getAuditLog, log, NucleusColors, entry, renderDelta, renderUser, renderEmoji } = client.logger
+
+        if (oe.name == ne.name) return
+        let auditLog = await getAuditLog(ne.guild, 'EMOJI_UPDATE');
+        let audit = auditLog.entries.first();
+        if (audit.executor.id == client.user.id) return;
+
+        let changes = {
+            stickerId:entry(ne.id, `\`${ne.id}\``),
+            edited: entry(ne.createdTimestamp, renderDelta(ne.createdTimestamp)),
+            editedBy: entry(audit.executor.id, renderUser((await ne.guild.members.fetch(audit.executor.id)).user)),
+            name: entry([oe.name, ne.name], `\`:${oe.name}:\` -> \`:${ne.name}:\``),
+        }
+        let data = {
+            meta:{
+                type: 'stickerUpdate',
+                displayName: 'Sticker Edited',
+                calculateType: 'stickerUpdate',
+                color: NucleusColors.yellow,
+                emoji: "GUILD.EMOJI.EDIT",
+                timestamp: audit.createdTimestamp
+            },
+            list: changes,
+            hidden: {
+                guild: ne.guild.id
+            }
+        }
+        log(data);
+    } catch {}
+}
\ No newline at end of file
diff --git a/src/events/threadCreate.ts b/src/events/threadCreate.ts
index 5c65d78..ff69e35 100644
--- a/src/events/threadCreate.ts
+++ b/src/events/threadCreate.ts
@@ -17,7 +17,7 @@
                 timestamp: thread.createdTimestamp
             },
             list: {
-                id: entry(thread.id, `\`${thread.id}\``),
+                threadId:entry(thread.id, `\`${thread.id}\``),
                 name: entry(thread.name, renderChannel(thread)),
                 parentChannel: entry(thread.parentId, renderChannel(thread.parent)),
                 category: entry(thread.parent.parent ? thread.parent.parent.name : 'None', thread.parent.parent ? renderChannel(thread.parent.parent) : 'None'),
diff --git a/src/events/threadDelete.ts b/src/events/threadDelete.ts
index 9507469..14c5820 100644
--- a/src/events/threadDelete.ts
+++ b/src/events/threadDelete.ts
@@ -17,7 +17,7 @@
             timestamp: new Date().getTime()
         },
         list: {
-            id: entry(thread.id, `\`${thread.id}\``),
+            threadId:entry(thread.id, `\`${thread.id}\``),
             name: entry(thread.name, thread.name),
             parentChannel: entry(thread.parentId, renderChannel(thread.parent)),
             category: entry(thread.parent.parent ? thread.parent.parent.name : 'None', thread.parent.parent ? renderChannel(thread.parent.parent) : 'None'),
diff --git a/src/events/threadUpdate.ts b/src/events/threadUpdate.ts
index f554a6c..4e13193 100644
--- a/src/events/threadUpdate.ts
+++ b/src/events/threadUpdate.ts
@@ -8,7 +8,7 @@
         let audit = auditLog.entries.filter(entry => entry.target.id == after.id).first();
         if (audit.executor.id == client.user.id) return;
         let list = {
-            id: entry(after.id, `\`${after.id}\``),
+            threadId:entry(after.id, `\`${after.id}\``),
             thread: entry(after.name, renderChannel(after)),
             parentChannel: entry(after.parentId, renderChannel(after.parent)),
         }
diff --git a/src/events/webhookUpdate.ts b/src/events/webhookUpdate.ts
new file mode 100644
index 0000000..a20608c
--- /dev/null
+++ b/src/events/webhookUpdate.ts
@@ -0,0 +1,78 @@
+import humanizeDuration from 'humanize-duration';
+export const event = 'webhookUpdate'
+
+export async function callback(client, channel) {
+    try {
+        const { getAuditLog, log, NucleusColors, entry, renderUser, renderChannel, renderDelta } = client.logger
+        let auditLogCreate = getAuditLog(channel.guild, 'WEBHOOK_CREATE');
+        let auditLogUpdate = getAuditLog(channel.guild, 'WEBHOOK_UPDATE');
+        let auditLogDelete = getAuditLog(channel.guild, 'WEBHOOK_DELETE');
+        [auditLogCreate, auditLogUpdate, auditLogDelete] = await Promise.all([auditLogCreate, auditLogUpdate, auditLogDelete]);
+        let auditCreate = auditLogCreate.entries.filter(entry => entry.target.channelId == channel.id).first();
+        let auditUpdate = auditLogUpdate.entries.filter(entry => entry.target.channelId == channel.id).first();
+        let auditDelete = auditLogDelete.entries.filter(entry => entry.target.channelId == channel.id).first();
+        if (!auditCreate && !auditUpdate && !auditDelete) return;
+        let audit = auditCreate;
+        let action = "Create";
+        let list = {} as any;
+        if (auditUpdate && auditUpdate.createdTimestamp > audit.createdTimestamp) {
+            let {before, after} = auditUpdate.changes.reduce(
+                (acc, change) => { acc.before[change.key] = change.old; acc.after[change.key] = change.new; return acc; },
+                {before: {}, after: {}}
+            );
+            if (before.name !== after.name) list['name'] = entry([before.name, after.name], `${before.name} -> ${after.name}`)
+            if (before.channel_id !== after.channel_id) list['channel'] = entry([before.channel_id, after.channel_id], renderChannel(await client.channels.fetch(before.channel_id)) + ` -> ` + renderChannel(await client.channels.fetch(after.channel_id)))
+            if (!(Object.keys(list)).length) return;
+            list.created = entry(auditUpdate.target.createdTimestamp, renderDelta(auditUpdate.target.createdTimestamp));
+            list.edited = entry(after.editedTimestamp, renderDelta(new Date().getTime()));
+            list.editedBy = entry(auditUpdate.executor.id, renderUser(auditUpdate.executor));
+            audit = auditUpdate;
+            action = "Update"
+        } else if (auditDelete && auditDelete.createdTimestamp > audit.createdTimestamp) {
+            let {before, after} = auditDelete.changes.reduce(
+                (acc, change) => { acc.before[change.key] = change.old; acc.after[change.key] = change.new; return acc; },
+                {before: {}, after: {}}
+            );
+            list = {
+                name: entry(before.name, `${before.name}`),
+                channel: entry(before.channel_id, renderChannel(await client.channels.fetch(before.channel_id))),
+                created: entry(auditDelete.target.createdTimestamp, renderDelta(auditDelete.target.createdTimestamp)),
+                deleted: entry(new Date().getTime(), renderDelta(new Date().getTime())),
+                deletedBy: entry(auditDelete.executor.id, renderUser((await channel.guild.members.fetch(auditDelete.executor.id)).user)),
+            }
+            audit = auditDelete;
+            action = "Delete"
+        } else {
+            let {before, after} = auditDelete.changes.reduce(
+                (acc, change) => { acc.before[change.key] = change.old; acc.after[change.key] = change.new; return acc; },
+                {before: {}, after: {}}
+            );
+            list = {
+                name: entry(before.name, `${before.name}`),
+                channel: entry(before.channel_id, renderChannel(await client.channels.fetch(before.channel_id))),
+                createdBy: entry(auditCreate.executor.id, renderUser((await channel.guild.members.fetch(auditCreate.executor.id)).user)),
+                created: entry(new Date().getTime(), renderDelta(new Date().getTime())),
+            }
+        }
+        let cols = {
+            "Create": "green",
+            "Update": "yellow",
+            "Delete": "red",
+        }
+        let data = {
+            meta: {
+                type: 'webhook' + action,
+                displayName: `Webhook ${action}d`,
+                calculateType: 'webhookUpdate',
+                color: NucleusColors[cols[action]],
+                emoji: "WEBHOOK." + action.toUpperCase(),
+                timestamp: new Date().getTime()
+            },
+            list: list,
+            hidden: {
+                guild: channel.guild.id
+            }
+        } // TODO
+        log(data);
+    } catch(e) { console.log(e) }
+}