diff --git a/resources/eventsLogger/roleUpdate.js b/resources/eventsLogger/roleUpdate.js index b53256e..8359a0c 100644 --- a/resources/eventsLogger/roleUpdate.js +++ b/resources/eventsLogger/roleUpdate.js @@ -1,7 +1,82 @@ 'use strict'; -async function run(oldRole, newRole) { +const { Role } = require("discord.js"); +const { defaultEventLogEmbed, getAudit, trySend } = require("../functions"); +const getColor = require("../getColor"); +/** + * @param {Role} oldRole + * @param {Role} newRole + */ +async function run(oldRole, newRole) { + const dateNow = new Date() + if (!newRole.guild.DB) await newRole.guild.dbLoad(); + if (!newRole.guild.DB.eventChannels?.role) return; + const logChannel = newRole.guild.channels.cache.get(newRole.guild.DB.eventChannels.role); + if (!logChannel) return; + const emb = defaultEventLogEmbed(newRole.guild) + .setColor(getColor("blue")); + + if (oldRole.name !== newRole.name) { + emb.addField("Name", `Changed from \`${oldRole.name}\` to \`${newRole.name}\``); + }; + if (oldRole.color !== newRole.color) { + emb.setColor(getColor(oldRole.color)); + emb.addField("Color", + `Changed from \`${oldRole.hexColor}\` to \`${newRole.hexColor}\`\n` + + "This embed has the old color. New looks <@&" + newRole.id + ">"); + }; + if (oldRole.hoist !== newRole.hoist) { + emb.addField("Hoisted", newRole.hoist ? "`Yes`" : "`No`"); + }; + if (oldRole.mentionable !== newRole.mentionable) { + emb.addField("Mentionable", newRole.mentionable ? "`Yes`" : "`No`"); + }; + if (oldRole.permissions.bitfield !== newRole.permissions.bitfield) { + const oldSerialized = oldRole.permissions.serialize(), + newSerialized = newRole.permissions.serialize(); + if (!(oldSerialized.ADMINISTRATOR && newSerialized.ADMINISTRATOR)) { + let approved = [], denied = []; + + for (const K in newSerialized) { + if (newSerialized[K] === oldSerialized[K]) continue; + if (newSerialized[K]) approved.push(K); + else denied.push(K); + }; + + emb.addField("Permissions", + ( + approved.length ? + "**Approved:**```js\n" + + approved.join(", ") + + "```" : "" + ) + + ( + denied.length ? + "**Denied:**```js\n" + + denied.join(", ") + + "```" : "" + ) + ); + } + }; + + if (!emb.fields.length) return; + + let audit; + if (newRole.guild.me.hasPermission("VIEW_AUDIT_LOG")) { + audit = await getAudit(newRole.guild, dateNow, newRole.id, { type: "ROLE_UPDATE" }); + }; + + emb.setTitle(`Role \`${newRole.name}\` updated${audit?.executor ? + ` by ${audit.executor.bot ? "`[BOT]` " : "" + }\`${audit.executor.tag}\`` : ""}`) + .addField("Role", "<@&" + newRole.id + ">\n" + + `(${newRole.id})`, true); + if (audit?.executor) { + emb.setAuthor(emb.author.name, audit.executor.displayAvatarURL({ size: 128, format: "png", dynamic: true })) + .addField("Administrator", `<@${audit.executor.id}>\n(${audit.executor.id})`, true); + } return trySend(newRole.client, logChannel, emb); } module.exports = { run } \ No newline at end of file