mirror of
https://github.com/danbulant/Shasha
synced 2026-06-24 17:12:01 +00:00
working channelUpdate logger (?)
This commit is contained in:
parent
2aa77e7a23
commit
f65e7443cf
1 changed files with 139 additions and 104 deletions
|
|
@ -1,6 +1,6 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const { GuildChannel, Guild, GuildAuditLogsEntry } = require("discord.js");
|
const { GuildChannel, Guild, GuildAuditLogsEntry, Role } = require("discord.js");
|
||||||
const { Interval } = require("luxon");
|
const { Interval } = require("luxon");
|
||||||
const { intervalToDuration } = require("../../cmds/moderation/src/duration");
|
const { intervalToDuration } = require("../../cmds/moderation/src/duration");
|
||||||
const { defaultEventLogEmbed, changed, trySend, wait } = require("../functions");
|
const { defaultEventLogEmbed, changed, trySend, wait } = require("../functions");
|
||||||
|
|
@ -12,32 +12,39 @@ let blockChannelUpdate = false;
|
||||||
* @param {GuildChannel} newChannel
|
* @param {GuildChannel} newChannel
|
||||||
*/
|
*/
|
||||||
async function run(oldChannel, newChannel) {
|
async function run(oldChannel, newChannel) {
|
||||||
await wait(4000);
|
|
||||||
const dateNow = new Date();
|
const dateNow = new Date();
|
||||||
if (!newChannel.guild.DB) await newChannel.guild.dbLoad();
|
if (!newChannel.guild.DB) await newChannel.guild.dbLoad();
|
||||||
if (!newChannel.guild.DB.eventChannels?.guild) return;
|
if (!newChannel.guild.DB.eventChannels?.guild) return;
|
||||||
const logChannel = newChannel.guild.channels.cache.get(newChannel.guild.DB.eventChannels.guild);
|
const logChannel = newChannel.guild.channels.cache.get(newChannel.guild.DB.eventChannels.guild);
|
||||||
if (!logChannel) return;
|
if (!logChannel) return;
|
||||||
|
|
||||||
let audit;
|
const diff = newChannel.permissionOverwrites.difference(oldChannel.permissionOverwrites),
|
||||||
|
emb = defaultEventLogEmbed(newChannel.guild);
|
||||||
|
|
||||||
const diff = newChannel.permissionOverwrites.difference(oldChannel.permissionOverwrites);
|
let audit, fetchAudit, fetchOverwrites,
|
||||||
let overwritesUpdates = [];
|
permissionsOverwrites = new Map(),
|
||||||
|
permissionsAdded = new Map(),
|
||||||
|
permissionsRemoved = new Map();
|
||||||
|
|
||||||
for (const [key, val] of newChannel.permissionOverwrites) {
|
for (const [key, val] of newChannel.permissionOverwrites) {
|
||||||
const oldOverwrites = oldChannel.permissionOverwrites.get(key);
|
const oldOverwrites = oldChannel.permissionOverwrites.get(key);
|
||||||
if (!oldOverwrites) continue;
|
if (!oldOverwrites) continue;
|
||||||
if (oldOverwrites?.allow.bitfield !== val.allow.bitfield ||
|
if (oldOverwrites?.allow.bitfield !== val.allow.bitfield ||
|
||||||
oldOverwrites?.deny.bitfield !== val.deny.bitfield) {
|
oldOverwrites?.deny.bitfield !== val.deny.bitfield) {
|
||||||
overwritesUpdates.push({ new: val, old: oldOverwrites });
|
permissionsOverwrites.set(key, { old: oldOverwrites, new: val });
|
||||||
console.log; // BREAKPOINT
|
if (!fetchOverwrites) fetchOverwrites = true;
|
||||||
}
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
const emb = defaultEventLogEmbed(newChannel.guild);
|
if (diff.size) {
|
||||||
let fetchAudit, fetchAR;
|
for (const [key, val] of diff) {
|
||||||
|
const removed = oldChannel.permissionOverwrites.get(key);
|
||||||
|
const added = newChannel.permissionOverwrites.get(key);
|
||||||
|
if (added) permissionsAdded.set(key, added);
|
||||||
|
if (removed) permissionsRemoved.set(key, removed);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
console.log; // BREAKPOINT
|
|
||||||
if (oldChannel.name !== newChannel.name) {
|
if (oldChannel.name !== newChannel.name) {
|
||||||
if (!fetchAudit) fetchAudit = true;
|
if (!fetchAudit) fetchAudit = true;
|
||||||
emb.addField("Name", `Changed from \`${oldChannel.name || "Unknown"}\` to \`${newChannel.name}\``);
|
emb.addField("Name", `Changed from \`${oldChannel.name || "Unknown"}\` to \`${newChannel.name}\``);
|
||||||
|
|
@ -67,6 +74,7 @@ async function run(oldChannel, newChannel) {
|
||||||
if (newChannel.type === "text") {
|
if (newChannel.type === "text") {
|
||||||
if (oldChannel.rateLimitPerUser !== newChannel.rateLimitPerUser) {
|
if (oldChannel.rateLimitPerUser !== newChannel.rateLimitPerUser) {
|
||||||
if (!fetchAudit) fetchAudit = true;
|
if (!fetchAudit) fetchAudit = true;
|
||||||
|
|
||||||
emb.addField("Slowmode",
|
emb.addField("Slowmode",
|
||||||
`Changed from \`${oldChannel.rateLimitPerUser ?
|
`Changed from \`${oldChannel.rateLimitPerUser ?
|
||||||
intervalToDuration(
|
intervalToDuration(
|
||||||
|
|
@ -90,17 +98,98 @@ async function run(oldChannel, newChannel) {
|
||||||
emb.addField("Bitrate", `Changed from \`${oldChannel.bitrate / 1000
|
emb.addField("Bitrate", `Changed from \`${oldChannel.bitrate / 1000
|
||||||
|| "Unknown"} Kbps\` to \`${newChannel.bitrate / 1000} Kbps\``);
|
|| "Unknown"} Kbps\` to \`${newChannel.bitrate / 1000} Kbps\``);
|
||||||
};
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
if (overwritesUpdates.length) {
|
if (diff.size && newChannel.guild.me.hasPermission("VIEW_AUDIT_LOG")) {
|
||||||
for (const overwrite of overwritesUpdates) {
|
let getID, removed, added;
|
||||||
const oldAllow = overwrite.old?.allow.serialize(),
|
|
||||||
oldDeny = overwrite.old?.deny.serialize(),
|
if (permissionsRemoved.size) {
|
||||||
newAllow = overwrite.new.allow.serialize(),
|
audit = await getAudit(newChannel.guild, dateNow, newChannel.id,
|
||||||
newDeny = overwrite.new.deny.serialize(),
|
{ type: "CHANNEL_OVERWRITE_DELETE" });
|
||||||
|
getID = audit.changes[0].old;
|
||||||
|
await wait(4000);
|
||||||
|
}
|
||||||
|
else if (permissionsAdded.size) {
|
||||||
|
await wait(1000);
|
||||||
|
audit = await getAudit(newChannel.guild, dateNow, newChannel.id,
|
||||||
|
{ type: "CHANNEL_OVERWRITE_CREATE" });
|
||||||
|
getID = audit.changes[0].new;
|
||||||
|
added = permissionsAdded.get(getID);
|
||||||
|
};
|
||||||
|
|
||||||
|
if ((audit.extra instanceof Role) ? newChannel.guild.roles.cache.get(getID) :
|
||||||
|
newChannel.guild.member(getID)) {
|
||||||
|
if (audit.action === "CHANNEL_OVERWRITE_DELETE") {
|
||||||
|
for (const [key, val] of permissionsRemoved) {
|
||||||
|
removed = oldChannel.permissionOverwrites.get(key);
|
||||||
|
|
||||||
|
if (blockChannelUpdate &&
|
||||||
|
removed.id === newChannel.guild.DB.settings.mute.role) return;
|
||||||
|
|
||||||
|
const allow = removed.allow.serialize(),
|
||||||
|
deny = removed.deny.serialize();
|
||||||
|
let all = [], den = [];
|
||||||
|
|
||||||
|
for (const K in allow) {
|
||||||
|
if (!allow[K]) continue;
|
||||||
|
all.push(K);
|
||||||
|
};
|
||||||
|
for (const K in deny) {
|
||||||
|
if (!deny[K]) continue;
|
||||||
|
den.push(K);
|
||||||
|
};
|
||||||
|
|
||||||
|
emb.addField(`Removed override`,
|
||||||
|
`**For ${removed.type}** ${removed.type === "member" ?
|
||||||
|
`<@${removed.id}> (${removed.id})` :
|
||||||
|
removed.id === newChannel.guild.id ?
|
||||||
|
"@everyone" : `<@&${removed.id}> (${removed.id})`
|
||||||
|
}\n` +
|
||||||
|
"**Approved:**```js\n" + (all.join(", ") || "NONE") + "```" +
|
||||||
|
"**Denied:**```js\n" + (den.join(", ") || "NONE") + "```");
|
||||||
|
}
|
||||||
|
} else if (audit.action === "CHANNEL_OVERWRITE_CREATE") {
|
||||||
|
if (blockChannelUpdate &&
|
||||||
|
added.id === newChannel.guild.DB.settings.mute.role) return;
|
||||||
|
|
||||||
|
const allow = added.allow.serialize(), deny = added.deny.serialize();
|
||||||
|
let all = [], den = [];
|
||||||
|
|
||||||
|
for (const K in allow) {
|
||||||
|
if (!allow[K]) continue;
|
||||||
|
all.push(K);
|
||||||
|
};
|
||||||
|
for (const K in deny) {
|
||||||
|
if (!deny[K]) continue;
|
||||||
|
den.push(K);
|
||||||
|
};
|
||||||
|
|
||||||
|
emb.addField(`Added override`,
|
||||||
|
`**For ${added.type}** ${added.type === "member" ?
|
||||||
|
`<@${added.id}> (${added.id})` :
|
||||||
|
added.id === newChannel.guild.id ?
|
||||||
|
"@everyone" : `<@&${added.id}> (${added.id})`
|
||||||
|
}\n` +
|
||||||
|
"**Approved:**```js\n" + (all.join(", ") || "NONE") + "```" +
|
||||||
|
"**Denied:**```js\n" + (den.join(", ") || "NONE") + "```");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (fetchOverwrites && newChannel.guild.me.hasPermission("VIEW_AUDIT_LOG")) {
|
||||||
|
await wait(1000);
|
||||||
|
audit = await getAudit(newChannel.guild, dateNow, newChannel.id,
|
||||||
|
{ type: "CHANNEL_OVERWRITE_UPDATE" });
|
||||||
|
if (audit.target.id === newChannel.id) {
|
||||||
|
const val = permissionsOverwrites.entries().next().value[1];
|
||||||
|
|
||||||
|
const oldAllow = val.old.allow.serialize(),
|
||||||
|
oldDeny = val.old.deny.serialize(),
|
||||||
|
newAllow = val.new.allow.serialize(),
|
||||||
|
newDeny = val.new.deny.serialize(),
|
||||||
allowDiff = changed(oldAllow, newAllow),
|
allowDiff = changed(oldAllow, newAllow),
|
||||||
denyDiff = changed(oldDeny, newDeny);
|
denyDiff = changed(oldDeny, newDeny);
|
||||||
|
|
||||||
let allowBefore = [], allowAfter = [], denyBefore = [], denyAfter = [], neutral = [];
|
let allowBefore = [], allowAfter = [], denyBefore = [], denyAfter = [], neutral = [];
|
||||||
for (const u in allowDiff.oldObj) {
|
for (const u in allowDiff.oldObj) {
|
||||||
if (!allowDiff.oldObj[u]) continue;
|
if (!allowDiff.oldObj[u]) continue;
|
||||||
|
|
@ -118,6 +207,7 @@ async function run(oldChannel, newChannel) {
|
||||||
if (!denyDiff.newObj[u]) continue;
|
if (!denyDiff.newObj[u]) continue;
|
||||||
denyAfter.push(u);
|
denyAfter.push(u);
|
||||||
};
|
};
|
||||||
|
|
||||||
for (const U in newAllow) {
|
for (const U in newAllow) {
|
||||||
if (
|
if (
|
||||||
!newAllow[U] &&
|
!newAllow[U] &&
|
||||||
|
|
@ -134,106 +224,49 @@ async function run(oldChannel, newChannel) {
|
||||||
) neutral.push(U);
|
) neutral.push(U);
|
||||||
else continue;
|
else continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
emb.addField(`Changed override`,
|
emb.addField(`Changed override`,
|
||||||
`**For ${overwrite.new.type}** ${overwrite.new.type === "member" ?
|
`**For ${val.new.type}** ${val.new.type === "member" ?
|
||||||
`<@${overwrite.new.id}> (${overwrite.new.id})` :
|
`<@${val.new.id}> (${val.new.id})` :
|
||||||
overwrite.new.id === newChannel.guild.id ?
|
val.new.id === newChannel.guild.id ?
|
||||||
"@everyone" : `<@&${overwrite.new.id}> (${overwrite.new.id})`
|
"@everyone" : `<@&${val.new.id}> (${val.new.id})`
|
||||||
}\n` +
|
}\n` +
|
||||||
(
|
(
|
||||||
(allowBefore.length || allowAfter.length) ?
|
allowBefore.length ?
|
||||||
"**Approved before:**```js\n" +
|
"**Approved before:**```js\n" +
|
||||||
(allowBefore.join(", ") || "NONE") +
|
allowBefore.join(", ") +
|
||||||
"```**Currently approved:**```js\n" +
|
"```" : ""
|
||||||
(allowAfter.join(", ") || "NONE") +
|
) +
|
||||||
|
(
|
||||||
|
denyBefore.length ?
|
||||||
|
"** Denied before:** ```js\n" +
|
||||||
|
denyBefore.join(", ") +
|
||||||
"```" : ""
|
"```" : ""
|
||||||
) +
|
) +
|
||||||
(
|
(
|
||||||
neutral.length ?
|
neutral.length ?
|
||||||
"**Defaulted:**```js\n" + neutral.join(", ") + "```" : ""
|
"**Defaulted:**```js\n" + neutral.join(", ") +
|
||||||
|
"```" : ""
|
||||||
) +
|
) +
|
||||||
(
|
(
|
||||||
(denyBefore.length || denyAfter.length) ?
|
allowAfter.length ?
|
||||||
"**Denied before:**```js\n" +
|
"**Approved:**```js\n" +
|
||||||
(denyBefore.join(", ") || "NONE") +
|
allowAfter.join(", ") +
|
||||||
"```**Currently denied:**```js\n" +
|
"```" : ""
|
||||||
(denyAfter.join(", ") || "NONE") +
|
) +
|
||||||
|
(
|
||||||
|
denyAfter.length ?
|
||||||
|
"**Denied:**```js\n" +
|
||||||
|
denyAfter.join(", ") +
|
||||||
"```" : ""
|
"```" : ""
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
console.log; // BREAKPOINT
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if (diff.size) {
|
if (fetchAudit && !audit && newChannel.guild.me.hasPermission("VIEW_AUDIT_LOG")) {
|
||||||
for (const [key, val] of diff) {
|
audit = await getAudit(newChannel.guild, dateNow, newChannel.id,
|
||||||
const removed = oldChannel.permissionOverwrites.get(key);
|
{ type: "CHANNEL_UPDATE" });
|
||||||
const added = newChannel.permissionOverwrites.get(key);
|
|
||||||
if (!newChannel.guild.roles.cache.get((removed || added).id)) continue;
|
|
||||||
if (removed) {
|
|
||||||
if (blockChannelUpdate && removed.id === newChannel.guild.DB.settings.mute.role) return;
|
|
||||||
if (!fetchAR) fetchAR = "R";
|
|
||||||
const allow = removed.allow.serialize(), deny = removed.deny.serialize();
|
|
||||||
let all = [], den = [];
|
|
||||||
for (const K in allow) {
|
|
||||||
if (!allow[K]) continue;
|
|
||||||
all.push(K);
|
|
||||||
};
|
|
||||||
for (const K in deny) {
|
|
||||||
if (!deny[K]) continue;
|
|
||||||
den.push(K);
|
|
||||||
};
|
|
||||||
emb.addField(`Removed override`, `**For ${removed.type}** ${removed.type === "member" ?
|
|
||||||
`<@${removed.id}> (${removed.id})` :
|
|
||||||
removed.id === newChannel.guild.id ?
|
|
||||||
"@everyone" : `<@&${removed.id}> (${removed.id})`
|
|
||||||
}\n` +
|
|
||||||
"**Approved:**```js\n" + (all.join(", ") || "NONE") + "```" +
|
|
||||||
"**Denied:**```js\n" + (den.join(", ") || "NONE") + "```");
|
|
||||||
console.log; // BREAKPOINT
|
|
||||||
} else if (added) {
|
|
||||||
if (blockChannelUpdate && added.id === newChannel.guild.DB.settings.mute.role) return;
|
|
||||||
if (!fetchAR) fetchAR = "A";
|
|
||||||
const allow = added.allow.serialize(), deny = added.deny.serialize();
|
|
||||||
let all = [], den = [];
|
|
||||||
for (const K in allow) {
|
|
||||||
if (!allow[K]) continue;
|
|
||||||
all.push(K);
|
|
||||||
};
|
|
||||||
for (const K in deny) {
|
|
||||||
if (!deny[K]) continue;
|
|
||||||
den.push(K);
|
|
||||||
};
|
|
||||||
emb.addField(`Added override`, `**For ${added.type}** ${added.type === "member" ?
|
|
||||||
`<@${added.id}> (${added.id})` :
|
|
||||||
added.id === newChannel.guild.id ?
|
|
||||||
"@everyone" : `<@&${added.id}> (${added.id})`
|
|
||||||
}\n` +
|
|
||||||
"**Approved:**```js\n" + (all.join(", ") || "NONE") + "```" +
|
|
||||||
"**Denied:**```js\n" + (den.join(", ") || "NONE") + "```");
|
|
||||||
console.log; // BREAKPOINT
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if (newChannel.guild.me.hasPermission("VIEW_AUDIT_LOG")) {
|
|
||||||
if (!audit && overwritesUpdates.length) {
|
|
||||||
audit = await getAudit(newChannel.guild, dateNow, newChannel.id, { type: "CHANNEL_OVERWRITE_UPDATE" });
|
|
||||||
};
|
|
||||||
if (!audit && fetchAudit) {
|
|
||||||
audit = await getAudit(newChannel.guild, dateNow, newChannel.id, { type: "CHANNEL_UPDATE" });
|
|
||||||
};
|
|
||||||
if (!audit && fetchAR) {
|
|
||||||
/**
|
|
||||||
* @type {import("discord.js").GuildAuditLogsFetchOptions}
|
|
||||||
*/
|
|
||||||
let opt = {};
|
|
||||||
switch (fetchAR) {
|
|
||||||
case "A": opt.type = "CHANNEL_OVERWRITE_CREATE"; break;
|
|
||||||
case "R": opt.type = "CHANNEL_OVERWRITE_DELETE"; break;
|
|
||||||
};
|
|
||||||
audit = await getAudit(newChannel.guild, dateNow, newChannel.id, opt);
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
emb.setTitle((newChannel.type === "voice" ? "Voice " : "") +
|
emb.setTitle((newChannel.type === "voice" ? "Voice " : "") +
|
||||||
|
|
@ -245,13 +278,15 @@ async function run(oldChannel, newChannel) {
|
||||||
.addField((newChannel.type === "voice" ? "Voice " : "") +
|
.addField((newChannel.type === "voice" ? "Voice " : "") +
|
||||||
(newChannel.type === "category" ? "Category" : "Channel"),
|
(newChannel.type === "category" ? "Category" : "Channel"),
|
||||||
`<#${newChannel.id}>\n(${newChannel.id})`, true);
|
`<#${newChannel.id}>\n(${newChannel.id})`, true);
|
||||||
|
|
||||||
if (emb.fields.length < 2) return;
|
if (emb.fields.length < 2) return;
|
||||||
|
|
||||||
if (audit?.executor) {
|
if (audit?.executor) {
|
||||||
emb.setAuthor(emb.author.name, audit.executor.displayAvatarURL({ size: 128, format: "png", dynamic: true }))
|
emb.setAuthor(emb.author.name, audit.executor.displayAvatarURL({ size: 128, format: "png", dynamic: true }))
|
||||||
.addField("Administrator", `<@${audit.executor.id}>\n(${audit.executor.id})`, true);
|
.addField("Administrator", `<@${audit.executor.id}>\n(${audit.executor.id})`, true);
|
||||||
if (audit.executor.bot) emb.addField("", audit.reason || "No reason provided");
|
if (audit.executor.bot) emb.addField("", audit.reason || "No reason provided");
|
||||||
}
|
};
|
||||||
console.log; // BREAKPOINT
|
|
||||||
return trySend(newChannel.client, logChannel, emb);
|
return trySend(newChannel.client, logChannel, emb);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue