diff --git a/cmds/moderation/src/createSchedule.js b/cmds/moderation/src/createSchedule.js index 9bc2db6..3b98c48 100644 --- a/cmds/moderation/src/createSchedule.js +++ b/cmds/moderation/src/createSchedule.js @@ -17,7 +17,6 @@ let jobManager, async function createSchedule(client, { guildID, userID, type, until }) { if (!client || !guildID || !userID || !type || !until) throw new TypeError("Undefined params!"); const CHK = new Date().valueOf(); - if (until.valueOf() < CHK) throw new RangeError("Schedule should be in the future! Not in the past!"); if (!jobManager) await init(client); if (typeof until === "string") until = new Date(until); const NAME = [guildID, userID, type].join("/"), @@ -39,6 +38,10 @@ async function createSchedule(client, { guildID, userID, type, until }) { if ((until.valueOf() - CHK) < new Date(24 * 60 * 60 * 1000)) { jobManager.add(SC); jobManager.start(NAME); + if (until.valueOf() < CHK) { + console.log("RUNNING IMMEDIATELY"); + jobManager.run(NAME); + } } await col.updateOne({ document: NAME }, { $set: SC, $setOnInsert: { document: NAME } }, { upsert: true }); return console.log("SCHEDULE " + NAME + " CREATED"); diff --git a/cmds/moderation/src/targetUser.js b/cmds/moderation/src/targetUser.js index bf0f4e9..8bbb1e9 100644 --- a/cmds/moderation/src/targetUser.js +++ b/cmds/moderation/src/targetUser.js @@ -11,7 +11,7 @@ const { cleanMentionID, findMemberRegEx } = require("../../../resources/function * @returns {Promise<{ targetUser: User[], resultMsg: string }>} */ module.exports = async (msg, mentions = [], targetUser = [], resultMsg = "") => { - if (mentions.length === 0) throw new TypeError("Mentions has no length"); + if (!mentions.length) return { targetUser, resultMsg }; for (const usermention of mentions) { if (usermention.trim().length < 1) continue; let found = [], diff --git a/resources/eventsLogger/guildBanAdd.js b/resources/eventsLogger/guildBanAdd.js index 08554ca..b1be3e4 100644 --- a/resources/eventsLogger/guildBanAdd.js +++ b/resources/eventsLogger/guildBanAdd.js @@ -1,17 +1,27 @@ 'use strict'; +const { Guild, User } = require("discord.js"); const { getChannel, defaultEventLogEmbed, trySend } = require("../functions"); const getColor = require("../getColor"); +/** + * @param {Guild} GUILD + * @param {User} USER + * @returns + */ module.exports = async (GUILD, USER) => { if (GUILD.DB.settings.eventChannels?.ban) { if (USER.partial) USER = await USER.fetch(); const log = getChannel(GUILD, GUILD.DB.settings.eventChannels.ban); if (!log) return; const emb = defaultEventLogEmbed(GUILD); + let audit; + if (GUILD.member(GUILD.client.user).hasPermission("VIEW_AUDIT_LOG")) { + audit = (await GUILD.fetchAuditLogs({ limit: 1, type: "MEMBER_BAN_ADD" })).entries.first().executor; + } const rea = (await GUILD.fetchBan(USER)).reason; - emb.setDescription(rea ?? "No reason provided") - .setTitle(`\`${USER.tag}\` banned`) + emb.setDescription(rea || "No reason provided") + .setTitle(`\`${USER.tag}\` banned` + (audit ? ` by \`${audit.tag}\`` : "")) .setColor(getColor("red")) .setThumbnail(USER.displayAvatarURL({ size: 4096, format: "png", dynamic: true })) .addField("User", `<@${USER.id}>\n(${USER.id})`); diff --git a/resources/eventsLogger/guildMemberUpdate.js b/resources/eventsLogger/guildMemberUpdate.js index fef5119..e79feb0 100644 --- a/resources/eventsLogger/guildMemberUpdate.js +++ b/resources/eventsLogger/guildMemberUpdate.js @@ -9,7 +9,7 @@ const getColor = require("../getColor"); * @param {GuildMember} membernew * @returns */ -module.exports = (memberold, membernew) => { +module.exports = async (memberold, membernew) => { const NEWAV = membernew.user.displayAvatarURL({ format: "png", size: 4096, dynamic: true }); if (!membernew.guild.DB.eventChannels?.memberRole && !membernew.guild.DB.eventChannels?.member) { if (membernew.user.DB.cachedAvatarURL != NEWAV) { @@ -20,25 +20,42 @@ module.exports = (memberold, membernew) => { let log, thumbMes = ""; const emb = defaultEventLogEmbed(membernew.guild), oldT = memberold.toJSON().displayAvatarURL; const oldAV = membernew.user.DB.cachedAvatarURL || oldT; - emb.setAuthor(emb.author.name, NEWAV) - .setTitle("Profile `" + memberold.user.tag + "` updated") - .setColor(getColor("blue")); if (oldAV) thumbMes += "This embed's thumbnail is the user's old avatar.\n"; + let audit; if (membernew.guild.DB.eventChannels?.memberRole) { log = getChannel(membernew, membernew.guild.DB.eventChannels.memberRole); + if (membernew.guild.member(membernew.client.user).hasPermission("VIEW_AUDIT_LOG")) { + audit = (await membernew.guild.fetchAuditLogs({ limit: 1, type: "MEMBER_ROLE_UPDATE" })).entries.first().executor; + } if (membernew.roles.cache.size > memberold.roles.cache.size) { - emb.addField("Role added", ("<@&" + membernew.roles.cache.difference(memberold.roles.cache).sort((a, b) => b.position - a.position).map(r => r.id).join(">, <@&") + ">").slice(0, 2048)) - .setDescription("**Old roles**\n" + (memberold.roles.cache.size > 1 ? "<@&" + memberold.roles.cache.sort((a, b) => b.position - a.position).map(r => r.id).slice(0, -1).join(">, <@&") + ">" : "`[NONE]`")); + const use = membernew.roles.cache.difference(memberold.roles.cache).sort((a, b) => b.position - a.position).map(r => r.id); + const use2 = memberold.roles.cache.sort((a, b) => b.position - a.position).map(r => r.id).slice(0, -1); + + emb.addField(`Role${membernew.roles.cache.size > 2 ? "s" : ""} added`, + ("<@&" + use.slice(0, 39).join(">, <@&") + ">" + (use.length > 39 ? ` and ${use.slice(39).length} more...` : ""))) + + .setDescription(`**Old role${memberold.roles.cache.size > 2 ? "s" : ""}**\n` + (memberold.roles.cache.size > 1 ? "<@&" + + use2.slice(0, 82).join(">, <@&") + ">" + (use2.length > 82 ? ` and ${use2.slice(82).length} more...` : "") : "`[NONE]`")); } if (membernew.roles.cache.size < memberold.roles.cache.size) { - emb.addField("Role removed", ("<@&" + memberold.roles.cache.difference(membernew.roles.cache).sort((a, b) => b.position - a.position).map(r => r.id).join(">, <@&") + ">").slice(0, 2048)) - .setDescription("**Current roles**\n" + (membernew.roles.cache.size > 1 ? "<@&" + membernew.roles.cache.sort((a, b) => b.position - a.position).map(r => r.id).slice(0, -1).join(">, <@&") + ">" : "`[NONE]`")); + const use = memberold.roles.cache.difference(membernew.roles.cache).sort((a, b) => b.position - a.position).map(r => r.id); + const use2 = membernew.roles.cache.sort((a, b) => b.position - a.position).map(r => r.id).slice(0, -1); + + emb.addField(`Role${memberold.roles.cache.size > 2 ? "s" : ""} removed`, + ("<@&" + use.slice(0, 39).join(">, <@&") + ">" + (use.length > 39 ? ` and ${use.slice(39).length} more...` : ""))) + + .setDescription(`**Current role${membernew.roles.cache.size > 2 ? "s" : ""}**\n` + (membernew.roles.cache.size > 1 ? "<@&" + + use2.slice(0, 82).join(">, <@&") + ">" + (use2.length > 82 ? ` and ${use2.slice(82).length} more...` : "") : "`[NONE]`")); } } if (membernew.guild.DB.eventChannels?.member && membernew.roles.cache.size === memberold.roles.cache.size) { log = getChannel(membernew, membernew.guild.DB.eventChannels.member); if (membernew.displayName !== memberold.displayName) { - emb.addField("Nickname", "Changed from `" + memberold.displayName + "` to `" + membernew.displayName + "`"); + if (membernew.guild.member(membernew.client.user).hasPermission("VIEW_AUDIT_LOG")) { + audit = (await membernew.guild.fetchAuditLogs({ limit: 1, type: "MEMBER_UPDATE" })).entries.first().executor; + } + emb.addField("Current Nickname", "`" + membernew.displayName + "`") + .addField("Original Nickname", "`" + memberold.displayName + "`") } if (membernew.user.DB.cachedAvatarURL !== NEWAV) { emb @@ -47,6 +64,10 @@ module.exports = (memberold, membernew) => { if (oldAV) emb.setThumbnail(oldAV); } } + emb.setAuthor(emb.author.name, NEWAV) + .setTitle("Profile `" + memberold.user.tag + "` updated" + + (audit ? ` by \`${audit.tag}\`` : "")) + .setColor(getColor("blue")); membernew.user.DB.cachedAvatarURL = NEWAV; membernew.user.setDb("cachedAvatarURL", membernew.user.DB.cachedAvatarURL); if (!emb.fields || emb.fields.length === 0) return; diff --git a/resources/eventsLogger/messageDelete.js b/resources/eventsLogger/messageDelete.js index 8add7d0..131d0be 100644 --- a/resources/eventsLogger/messageDelete.js +++ b/resources/eventsLogger/messageDelete.js @@ -18,8 +18,12 @@ module.exports = async (msg) => { const log = getChannel(msg, msg.guild.DB.eventChannels.mesDel?.channel); if (!log || !msg.author) return; const emb = defaultEventLogEmbed(msg.guild); + let audit; + if (msg.guild.member(msg.client.user).hasPermission("VIEW_AUDIT_LOG")) { + audit = (await msg.guild.fetchAuditLogs({ limit: 1, type: "MESSAGE_DELETE" })).entries.first().executor; + } emb.setColor(getColor("yellow")) - .setTitle((!msg.webhookID ? "Message " + msg.id : "Webhook " + msg.webhookID) + " deleted") + .setTitle((!msg.webhookID ? "Message " + msg.id : "Webhook " + msg.webhookID) + " deleted" + (audit ? ` by \`${audit.tag}\`` : "")) .setDescription(msg.content.length > 0 ? msg.content : "`[EMPTY]`") .setAuthor(emb.author.name, msg.author?.displayAvatarURL({ format: "png", size: 128, dynamic: true })) .addField("Author", `<@!${msg.author?.id}>\n\`${msg.author?.tag}\`\n(${msg.author?.id})`, true)